在文件传输过程中,经常需要将一个文件拆分成多个较小的文件,然后利用多线程传输这些小文件,最后再对这些小文件进行合并。这里先给出文件拆分的一个demo,稍后将会给出文件合并的介绍。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package hfut.wst.io;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
*
* @author 风停心止
*/
public class RandomAccessFileDemo {
public static void main(String[] args) {
try {
RandomAccessFile file = new RandomAccessFile("randomFile1.txt", "rws");//创建一个随即读写文件
String[] names = {"zhangsan is me
", "lisi is my deskmate
", "wangwu is my best friend
"};//待写入内容
String[] chineseName = {"张三
", "李四r
", "王五
"};//待写入内容
for (String name : names) {//写入英文内容
file.seek(file.length());//将文件指针定位在文件结尾,实现追加功能
byte[] nameByte = name.getBytes();
file.write(nameByte);//写入内容
}
for (String name : chineseName) {//写入中文内容
file.seek(file.length());
byte[] nameByte = name.getBytes();
file.write(nameByte);
}
System.out.println(file.length());
file.seek(0);//将文件指针置为文件开始
String test = "";
while ((test = file.readLine()) != null) {
String line = new String(test.getBytes("ISO-8859-1"));//读取文件内容并正确处理乱码和编码问题
System.out.println(line);
}
// int seekIndex = 0;
// byte[] b = new byte[256];
// while (seekIndex <= file.length()) {
// file.seek(seekIndex);
// file.read(b);
// System.out.println(b);
// seekIndex += b.length;
// }
int blockSize = 256;//每个文件块的大小
int blockNum = (int) file.length() / blockSize + 1;//计算文件可以拆分的数目
File[] blocks = new File[blockNum];//将拆分小文件放在某一数组中
byte[] block = new byte[blockSize];//定义内容数组
file.seek(0);//从文件头开始拆分
int fileIndex = 1;
int index = 0;
while (file.getFilePointer() < file.length()) {
String path = "block" + fileIndex + ".txt";
File temp = new File(path);//创建小文件
file.read(block);//读取blockSize字节内容到block中
DataOutputStream dos = new DataOutputStream(new FileOutputStream(temp));//创建小文件输出流
dos.write(block);//向小文件中写入拆分内容
blocks[index] = temp;//继续进行拆分
fileIndex++;
index++;
//System.out.println(path + " is created");
dos.close();//关闭输入流,否则下面将无法删除小文件
}
System.out.println(block.length);
for (File f : blocks) {//删除小文件
if (f.exists()) {
System.out.println(f.getAbsoluteFile());//显示拆分小文件路径
if (!f.delete()) {
System.out.println("请关闭使用该文件的所有进程或者流!!");
} else {
System.out.println(f.getName()+" 成功被删除!");
}
}
}
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}