本文博客地址:http://blog.itbiu.com/articles/2015/07/26/1437921348258.html 转载请保留此链接
由于业务需求,需要对一个txt文本文件进行倒序输入,比如文本内容为 "我是一个需要倒序输入的文本内容",需要输出为 “容内本文的入输序倒要需个一是我”。
实现方法有一下几种:
1、将文本文件读入到内存为String、StringBuffer或者StringBuilder,然后进行逆向遍历,此方法比较简单,对于小文本比较有效,如果文本文件比较大,比如GB级别则一次性读入内存不现实。
2、采用RandomAccessFile进行读取,开始将文件指针定位到文件结尾,每次读取一个字符,采用seek方法将位置当前指针位置往回指个单位,这个方法需要可以实现逆向读取文本,但是当文本中含有Unicode双字节字符或者多字节字符时候,将会面临读取错误,非常大的可能会造成乱码,且频繁的操作io,会降低程序性能。
3、采用内存映射文件的方式实现,即采用RandomAccessFile + MappedByteBuffer实现,先将RandomAccessFile映射成一个MappedByteBuffer,再采用Charset进行decode成相应的编码变成CharBuffer,进而可以采用CharBuffer对文件的字符进行逆向读取,不但可以进行你想读取,还可以随机访问任意一个字符,代码如下:
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(); }
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于