Java中如何倒序输入或者随机访问文本(txt)文件

由于业务需求,需要对一个txt文本文件进行倒序输入,比如文本内容为 “我是一个需要倒序输入的文本内容”,需要输出为 “容内本文的入输序倒要需个一是我”

实现方法有一下几种:

  1. 将文本文件读入到内存为String、StringBuffer或者StringBuilder,然后进行逆向遍历,此方法比较简单,对于小文本比较有效,如果文本文件比较大,比如GB级别则一次性读入内存不现实。
  2. 采用RandomAccessFile进行读取,开始将文件指针定位到文件结尾,每次读取一个字符,采用seek方法将位置当前指针位置往回指个单位,这个方法需要可以实现逆向读取文本,但是当文本中含有Unicode双字节字符或者多字节字符时候,将会面临读取错误,非常大的可能会造成乱码,且频繁的操作io,会降低程序性能。
  3. 采用内存映射文件的方式实现,即采用RandomAccessFile + MappedByteBuffer实现,先将RandomAccessFile映射成一个MappedByteBuffer,再采用Charset进行decode成相应的编码变成CharBuffer,进而可以采用CharBuffer对文件的字符进行逆向读取,不但可以进行你想读取,还可以随机访问任意一个字符

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.RandomAccessFile;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
public class Test
{
public static void main(String[] args) throws Exception
{
RandomAccessFile file = new RandomAccessFile("large.txt", "r");
MappedByteBuffer mappedByteBuffer = file.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
Charset charset = Charset.forName("UTF-8");
CharBuffer charBuffer = charset.decode(mappedByteBuffer.asReadOnlyBuffer());
for(int i =charBuffer.length()-1;i>=0;i--)
{
System.out.println(charBuffer.charAt(i));
}
file.close();
}
}