在java中逐字节读取[关闭]
Posted
技术标签:
【中文标题】在java中逐字节读取[关闭]【英文标题】:Reading byte by byte in java [closed] 【发布时间】:2021-02-13 13:24:31 【问题描述】:我正在尝试在 Java 中读取 bmp 图像时使用线程。更确切地说,我想用 4 块数据来读取它。这仅用于教育目的,我知道这不是您在技术上需要的东西。 但是,我不知道如何逐字节或逐块读取文件。我发现的唯一一件事是使用我不需要的 readAllBytes 或 readByte,这需要我已经拥有字节数组,但这不再是线程读取。 有什么方法可以逐字节或逐块读取给定路径? 提前谢谢!
【问题讨论】:
使用FileInputStream fis = new FileInputStream(file);
然后int val = fis.read()
就可以了。 val == -1 表示文件结束。
您想创建例如 4 个线程并在 4 个不同线程中读取图像的四个不同部分吗?
@mahfujasif 是的!我是Java的初学者,我不知道该怎么做,我一直在努力,因为我什至不确定是否可能。我正在使用生产者读取块并使用消费者将其写入文件的最终变量。
@JayC667 感谢您的回复!在这个例子中谁是文件,如果它是图像中的字节数组,这是否意味着我应该已经读取了图像(数组)?我试图只传递路径以便只按块读取它。
【参考方案1】:
.read()
,不带参数,只读取一个字节,但有两个重要说明:
这不是线程安全的。线程+磁盘一般不行;瓶颈是磁盘,而不是 CPU,您需要添加一个保护,即任何时候只有一个线程正在读取。鉴于磁盘非常慢,您最终会遇到这样一种情况,即一个线程需要从磁盘读取,这样做,并处理接收到的数据,而在这种情况发生时,其他所有的 X 线程都在等待磁盘现在有一个可以“运行”(其他的仍然需要等待)。但是,每个线程在任何其他线程甚至未暂停之前都已完成读取和数据处理:你什么也得不到。
read()
在 FileInputStream 上通常难以置信慢。这些是低级操作,但磁盘往往一次读取整个块并且无法一次读取一个字节。因此,read()
被实现为:读取可以读取的最小块(通常仍然是 4096 或更多字节),从该块中取出需要的一个字节,然后将剩余部分扔进垃圾桶时间>。换句话说,如果你通过调用.read()
4906 次来读取一个文件,那就是从磁盘读取相同的块4096 次。而调用:
byte[] b = new byte[4096];
int read = fileIn.read(b);
将用块填充整个字节数组,因此速度提高 4096 倍。
如果您的目标是学习多线程,“读取文件”并不是学习它的方法;以这种方式你无法观察到任何有意义的行动。
如果您的目标是加快 BMP 处理速度,那么“多线程读取过程”现在也是一种方式。我无法解释为什么这里涉及多线程。既不适合学习,也不适合提速。
【讨论】:
非常感谢您的回复,我会尝试使用您的方法!这个例子是我们的教授给我们的,我们必须构建一个图像过滤器,其中图像的读取是通过线程完成的。这很慢,但我不知道如何以另一种方式做到这一点。 只是一个问题,对不起!这个例子中的fileIn是谁,是ByteArrayInputStream还是DataInputStream?而且,这不需要已经将文件写入fileIn吗?我试图只通过路径并直接从那里读取。这可能吗?以上是关于在java中逐字节读取[关闭]的主要内容,如果未能解决你的问题,请参考以下文章