RandomAccessFile的简单使用

之前遇到过一个笔试题,要把文件平均分成三份,多线程。实在无法想到怎么能从文件中间开始读取。

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的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值