由于业务需求,需要对一个txt文本文件进行倒序输入,比如文本内容为 “我是一个需要倒序输入的文本内容”,需要输出为 “容内本文的入输序倒要需个一是我”
实现方法有一下几种:
- 将文本文件读入到内存为String、StringBuffer或者StringBuilder,然后进行逆向遍历,此方法比较简单,对于小文本比较有效,如果文本文件比较大,比如GB级别则一次性读入内存不现实。
- 采用RandomAccessFile进行读取,开始将文件指针定位到文件结尾,每次读取一个字符,采用seek方法将位置当前指针位置往回指个单位,这个方法需要可以实现逆向读取文本,但是当文本中含有Unicode双字节字符或者多字节字符时候,将会面临读取错误,非常大的可能会造成乱码,且频繁的操作io,会降低程序性能。
- 采用内存映射文件的方式实现,即采用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(); } }
|