Java的:InputStream的速度太慢,读取大型文件(Java: InputStream to

2019-06-24 05:32发布

我要读的字一个53 MB的文件字符。 当我用C做++使用ifstream的,它是在毫秒内完成,但使用Java的InputStream需要几分钟的时间。 这是正常的Java是这种缓慢的还是我失去了一些东西?

另外,我需要完成在Java程序(它使用从我有打电话给其处理这些字符的功能的servlet)。 我想也许在C或C ++编写的文件处理部件,然后使用Java Native Interface接口这些功能与我的Java程序......这是怎么想法?

谁能给我任何其他提示...我认真地需要读取文件速度更快。 我试着用缓冲输入,但它仍然是不会放弃的性能甚至接近C ++。

编辑:我的代码跨越几个文件,这是非常脏的,所以我给简介

import java.io.*;

public class tmp {
    public static void main(String args[]) {
        try{
        InputStream file = new BufferedInputStream(new FileInputStream("1.2.fasta"));
        char ch;        
        while(file.available()!=0) {
            ch = (char)file.read();
                    /* Do processing */
            }
        System.out.println("DONE");
        file.close();
        }catch(Exception e){}
    }
}

Answer 1:

我跑这个代码与183 MB的文件。 该墨水打印“已播放250毫秒”。

final InputStream in = new BufferedInputStream(new FileInputStream("file.txt"));
final long start = System.currentTimeMillis();
int cnt = 0;
final byte[] buf = new byte[1000];
while (in.read(buf) != -1) cnt++;
in.close();
System.out.println("Elapsed " + (System.currentTimeMillis() - start) + " ms");


Answer 2:

我会尝试这个

// create the file so we have something to read.
final String fileName = "1.2.fasta";
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(new byte[54 * 1024 * 1024]);
fos.close();

// read the file in one hit.
long start = System.nanoTime();
FileChannel fc = new FileInputStream(fileName).getChannel();
ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
while (bb.remaining() > 0)
    bb.getLong();
long time = System.nanoTime() - start;
System.out.printf("Took %.3f seconds to read %.1f MB%n", time / 1e9, fc.size() / 1e6);
fc.close();
((DirectBuffer) bb).cleaner().clean();

版画

Took 0.016 seconds to read 56.6 MB


Answer 3:

使用BufferedInputStream

InputStream buffy = new BufferedInputStream(inputStream);


Answer 4:

如上所述,使用的BufferedInputStream。 你也可以使用NIO包。 请注意,对于大多数文件,将BufferedInputStream为是一样快读的NIO。 然而,对于非常大的文件,NIO可能因为你可以内存映射文件操作做得更好。 此外,NIO包确实可中断IO,而java.io包没有。 这意味着如果你想从另一个线程取消操作,你必须使用NIO,使其可靠。

ByteBuffer buf = ByteBuffer.allocate(BUF_SIZE);
FileChannel fileChannel = fileInputStream.getChannel();
int readCount = 0;
while ( (readCount = fileChannel.read(buf)) > 0) {
  buf.flip();
  while (buf.hasRemaining()) {
    byte b = buf.get();
  }
  buf.clear();
}


文章来源: Java: InputStream too slow to read huge files