要求:将一个文件中的内容切分,并显示切分多少块及每块的内容。
代码如下:
public class RandomAccessFileTest {
public static void main(String[] args) {
//doc.txt文件内容随机
File file = new File("doc.txt");
//整个文件的大小
long length = file.length();
//规定块的大小
int blockSize = 1024;
//文件可以被切分成多少个块
int size = (int)Math.ceil(length*1.0/blockSize);
System.out.printf("要被切成%d块",size);
System.out.println();
int beginPos = 0;
int actualSize = (int)(blockSize>length?length:blockSize);
for(int i = 0;i<size;i++){
//每次读取块的时候的起始偏移量
beginPos = i*blockSize;
if(i==size-1){
actualSize = (int)length;
}else {
actualSize = blockSize;
length -= actualSize;
}
System.out.println(i+"--起始位置是:"+beginPos+"---读取的大小是:"+actualSize);
readSplit(i,beginPos,actualSize);
}
}
public static void readSplit(int i,int beginPos,int actualSize){
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(new File("doc.txt"),"r");
//表示从哪个偏移量开始读取数据
randomAccessFile.seek(beginPos);
byte[] bytes = new byte[1024];
int length = 0;
while((length = randomAccessFile.read(bytes))!=-1) {
if (actualSize > length) {
System.out.println(new String(bytes, 0, length));
actualSize -= length;
}else {
System.out.println(new String(bytes,0,actualSize));
break;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
randomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
不实现readSplit(i,beginPos,actualSize); 这行代码的结果如下显示:
要被切成21块
0–起始位置是:0—读取的大小是:1024
1–起始位置是:1024—读取的大小是:1024
2–起始位置是:2048—读取的大小是:1024
3–起始位置是:3072—读取的大小是:1024
4–起始位置是:4096—读取的大小是:1024
5–起始位置是:5120—读取的大小是:1024
6–起始位置是:6144—读取的大小是:1024
7–起始位置是:7168—读取的大小是:1024
8–起始位置是:8192—读取的大小是:1024
9–起始位置是:9216—读取的大小是:1024
10–起始位置是:10240—读取的大小是:1024
11–起始位置是:11264—读取的大小是:1024
12–起始位置是:12288—读取的大小是:1024
13–起始位置是:13312—读取的大小是:1024
14–起始位置是:14336—读取的大小是:1024
15–起始位置是:15360—读取的大小是:1024
16–起始位置是:16384—读取的大小是:1024
17–起始位置是:17408—读取的大小是:1024
18–起始位置是:18432—读取的大小是:1024
19–起始位置是:19456—读取的大小是:1024
20–起始位置是:20480—读取的大小是:256