java - 不使用任何循环读取字节

标签 java android

我有一个 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/

相关文章:

java - 具有本地数据库的小型 Java 应用程序?使用哪个数据库?

java - 异步任务,此标记后预期的维度

java - 从字节数组中提取图像的宽度、高度、颜色和类型

java - 从 JSON 响应中提取值

java - 高效的Android设计和类的使用

Android - 如何使用 DDMS 将文件夹从文件系统复制到 SD 卡?

java - 如何最有效地共享 log4j 库

java - java 8中从日期字符串到utc long

java - 用户停用帐户后如何关闭应用程序?

android - 机器人 :ScrollView Jerky and animation list not work