JAVA——構建以檔案為儲存實體的虛擬物理磁碟類
Maven
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
解決方案
package cn.edu.zstu.fms.storage;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
/**
* @author ShenTuZhiGang
* @version 1.0.0
* @date 2020-12-30 00:46
*/
@Data
@Slf4j
public class PhysicalVirtualDisk extends MyVirtualDick {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 虛擬磁碟目錄
*/
private static final String VIRTUAL_DISK_FILE_PATH = "." + File.separator + "dir" + File.separator + "pvd";
/**
* 虛擬磁碟檔案
*/
private File file=new File(VIRTUAL_DISK_FILE_PATH);
/**
*
*/
private RandomAccessFile data = null;
/**
* 運用單例模式得到當前磁碟例項
*
*/
private static PhysicalVirtualDisk disk = new PhysicalVirtualDisk();
{
this.SECTOR_SUM = 1024;
this.SECTOR_BYTE_NUM = 512;
this.MEDIA_DESCRIPTOR = (byte)0xF8;
}
private PhysicalVirtualDisk() {
log.info("物理磁碟初始化");
if(!file.exists()){
log.info("The file system doesn't exist, and then it will be created by format().");
try {
File fileParent = file.getParentFile();//返回的是File型別,可以呼叫exsit()等方法
if((fileParent.exists() || fileParent.mkdirs()) && file.createNewFile()){
//this.data = new RandomAccessFile(file,"rw");
DiskBlock whiteBlock = new DiskBlock();
whiteBlock.setData(new byte[SECTOR_BYTE_NUM]);
for(int i=0; i<SECTOR_SUM; i++){
this.set(i,whiteBlock);
}
log.info("虛擬物理磁碟建立成功");
}else {
log.error("虛擬物理磁碟建立失敗");
throw new RuntimeException("虛擬物理磁碟建立失敗");
}
} catch (IOException e) {
log.error("虛擬物理磁碟建立失敗");
e.printStackTrace();
}
}
log.info("虛擬物理磁碟載入完成");
}
public static synchronized PhysicalVirtualDisk getInstance() {
return disk;
}
/**
* 獲取磁碟塊
* @param id 磁碟塊號
* @return 磁碟塊
*/
@Override
public synchronized DiskBlock get(int id) throws IOException {
byte[] res = new byte[SECTOR_BYTE_NUM];
try {
log.info("正在讀取第【" + id+ "】扇區");
this.data = new RandomAccessFile(file,"r");
this.data.seek(id * SECTOR_BYTE_NUM);
this.data.read(res);
} catch (FileNotFoundException e) {
log.error("虛擬物理磁碟檔案不存在");
e.printStackTrace();
return null;
}finally {
if(this.data != null){
try {
this.data.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
DiskBlock block = new DiskBlock();
block.setData(res);
return block;
}
/**
* 儲存磁碟塊
* @param id 磁碟塊號
* @param block 磁碟塊
* @return 是否儲存成功
*/
@Override
public synchronized Boolean set(int id ,DiskBlock block) throws IOException {
try {
log.info("正在寫入第【" + id+ "】扇區");
this.data = new RandomAccessFile(file,"rw");
this.data.seek(id * SECTOR_BYTE_NUM);
this.data.write(block.getData());
} catch (FileNotFoundException e) {
log.error("虛擬物理磁碟檔案不存在");
e.printStackTrace();
return false;
}finally {
if(this.data != null){
try {
this.data.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
}
package cn.edu.zstu.fms.storage;
import java.io.IOException;
import java.io.Serializable;
/**
* @author ShenTuZhiGang
* @version 1.0.0
* @date 2020-12-30 02:27
*/
public abstract class MyVirtualDick implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 扇區總數
*/
public Integer SECTOR_SUM = 1024;
/**
* 每扇區位元組數
*/
public Short SECTOR_BYTE_NUM = 512;
/**
* 介質描述符
*/
public Byte MEDIA_DESCRIPTOR = (byte)0xF8;
abstract DiskBlock get(int id) throws IOException;
abstract Boolean set(int id ,DiskBlock block) throws IOException;
}
參考文章
相關文章
- Java虛擬機器——類檔案結構Java虛擬機
- Linux物理儲存結構以及磁碟劃分Linux
- Java虛擬機器,類檔案結構深度解析Java虛擬機
- Java虛擬機器之Class類檔案結構Java虛擬機
- Vsan分散式儲存架構虛擬機器磁碟檔案丟失資料恢復過程分散式架構虛擬機資料恢復
- 深入理解Java虛擬機器(類檔案結構)Java虛擬機
- 深入理解Java虛擬機器 – 類檔案結構Java虛擬機
- 深入學習Java虛擬機器——類檔案結構Java虛擬機
- 04 磁碟儲存和檔案系統
- 類檔案結構——深入理解Java虛擬機器 筆記三Java虛擬機筆記
- 深入理解虛擬機器之類檔案結構虛擬機
- 軟體管理,磁碟儲存,檔案系統以及網路協議協議
- 20932虛擬儲存器
- 【Vsan資料恢復】非正常關機導致vsan儲存架構中虛擬機器磁碟檔案丟失的資料恢復資料恢復架構虛擬機
- Java 虛擬機器之五:Java位元組碼檔案結構Java虛擬機
- 【Vsan資料恢復】斷電導致Vsan分散式儲存虛擬磁碟檔案丟失的資料恢復案例資料恢復分散式
- 塊儲存 檔案儲存 物件儲存物件
- 如何構建虛擬世界的價值體系虛擬世界
- Java 虛擬機器之三:Java虛擬機器的記憶體結構Java虛擬機記憶體
- 檔案儲存
- 資料儲存--檔案儲存
- Nginx|構建簡單的檔案伺服器(mac) 續-FastDFS安裝(mac)|檔案儲存方案Nginx伺服器MacAST
- MySQL的物理儲存結構和session過程MySqlSession
- 【計組】3.7 虛擬儲存器
- 第5章 虛擬儲存器
- Ubuntu 新增虛擬記憶體檔案Ubuntu記憶體
- JVM虛擬機器Class類檔案研究分析JVM虛擬機
- Eq PS6100儲存不可用恢復虛擬機器檔案成功案例虛擬機
- 類檔案結構_class類檔案的的結構
- Seven 儲存結構與磁碟劃分
- PG的物理儲存結構、版本控制、空間回收
- 基於Ceph物件儲存構建實踐物件
- 儲存json檔案JSON
- CSV檔案儲存
- Android 檔案儲存Android
- Android中的資料儲存之檔案儲存Android
- IPFS的檔案儲存模式模式
- Esxi 6.7基於已有資料儲存配置虛擬機器(Linux類)間共享儲存(非RDM)虛擬機Linux