java - 特殊输入流,仅读取大小数组的倍数

标签 java windows inputstream

我需要使用 java 以原始模式读取 CD/DVD 驱动器。我知道如何执行此操作(使用像\.\E:\这样的 unc 路径),并且我可以读取一些数据。但是,如果我想跳过大量数据,由于文件缓冲和对齐,它会失败,如 Microsoft 此处指定的:https://learn.microsoft.com/en-us/windows/win32/fileio/file-buffering

我的扇区大小是 2048 字节,如果我读取 2048 字节或者跳过 2048 字节的倍数,它就可以工作。 我使用的是 8192 字节的缓冲输入流读取器,它确实是 2048 的倍数。

但是如果我需要跳过非多个字节,则下一次读取将会失败。

是否有一个输入流始终向底层文件发出 2048 字节的读取?

最佳答案

关于输入流一般情况的 Java 规范,以及 FileInputStream/Files.newInputStream Works 未指定到您可以保证的详细程度,它会告诉底层操作系统驱动程序精确读取 2048 字节。从这个意义上说,您的问题可以简单地回答:不,没有输入流总是向底层文件发出 2048 字节的读取。

然而,在实践中,调用read(someByteArr)在新开封的新包装上new FileInputStream在资源上,其中 someByteArr大小恰好是 2048 字节,确实应该始终执行您想要的操作,即使规范不能完全保证这一点。编写代码,始终以 2048 的倍数调用读取(或跳过)方法,并公开进一步的 API,让您可以读取其中的较小部分(如果需要)。

请注意,链接的文档深入研究了特定于操作系统的详细信息,达到了 java 不允许您做到的程度(必须诉诸所谓的 native 代码;您不想去那里,相信我) 。 Java 并不是真正适合这里工作的工具。

关于java - 特殊输入流,仅读取大小数组的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58487260/

相关文章:

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

Java.util.Date 空输出

java - JVM 和 KVM 之间的主要明显区别是什么?

c++ - 将 int 转换为 wchar_t 的正确方法是什么?

c++ - 内存中无符号字符加密

android - 如果新数据到达 Android,则从套接字读取数据

php - 如何从 URL 获取字符串

java - JPanel 不填充包含 JFrame

windows - 当我从 Windows 快捷方式运行程序时,为什么 wxPerl 不绘制我的 wxStaticBitmap?

java - 如何在保持输入流打开以获得结果的同时关闭 Java 套接字输出流?