首页 > 解决方案 > 仅读取大小数组倍数的特殊输入流

问题描述

我需要使用 java 以原始模式读取 cd / dvd 驱动器。我知道该怎么做(使用 unc 路径,如 \.\E:\ ),我可以读取一些数据。但是,如果我想跳过大量数据,它会因为文件缓冲和对齐而失败,正如微软在此处指定的那样:https ://docs.microsoft.com/en-us/windows/win32/fileio/file-buffering

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

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

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

标签: javawindowsinputstream

解决方案


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

然而,在实践中,调用read(someByteArr)一个新打开new FileInputStream的资源,它someByteArr的大小正好是 2048 字节,确实应该总是做你想做的事,即使规范不能完全保证这一点。编写代码,始终以 2048 的倍数调用读取(或跳过)方法,并公开一个进一步的 API,让您读取其中的较小部分(如果必须)。

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


推荐阅读