读书人

怎么分段读取文件

发布时间: 2012-11-10 10:48:50 作者: rapoo

如何分段读取文件

项目中使用到了读文件,但是有的文件很大。一下子加入到内存中再循环取,效率很底,试着用分段读,这个方法可行。把代码贴出来,如果大家有更好的方法。欢迎指正。

?

public static List<Keyword> readFile(int formIndex, int toIndex) {
??? ??? List<Keyword> lists = new ArrayList<Keyword>();
??? ??? String path = getPadFilePath();
??? ??? try {
??? ??? ??? FileReader fr = new FileReader(path);
??? ??? ??? BufferedReader br = new BufferedReader(fr);

??? ??? ??? String temp;
??? ??? ??? int i = 0;
??? ??? ??? while ((temp = br.readLine()) != null) {
??? ??? ??? ??? i++;
??? ??? ??? ??? if (i > formIndex && i < toIndex) {
??? ??? ??? ??? ??? lists.add(new Keyword(temp));
??? ??? ??? ??? }
??? ??? ??? }
??? ??? ??? fr.close();
??? ??? } catch (Exception e) {
??? ??? ???
??? ??? ??? log.error("read file exception :" + getExceptionStr(e));
??? ??? }
??? ??? return lists;
??? }

?

? 注:fromIndex -- 起始位置。toIndex --- 结束位置。

? 之前的做法是用的是List中有一个subList的方法,这个也可以实现,但是目的不一样。如果是那样的话。做起来很简单。

??? ??? }<br>
??? ??? return lists;<br>
??? }</p>
<p>?</p>
<p>? 注:fromIndex -- 起始位置。toIndex --- 结束位置。</p>
<p>? 之前的做法是用的是List中有一个subList的方法,这个也可以实现,但是目的不一样。如果是那样的话。做起来很简单。</p>
</div>
<p>?</p>
<p>?</p>
<p>你头上的星星怎么来的?</p>
<p>这代码写的</p>
<p>看着不爽</p>
<p>?</p>while ((temp = br.readLine()) != null) { i++; if (i > formIndex && i < toIndex) { lists.add(new Keyword(temp)); } }
一直到文件读完指针才会停下来?那分段的意义在哪里???? ??? }<br>
??? ??? return lists;<br>
??? }</p>
<p>?</p>
<p>? 注:fromIndex -- 起始位置。toIndex --- 结束位置。</p>
<p>? 之前的做法是用的是List中有一个subList的方法,这个也可以实现,但是目的不一样。如果是那样的话。做起来很简单。</p>
</div>
<p>?</p>/** * 修改文件中的某一部分的数据测试:将字定位置的字母改为大写 * @param fName :要修改的文件名字 * @param start:起始字节 * @param len:要修改多少个字节 * @return :是否修改成功 * @throws Exception:文件读写中可能出的错* @author javaFound */public static boolean changeFile(String fName,int start,int len) throws Exception{ //创建一个随机读写文件对象java.io.RandomAccessFile raf=new java.io.RandomAccessFile(fName,"rw");long totalLen=raf.length();System.out.println("文件总长字节是: "+totalLen);//打开一个文件通道java.nio.channels.FileChannel channel=raf.getChannel();//映射文件中的某一部分数据以读写模式到内存中java.nio.MappedByteBuffer buffer= channel.map(FileChannel.MapMode.READ_WRITE, start, len);//示例修改字节for(int i=0;i<len;i++){byte src=buffer.get(i);buffer.put(i,(byte)(src-31));//修改Buffer中映射的字节的值System.out.println("被改为大写的原始字节是:"+src); }buffer.force();//强制输出,在buffer中的改动生效到文件buffer.clear();channel.close();raf.close();return true;}//测试主方法public static void main(String[] args) throws Exception{changeFile("BigFileRW.java",3,5);System.out.println(" change OK... ");}


要想看到测试结果,需要在项目的的当前目录下创建一个名为BigFileRW.java文本文件,其中写上10上以上的字母。运行如上程序,文件中第3个字母起后面5个都变为大写了。

NIO可以理解为传统IO的加强版,功能和性能都加强了,但使用变得更复杂。本节通过一些典型的用例展示了NIO的应用特征。深入灵活地将NIO用巧用好只有一个办法:有战斗中学习战斗,在实践中应用!

12 楼 yvfish 2010-03-14 javafound兄给出的正解! 13 楼 云中苍月 2010-03-14 RandomAccessFile可以很好的解决楼主的需求。
内存映射也是好的选择,在think in java的IO章节有很完整的介绍。 14 楼 FeiXing2008 2010-03-14 楼主这里并没有将所有数据加载到内存里,但是这样的做法需要多次读文件 15 楼 windywany 2010-03-14 MAPPING应该是最好的解决办法

读书人网 >软件架构设计

热点推荐