java - 仅读取大小数组倍数的特殊输入流
问题描述
我需要使用 java 以原始模式读取 cd / dvd 驱动器。我知道该怎么做(使用 unc 路径,如 \.\E:\ ),我可以读取一些数据。但是,如果我想跳过大量数据,它会因为文件缓冲和对齐而失败,正如微软在此处指定的那样:https ://docs.microsoft.com/en-us/windows/win32/fileio/file-buffering
我的扇区大小是 2048 字节,如果我读取 2048 字节或者如果我跳过 2048 字节的倍数,它就可以工作。我正在使用 8192 字节的缓冲输入流读取器,它确实是 2048 的倍数。
但是如果我需要跳过非多个字节,下一次读取将失败。
是否有一个输入流总是会向底层文件发出 2048 字节的读取?
解决方案
FileInputStream
关于输入流和/的一般工作方式的 java 规范Files.newInputStream
没有详细说明,您可以保证它会告诉底层操作系统驱动程序精确读取 2048 个字节。从这个意义上说,您的问题可以简单地回答:不,没有输入流总是会向底层文件发出 2048 字节的读取。
然而,在实践中,调用read(someByteArr)
一个新打开new FileInputStream
的资源,它someByteArr
的大小正好是 2048 字节,确实应该总是做你想做的事,即使规范不能完全保证这一点。编写代码,始终以 2048 的倍数调用读取(或跳过)方法,并公开一个进一步的 API,让您读取其中的较小部分(如果必须)。
请注意,链接的文档深入研究了特定于操作系统的细节,Java 不允许您这样做(并非不诉诸所谓的native
代码;您不想去那里,相信我)。Java 并不是真正适合这里工作的工具。
推荐阅读
- kubernetes - 水平 pod 自动缩放器无法在 minikube 部署中获取指标
- path - 增加笔触大小时,Curved Path2D 变直
- icalendar - Caldav 未在时间范围查询内返回事件
- rust - 如何为 Struct 实现 `std::iter::FromIterator<_>'?
- javascript - 我一直在尝试安装或创建 React 应用程序,但一直收到此错误消息
- google-chrome - Puppeteer 不在 Ubuntu 中重用缓存的字体
- autodesk-forge - BIM 360 比较文档
- postgresql - 将 UUID 插入客户端应用程序生成的 Postgres 是否合法?
- c# - 验证 C# 事件触发函数的命名
- javascript - Nothig 显示有 places.description == "Dermatologista" ?(