问题描述
如下代码:1、怎样把读到的内容(在BUFFER里)一行一行进行分析?也就是getline操作2、如下的读法,可以只读一部分文件的内容吗?也就是分批读取?谢谢importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.nio.ByteBuffer;importjava.nio.channels.FileChannel;publicclasstest{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamfileInputStream=newFileInputStream("tconfirmdetail.txt");FileChannelinChannel=fileInputStream.getChannel();ByteBufferbyteBuffer=ByteBuffer.allocateDirect(57972956);while(true){inteof=inChannel.read(byteBuffer);if(eof==-1)break;byteBuffer.flip();byteBuffer.clear();}inChannel.close();}}
解决方案
解决方案二:
需要读取一行时,设计到ascii码判断,所以建议不要使用NIO,使用io包里的BufferedReader中的readLine方法读取
解决方案三:
引用1楼gufengwyx1的回复:
需要读取一行时,设计到ascii码判断,所以建议不要使用NIO,使用io包里的BufferedReader中的readLine方法读取
NIO不能一行一行readline吗?
解决方案四:
这个是我目前测试的最快读取文本文件的方式了。不过没法看啊不像bufferreader那样,readline很方便
解决方案五:
AFileInputStreamobtainsinputbytesfromafileinafilesystem.Whatfilesareavailabledependsonthehostenvironment.FileInputStreamismeantforreadingstreamsofrawbytessuchasimagedata.Forreadingstreamsofcharacters,considerusingFileReader.publicvoidgetFile2(){try{Filefile=newFile("E:\a.txt");BufferedReaderbr=newBufferedReader(newFileReader(file));BufferedWriterbw=newBufferedWriter(newFileWriter(newFile("E:\b.txt")));Stringline="";while((line=br.readLine())!=null){System.out.println(line);bw.write(line);}}catch(Exceptione){e.printStackTrace();}}
解决方案六:
楼主用的方法不常用。不评论,发一种常用的方法,可以一行一行的读取。packagecom.briup.ch11;//第一个importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.nio.Buffer;publicclassFileInputOutputTest{publicstaticvoidmain(String[]args){//声明流,FileInputStreamfis=null;//包装流BufferedInputStreambis=null;FileOutputStreamfos=null;BufferedOutputStreambos=null;//初始化并且包装流try{//要存储的源文件fis=newFileInputStream("src/com/briup/ch11/FileInputOutputTest.java");bis=newBufferedInputStream(fis);//要保存的文件的位置fos=newFileOutputStream("src/com/briup/ch11/FileInputOutputTest.txt");bos=newBufferedOutputStream(fos);//输入流读取文件byte[]buff=newbyte[128];intlen=0;while((len=bis.read(buff))!=-1){System.out.println(newString(buff,0,len));bos.write(buff,0,len);}//输出流需要刷新缓冲区bos.flush();}catch(FileNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{try{//关闭释放流if(bis!=null)bis.close();if(fis!=null)bis.close();if(bos!=null)bos.close();if(fos!=null)fos.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}}
解决方案七:
直接看java一下BufferedReader中的readLine方法源代码,自己分析一下,就OK了。
解决方案八:
另外FileInputStream这个流貌似不提供定位的功能。分批读取的意思是一次读取一部分,这样多线程读取大数据量的信息是么?如果那样的需要用到PipedInputStreamPipedOutputStream管道流,记得还有一个是可以定位读取的流,临时忘了,帮你查查API吧
解决方案九:
importjava.nio.file.Files;importjava.nio.file.Paths;importjava.nio.charset.Charset;List<String>lines=Files.readAllLines(Paths.get("D:/Temp","examples.txt"),Charset.defaultCharset());
解决方案十:
引用5楼AA5279AA的回复:
楼主用的方法不常用。不评论,发一种常用的方法,可以一行一行的读取。Javacode??1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859packagecom.briup.ch11;//第一个……
谢谢,第一种方法我测试过,读50M的文本文件大约1.2秒第二种没用过,更快?
解决方案十一:
引用8楼huntor的回复:
Javacode??12345importjava.nio.file.Files;importjava.nio.file.Paths;importjava.nio.charset.Charset;List<String>lines=Files.readAllLines(Paths.get("D:/Temp","examples.txt"),Cha……
谢谢,这个我看不懂的
解决方案十二:
引用7楼AA5279AA的回复:
另外FileInputStream这个流貌似不提供定位的功能。分批读取的意思是一次读取一部分,这样多线程读取大数据量的信息是么?如果那样的需要用到PipedInputStreamPipedOutputStream管道流,记得还有一个是可以定位读取的流,临时忘了,帮你查查API吧
是得,不过没打算多线程同时读一个文件,因为是单硬盘只想1个线程读文件,然后每读10万行,把这10万行内容分发给别的线程处理比如3个线程好了,一个线程负责读,另外两个线程负责处理
解决方案十三:
引用6楼caoniaozhilu的回复:
直接看java一下BufferedReader中的readLine方法源代码,自己分析一下,就OK了。
同意
解决方案十四:
引用6楼caoniaozhilu的回复:
直接看java一下BufferedReader中的readLine方法源代码,自己分析一下,就OK了。
怎么个OK了?
解决方案十五:
引用5楼AA5279AA的回复:
楼主用的方法不常用。不评论,发一种常用的方法,可以一行一行的读取。Javacode??1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859packagecom.briup.ch11;//第一个……
谢谢,测试了你的第二种方法,很慢,比bufferreader慢3.5倍
解决方案:
publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilefile=newRandomAccessFile("1.txt","r");FileChannelfileChannel=file.getChannel();ByteBufferbuffer=fileChannel.map(MapMode.READ_ONLY,0,fileChannel.size());CharBuffercharBuffer=Charset.forName("utf-8").decode(buffer);file.close();BufferedReaderbufferedReader=newBufferedReader(newStringReader(charBuffer.toString()));Stringstr=null;while((str=bufferedReader.readLine())!=null){System.out.println(str);}}
用BufferedReader包装一下就行了,不过文件大了受不了,你可以考虑每次读定长,然后再往后一直读到换行符为止
解决方案:
引用15楼wapigzhu的回复:
Javacode??12345678910111213publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilefile=newRandomAccessFile("1.txt","r");FileChannelfileChannel……
这样能比BUFFERRADER快吗?如果不能快,就没意思了文件有1.2G吧
解决方案:
引用15楼wapigzhu的回复:
Javacode??12345678910111213publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilefile=newRandomAccessFile("1.txt","r");FileChannelfileChannel……
谢谢,能不能把那个allocatedirect也就是directbuffer也包装进去?谢谢
解决方案:
什么叫做比BufferedReader慢,你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的,BufferedReader本身是跟Stream什么都没有关系的,它只负责操作你给它的数据,你给它数据的时候慢,当然它给你结果就慢你把一个内存里面的字符串直接让BufferedReader读,那还会觉得慢?
解决方案:
引用15楼wapigzhu的回复:
Javacode??12345678910111213publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilefile=newRandomAccessFile("1.txt","r");FileChannelfileChannel……
另外想再请教一下,readline后怎样以最快的方式判断这一行是否含有比如:“你”,“我”等字符串?特征是“你”“我”等字符串总是出现在行的比较靠右边的位置,比如"8457TRGDF","FSAFDFFDF","FSFKJDHFSF","哦你好啊","AA"
解决方案:
引用18楼wapigzhu的回复:
什么叫做比BufferedReader慢,你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的,BufferedReader本身是跟Stream什么都没有关系的,它只负责操作你给它的数据,你给它数据的时候慢,当然它给你结果就慢你把一个内存里面的字符串直接让BufferedReader读,那还会觉得慢?
谢谢,我的意思是和下面代码比,哪个更快?BufferedReaderreader=newBufferedReader(newFileReader("test.txt"));reader.readLine();Stringline=null;Stringitem[];for(Stringline=null;(line=reader.readLine())!=null;){}
解决方案:
引用17楼wannaspring的回复:
引用15楼wapigzhu的回复:Javacode??12345678910111213publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilefile=newRandomAccessFile("1.txt","r")……
publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilefile=newRandomAccessFile("1.txt","r");FileChannelfileChannel=file.getChannel();//这个地方要按文件大小来,如果实在要定长就只能按先前说的,继续往后读到换行符//或者把已经读过但是没有凑成正行的put回去,然后compact,再继续读ByteBufferbuffer=ByteBuffer.allocateDirect((int)fileChannel.size());fileChannel.read(buffer);buffer.flip();CharBuffercharBuffer=Charset.forName("utf-8").decode(buffer);file.close();BufferedReaderbufferedReader=newBufferedReader(newStringReader(charBuffer.toString()));Stringstr=null;while((str=bufferedReader.readLine())!=null){System.out.println(str);}}
你是要这样?
解决方案:
引用20楼wannaspring的回复:
引用18楼wapigzhu的回复:什么叫做比BufferedReader慢,你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的,BufferedReader本身是跟Stream什么都没有关系的,它只负责操作你给它的数据,你给它数据的时候慢,当然它给你结果就慢你把一个内存里面的字符串直接让BufferedReade……
当然用nio的更快咯,他是一整块内存直接读的newFileReader("test.txt"))这个是按stream读的底层操作会比nio的多很多
解决方案:
引用19楼wannaspring的回复:
引用15楼wapigzhu的回复:Javacode??12345678910111213publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilefile=newRandomAccessFile("1.txt","r")……
indexOf不能满足这个需求么?
解决方案:
引用22楼wapigzhu的回复:
引用20楼wannaspring的回复:引用18楼wapigzhu的回复:什么叫做比BufferedReader慢,你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的,BufferedReader本身是跟Stream什么都没有关系的,它只负责操作你给它的数据,你给它数据的时候慢,当然它给你结果就慢你把一个内存里面的字符串直接让……
我已经糊涂了,NIO,DIRECTBUFFER(ALLOCATEDIRET)CHANNEL简单说吧,如下代码是我目前知道的最快的方式了,是否有更快的?NIO结合channel我测试了,比下面的快13%,但是是读到buffer,然后从buffer解码,再读成一行一行,貌似反而更慢了BufferedReaderreader=newBufferedReader(newFileReader("test.txt"));reader.readLine();Stringline=null;Stringitem[];while((line=reader.readLine())!=null){}
解决方案:
引用23楼wapigzhu的回复:
引用19楼wannaspring的回复:引用15楼wapigzhu的回复:Javacode??12345678910111213publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilefile=newRandomAccessFile(……
不只是判断一个字符,有好几个,如果正则是很慢的,不考虑但是如果indexOfN次,就会遍历字符串N次,也慢
解决方案:
引用24楼wannaspring的回复:
引用22楼wapigzhu的回复:引用20楼wannaspring的回复:引用18楼wapigzhu的回复:什么叫做比BufferedReader慢,你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的,BufferedReader本身是跟Stream什么都没有关系的,它只负责操作你给它的数据,你给……
你是怎么测的?我刚试过了,一个11M的小说txt文件,读出来转码并存到ArrayList,用nio只用50ms左右用FileReader花了235ms代码在下面你可以试试看?nio的RandomAccessFilefile=newRandomAccessFile("b.txt","r");FileChannelfileChannel=file.getChannel();ByteBufferbuffer=ByteBuffer.allocateDirect((int)fileChannel.size());fileChannel.read(buffer);buffer.flip();CharBuffercharBuffer=Charset.forName("utf-8").decode(buffer);file.close();BufferedReaderbufferedReader=newBufferedReader(newStringReader(charBuffer.toString()));List<String>list=newArrayList<String>();longtime=System.currentTimeMillis();Stringstr=null;while((str=bufferedReader.readLine())!=null){list.add(str);}System.out.println(System.currentTimeMillis()-time);
FileReaderBufferedReaderbufferedReader=newBufferedReader(newFileReader("b.txt"));Stringstr=null;longtime=System.currentTimeMillis();List<String>list=newArrayList<String>();while((str=bufferedReader.readLine())!=null){list.add(str);}System.out.println(System.currentTimeMillis()-time);
解决方案:
NIO:是文件映射内存的方式,可以方便你处理大文件。不用担心由于文件过大一次读到内存中造成内存溢出BufferedReader,这个方式应该比没有缓冲区的读速度快。因为他是从文件中分批读取内容的。传统的没有缓冲区的文件读取速度最慢。如果是小文件很显然BufferedReader要更快,但是大文件我想目前只能用NIO去处理了。