【问题标题】:Java loading binary filesJava加载二进制文件
【发布时间】:2010-11-22 14:23:57
【问题描述】:

请告诉我最好/最快的方法:

1) 将非常小的二进制文件加载到内存中。例如图标;

2) 加载/读取大小为 512Mb+ 的非常大的二进制文件。也许我必须使用内存映射 IO?

3) 当您不想考虑大小/速度但必须做的事情时,您的常见选择是:将所有字节读入内存?

谢谢!!!

附:对不起,也许是微不足道的问题。请不要关闭它;)

附注 2。 Mirror C# 的模拟题;

【问题讨论】:

    标签: java binaryfiles java-io


    【解决方案1】:

    对于内存映射文件,java有一个nio包:Memory Mapped Files

    查看小文件的字节流类:Byte Stream

    检查缓冲 I/O 以获得更大的文件:Buffered Stream

    【讨论】:

      【解决方案2】:

      将小文件读入内存的最简单方法是:

      // Make a file object from the path name
      File file=new File("mypath");
      // Find the size
      int size=file.length();
      // Create a buffer big enough to hold the file
      byte[] contents=new byte[size];
      // Create an input stream from the file object
      FileInputStream in=new FileInutStream(file);
      // Read it all
      in.read(contents);
      // Close the file
      in.close();
      

      在现实生活中,您需要一些 try/catch 块以防 I/O 错误。

      如果您正在读取一个大文件,我强烈建议您不要一次将其全部读入内存,如果可以避免的话。阅读并分块处理。这是一个非常罕见的应用程序,它确实需要一次在内存中保存一个 500MB 的文件。

      Java 中没有内存映射 I/O 这样的东西。如果这是你需要做的,你只需要创建一个非常大的字节数组。

      【讨论】:

      • read 不保证一次全部阅读。我建议使用 DataInputyStream.readFully();
      • JDK 1.4 及更高版本提供 nio,我认为 MappedByteBuffer 应该作为内存映射 I/O。
      • 好吧,我不熟悉那门课。它不是真正的内存映射 I/O,至少不是我在 Windows 之前的日子里理解的术语,在那时 I/O 端口被映射到神奇的内存位置。它更像是模拟的数组映射 I/O。但是无所谓。如果它对你有用,那就太酷了。
      猜你喜欢
      • 2010-12-08
      • 2021-01-13
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 2012-11-06
      • 2021-12-13
      • 2021-12-17
      • 2019-10-06
      相关资源
      最近更新 更多