java - 更快的读取文件的方法

标签 java performance file-io

我正在开发一个包含大约 400 个输入文件和大约 40 个输出文件的程序。 很简单:它读取每个输入文件并生成一个新文件,但更大(基于算法)。

我正在使用 BufferedReader 的 read() 方法:

String encoding ="ISO-8859-1";
FileInputStream fis = new FileInputStream(nextFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, encoding));
char[] buffer = new char[8192] ;

要读取我正在使用的输入文件:

private String getNextBlock() throws IOException{
    boolean isNewFile = false;

    int n = reader.read(buffer, 0, buffer.length);
    if(n == -1) {
        return null;
    } else {
        return new String(buffer,0,n);
    }
}

我对每个 block 进行一些检查(比如查看 block 内的一些字符串),然后将其写入文件:

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream("fileName"), encoding));

writer.write(textToWrite);

问题是大约需要 12 分钟。 我正在尝试更快地找到其他东西。 有人知道更好的东西吗?

谢谢。

最佳答案

你应该可以在这里找到答案:

http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly

为了获得最佳的 Java 读取性能,需要记住四件事:

  • 通过一次读取一个数组而不是一次读取一个字节来最大程度地减少 I/O 操作。一个 8Kbyte 的数组是一个很好的大小。

  • 通过一次获取一个数组而不是一个字节来最大限度地减少方法调用。使用数组索引获取数组中的字节。

  • 如果您不需要线程安全,请尽量减少线程同步锁。减少对线程安全类的方法调用,或者使用 FileChannel 和 MappedByteBuffer 等非线程安全类。

  • 尽量减少 JVM/OS、内部缓冲区和应用程序阵列之间的数据复制。使用具有内存映射的 FileChannel,或直接或包装数组 ByteBuffer。

关于java - 更快的读取文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5854859/

相关文章:

java - if 语句中的问题

java - Android 和 Iphone 中的 3D 效果

java - 在 javascript 函数中使用 scriplet

c++ - 性能:else if vs if 在已经返回的函数中

java - sbt Scalatest NoClassDefFoundError

c++ - 新 (std::nothrow) 与 try/catch block 中的新

python - 在 Pygame 中删除图像周围的边框

c++ - 有没有一种方法可以防止将以前运行的值存储在 txt 文件中(防止覆盖)?

java - 文件对象在 Java Web App 中不起作用

java - 如何用Java将二进制写入文件