Java的簡單理解(25)---(隨機訪問檔案)RandomAccessFile
RandomAccessFile
/**
* 檔案的分割
* 1. 分割的塊數 n塊
* 2. 每一塊的大小 blocksize
* 3. 最後:總的檔案大小 - (n - 1) * blocksize
*/
public void test(){
try {
File file = new File("E:/xp/test/a.txt");
RandomAccessFile rnd = new RandomAccessFile(file,"r");
rnd.seek(10);
byte[] car = new byte[1024];
int len = 0;
while ((len = rnd.read(car)) != -1) {
if (len >= 200) {
System.out.println(new String(car,0,120));
} else {
System.out.println(new String(car,0,len));
}
}
rnd.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
檔案分割的思路
- 第一步:分割的準備
- 塊數
- 確定每塊大小
- 每塊的名稱
- 第二步
- 分割
- 第幾塊,每塊的起點,實際大小
- 檔案分割
public class SplitFile {
// 檔案的路徑
private String filePath;
// 檔名
private String fileName;
// 檔案大小
private long length;
// 塊數
private int size;
// 每塊的大小
private long blockSize;
// 每塊的名稱
private List<String> blockPath;
public SplitFile() {
blockPath = new ArrayList<>();
}
public SplitFile(String filePath) {
this(filePath,1024);
}
public SplitFile(String filePath,long blockSize){
this();
this.filePath = filePath;
this.blockSize = blockSize;
init();
}
/**
* 初始化操作,計算塊數,確定檔名
*/
public void init() {
File src = null;
if (filePath == null || !((src = new File(filePath)).exists())){
return;
}
if (src.isDirectory()) {
return;
}
// 檔名
this.fileName = src.getName();
// 檔案的實際大小
this.length = src.length();
// 修正每塊大小
if (this.blockSize > length) {
this.blockSize = length;
}
// 確定塊數
size = (int) Math.ceil(length * 1.0 / this.blockSize);
}
/**
* 確定檔名
*/
public void initPathName(String destPath) {
for (int i = 0; i < size; i++){
this.blockPath.add(destPath + "/" + this.fileName + ".part" + i);
}
}
/**
* 檔案的分割
* @param destPath 分割檔案存放目錄
*/
public void split(String destPath){
// 確定檔案的路徑
initPathName(destPath);
long beginPos = 0;// 起始點
long actualBlockSize = blockSize;//實際大小
// 計算所有塊的大小
for (int i = 0; i < size; i++) {
if (i == size - 1){
actualBlockSize = this.length - beginPos;
}
spiltDetail(i,beginPos,actualBlockSize);
beginPos = beginPos + actualBlockSize;
}
}
/**
* 檔案的分割 輸入 輸出
* 檔案的拷貝
* @param idx 第幾塊
* @param beginPos 起始點
* @param actualBlockSize 實際大小
*/
public void spiltDetail(int idx,long beginPos,long actualBlockSize){
// 1. 建立源
File src = new File(this.filePath);
// 2. 目標檔案
File dest = new File(this.blockPath.get(idx));
// 3. 選擇流
RandomAccessFile raf = null;
BufferedOutputStream bos = null;
try {
raf = new RandomAccessFile(src,"r");
bos = new BufferedOutputStream(new FileOutputStream(dest));
// 讀取檔案
raf.seek(beginPos);
// 快取
byte[] flush = new byte[1024];
// 接收長度
int len = 0;
while (-1 != (len = raf.read(flush))) {
// 寫出
if (actualBlockSize - len >= 0) {
bos.write(flush,0,len);
actualBlockSize = actualBlockSize - len;
} else {
bos.write(flush,0, (int) actualBlockSize);
break;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bos.close();
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
合併檔案的兩種方法
1.
public void mergeFile1(String destPath) {
// 建立源
File dest = new File(destPath);
// 選擇流
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(dest,true)); // true: 追加而不是替換
for (int i = 0; i < this.blockPath.size(); i++) {
bis = new BufferedInputStream(new FileInputStream(new File(blockPath.get(i))));
// 緩衝區
byte[] flush = new byte[1024];
// 接收長度
int len = 0;
while ((len = bis.read(flush)) != -1) {
bos.write(flush,0,len);
}
bos.flush();
bis.close();
bos.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2.
public void mergeFile2(String destPath) {
// 建立源
File file = new File(destPath);
// 選擇流
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
SequenceInputStream sis = null;
// 建立一個容器
Vector<InputStream> vector = new Vector<>();
for (int i = 0; i < this.blockPath.size(); i++){
try {
vector.add(new BufferedInputStream(new FileInputStream(new File(blockPath.get(i)))));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
try {
bos = new BufferedOutputStream(new FileOutputStream(file,true));
sis = new SequenceInputStream(vector.elements());
byte[] flush = new byte[1024];
int len = 0;
while ((len = sis.read(flush)) != -1) {
bos.write(flush,0,len);
}
bos.flush();
bos.close();
bis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
相關文章
- [java IO流]之 隨機訪問檔案(RandomAccessFile類)Java隨機randomMac
- 關於檔案讀寫使用RandomAccessFile類的一些簡單操作randomMac
- Java斷點續傳(基於socket與RandomAccessFile的簡單實現)Java斷點randomMac
- Java的簡單理解(2)Java
- C 語言標頭檔案作用的簡單理解
- 簡單的Bindservice服務獲取隨機數,需要在清單檔案中註冊service隨機
- 簡單的:Div隨機顏色隨機
- 生成固定大小的隨機檔案隨機
- GFS(谷歌檔案系統)的JAVA簡單實現谷歌Java
- 手機將PDF檔案壓縮的簡單方法
- java介面和抽象類的簡單理解Java抽象
- Java的簡單理解(22)---處理流Java
- ElasticSearch7.10的單機https訪問ElasticsearchHTTP
- ios訪問win10共享檔案的操作步驟_ios如何訪問win10共享檔案iOSWin10
- 簡單理解Java中的4種迴圈Java
- 關於Java註解(annotation)的簡單理解Java
- 關於MongoDB的簡單理解(二)--Java篇MongoDBJava
- Perl IO:隨機讀寫檔案隨機
- android怎麼訪問win10共享檔案_android如何訪問win10共享檔案AndroidWin10
- 深入理解Java虛擬機器(類檔案結構)Java虛擬機
- 深入理解Java虛擬機器 – 類檔案結構Java虛擬機
- 簡單的檔案快取函式快取函式
- 簡單說說webpack的配置檔案Web
- SyncTime for mac 簡單的檔案同步工具Mac
- SyncTime for mac(簡單的檔案同步工具)Mac
- 簡單介紹nacos單機本地配置檔案儲存位置方式
- HighTop for Mac(快速檔案訪問軟體)Mac
- 檔案管理簡單介紹
- ThreadLocal的簡單理解thread
- 深入理解Java虛擬機器之物件的記憶體佈局、訪問定位Java虛擬機物件記憶體
- C#實現的簡單的隨機抽號器C#隨機
- 使用 Fuse 和 java 17 編寫一個簡單的檔案系統Java
- 區域網訪問共享檔案需要密碼怎麼辦?取消區域網共享檔案訪問密碼的方法密碼
- win共享檔案沒有許可權訪問怎麼辦 win10共享檔案許可權訪問的方法Win10
- 用SpringMVC來簡單的操作Excel檔案SpringMVCExcel
- PDF轉文字檔案的最簡單方法
- PostgreSQL-訪問策略配置檔案pg_hba.conf檔案(八)SQL
- 破解class檔案的第一步:深入理解JAVA Class檔案Java