我有一个 16mb 的二进制文件,我想在不使用任何循环的情况下读取字节。就像如果我想读取 16 个字节,我可以将 16 传递给某种方法(如果有的话),它会给我我想要的结果……现在我正在使用循环读取字节,但我的应用程序太大了,我担心它不会变慢。请给我一些提示。
非常感谢。
最佳答案
我可以给你两个答案,但它们不实用。在现实生活中,您将使用循环来读取字节。
有效答案 1
public byte[] readWithNoLoop(InputStream in, int size) {
byte[] result = new byte[16777216]; // 16 MByte
byte b = 0;
if ((b = in.read()) >= 0) result[0] = b;
if ((b = in.read()) >= 0) result[1] = b;
if ((b = in.read()) >= 0) result[2] = b;
// ...
if ((b = in.read()) >= 0) result[16777215] = b;
return b;
}
有效答案 2
使用可以并行读取文件的大规模并行系统。您需要 16777216 个处理单元和一个支持文件存储系统,但您可以在 O(1) 中读取(理论上)。
如果您在读取文件时遇到大量性能问题,请检查您是否使用 BufferedInputStream,从“正常”流中读取字节会降低性能。 ( Example )
如果仍然没有帮助,请查看 java.nio
类。他们可以将文件映射到内存。 Grep example应该给你一个方向。
关于java - 不使用任何循环读取字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3476031/