我试图在Java中读取bmp图像时使用线程。更确切地说,我想在4块数据中读取它。这只是为了教育目的,我知道这不是你技术上需要的东西。然而,我不知道如何读取文件字节或块块块。我发现的唯一的事情是使用readAllBytes,这不是我需要的,或readByte,这需要我已经有字节数组,但这不是一个线程读取了。是否有任何方法,我可以读取字节字节或块块为给定的路径?提前感谢!
.read()
,不带参数,只读取一个字节,但有两点需要注意:
-
这不是线程安全的。线程+磁盘通常不工作;瓶颈是磁盘,而不是CPU,您需要添加一个保护,确保在任何时候只有一个线程正在读取数据。考虑到磁盘速度很慢,您最终会遇到这样一种情况:一个线程需要从磁盘读取数据并处理接收到的数据,而在此过程中,所有在磁盘上等待的其他X个线程现在都有一个可以"走"了(其他线程仍然需要等待)。但是,在任何其他线程未暂停之前,每个线程都完成了读取和处理数据:您什么也得不到。
FileInputStream上的 read()
通常难以置信的慢。这些都是低级操作,但是磁盘倾向于一次读取整个块,并且不能一次读取一个字节。因此,read()
被实现为:读取可以读取的最小块(通常仍然是4096或更多字节),从需要的块中取出一个字节,并将其余部分扔进垃圾桶。换句话说,如果通过调用.read()
4906次来读取文件,那么将从磁盘读取相同的块4096次。而称:
byte[] b = new byte[4096];
int read = fileIn.read(b);
将用块填充整个字节数组,因此速度要快4096倍。
如果你的目标是学习多线程,"读文件"不是学习它的方法;这样你就不能观察到任何有意义的动作。
如果你的目标是加速BMP的处理,"多线程读取过程"现在是一种方式。我无法解释为什么这里涉及到多线程。既不学习它,也不加快任何事情,都是合适的。