Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中逐字节读取_Java_Multithreading_Image_Block_Bmp - Fatal编程技术网

在java中逐字节读取

在java中逐字节读取,java,multithreading,image,block,bmp,Java,Multithreading,Image,Block,Bmp,我试图在Java中读取bmp图像时使用线程。更确切地说,我想在4个数据块中读取它。这只是出于教育目的,我知道这不是你技术上需要的东西。 但是,我不知道如何逐字节或逐块读取文件。我唯一发现的是使用readAllBytes,这不是我所需要的,或者readByte,它要求我已经拥有字节数组,但这不再是线程读取。 对于给定的路径,是否有任何方法可以逐字节或逐块读取? 提前谢谢你 .read(),没有参数,只读取一个字节,但有两个重要注意事项: 这不是线程安全的。线程+磁盘通常不起作用;瓶颈是磁盘,而不是

我试图在Java中读取bmp图像时使用线程。更确切地说,我想在4个数据块中读取它。这只是出于教育目的,我知道这不是你技术上需要的东西。 但是,我不知道如何逐字节或逐块读取文件。我唯一发现的是使用readAllBytes,这不是我所需要的,或者readByte,它要求我已经拥有字节数组,但这不再是线程读取。 对于给定的路径,是否有任何方法可以逐字节或逐块读取? 提前谢谢你

.read()
,没有参数,只读取一个字节,但有两个重要注意事项:

  • 这不是线程安全的。线程+磁盘通常不起作用;瓶颈是磁盘,而不是CPU,您需要添加一个每次只有一个线程在读取的保护。考虑到磁盘速度太慢,您最终会遇到这样的情况:一个线程需要从磁盘读取、执行并处理接收到的数据,而在这种情况下,所有在磁盘上等待的其他X个线程现在都有一个线程可以“运行”(其他线程仍需等待)。但是,每个线程都是在其他线程未启动之前读取和处理数据的:您什么也得不到

  • FileInputStream上的
    read()
    通常非常慢。这些都是低级操作,但磁盘往往一次读取整个数据块,无法一次读取一个字节。因此,
    read()
    被实现为:读取可以读取的最小数据块(通常仍然是4096个或更多字节),从该数据块中取出所需的一个字节,然后将剩余部分扔进垃圾桶。换句话说,如果您通过调用
    .read()
    4906次来读取文件,那么将从磁盘读取同一块4096次。鉴于致电:

  • 将用块填充整个字节数组,因此速度将提高4096倍

    如果您的目标是学习多线程,“读取文件”不是学习它的方法;你无法通过这种方式观察到任何有意义的行为


    如果您的目标是加速BMP处理,“多线程读取过程”现在也是一种方式。我无法解释为什么这里会涉及多线程。它既不适合了解它,也不适合加速任何事情。

    使用
    FileInputStream fis=newfileinputstream(file)然后在其上执行
    int val=fis.read()
    。val==-1表示文件结束。是否要创建例如4个线程并在4个不同线程中读取图像的四个不同部分?@mahfujasif是!我是Java的初学者,我不知道如何做到这一点,我一直在努力,因为我甚至不知道这是否可能。我使用生产者读取数据块,消费者将其写入文件的最后一个变量。@JayC667感谢您的回复!在这个例子中谁是文件,如果它是图像中的字节数组,这不意味着我应该已经读取了图像(数组)吗?我只想通过这条路径,以便只分块阅读。非常感谢您的回复,我将尝试使用您的方法!这个例子是我们的教授给我们的,我们必须构建一个图像过滤器,其中图像的读取是通过线程完成的。它很慢,但我不知道如何用另一种方式来做。只是一个奎斯顿,对不起!在本例中,谁是fileIn,是ByteArrayInputStream还是DataInputStream?而且,这难道不需要已经在fileIn中写入文件吗?我试图只通过这条路,直接从那里阅读。可能吗?
    byte[] b = new byte[4096];
    int read = fileIn.read(b);