之前遇到过一个笔试题,要把文件平均分成三份,多线程。实在无法想到怎么能从文件中间开始读取。
RandomAccessFile
新建了一个txt,对txt进行读取测试,通过输出可以很容易判断是从哪个位置开始读取的
- GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;
- UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;
- UTF-16be 编码中,中文字符和英文字符都占 2 个字节。
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Main {
public static void main(String[] args) throws IOException {
RandomAccessFile file = new RandomAccessFile("d://b.txt", "rw");
file.seek(6);
byte[] b = new byte[30];
int len = 0;
while((len = file.read(b))!=-1) {
System.out.println(new String(b,0,len,"UTF-8"));
}
file.close();
}
}
我这台是windows10,输出英文没有问题,但输出中文时无论GBK或UTF8都是乱码,在记事本的另存为...中可以看到编码方式是ANSI,String编码没有这个,就另存了b.txt,UTF8方式。
开始设置缓冲区是byte[32],输出如下
法将文件指针偏移量从�
�个文件开始测量进行下�
��个读或写操作偏移量可
以被设置为超出文件的�
�尾设置偏移超出了文件�
��末尾不会改变文件长度
文件长度也只是由偏移�
�被设置为超出文件的末�
��之后写入更改。��的末�
为什么每次都是行头和尾有乱码,因为UTF8每个中文字符3个字节,30十个字节,最后两个凑不成一个中文字符。改30了,每行10个中文没错。
seek方法偏移量是以字节为单位,偏移量非3的倍数也会出现头尾乱码。
这些情况在普通情况下并无大碍,字节都是接在后面的,不会像我的示例一样非要一行行打印。
还有一件事
abcdefgh
ijklmnop
qrstuvwx
yzstuvwx
这就有点恐怖了,之前都没有发现,缓冲区没有清空。
忘记了,new String(b,"UTF-8")是不对的,正常写文件流的时候或如示例中要通过指定0~len的数据。