繁体   English   中英

使用线程读取 Java 中的图像

[英]Reading an image in Java with threads

我有一个关于阅读 Java 中的图像的问题。 我正在尝试使用线程读取图像,我很好奇是否这样做: myInputFile = new FileInputStream(myFile); 我是否已经阅读了全部数据。 我已经使用线程以 4 个块的形式阅读了它,我很好奇我是否只阅读了两次,一次使用线程,一次使用FileInputStream ,或者FileInputStream究竟做了什么。 提前致谢!

FileInputStream尚未读取您的文件,只需调用它: myInputFile = new FileInputStream(myFile); .

它基本上只为您提供底层文件的句柄,并准备通过打开与该文件的连接来读取它。 它还运行一些基本检查,包括文件是否存在以及它是否是正确的文件而不是目录。

您可以在此处找到的 JavaDocs 中说明了以下内容:

通过打开与实际文件的连接来创建 FileInputStream,该文件由文件系统中的 File object 文件命名。 创建一个新的 FileDescriptor object 来表示这个文件连接。

首先,如果存在安全管理器,则调用其 checkRead 方法,并将文件参数表示的路径作为其参数。

如果命名文件不存在,是目录而不是常规文件,或者由于某些其他原因无法打开读取,则抛出 FileNotFoundException。

只有通过调用FileInputStream.read方法,它才会开始读取并返回文件的内容。

因此FileInputStream.read()方法将只读取文件的一个字节,而FileInputStream.read(byte[] b)方法将读取与字节数组b的大小一样多的字节。

编辑:

因为逐字节读取文件非常慢,并且使用普通的FileInputStream.read(byte[] b)方法可能有点麻烦,所以使用BufferedInputStream处理 Java 中的文件是一个好习惯。

默认情况下,它将读取文件的下一个 8192 字节并将其缓冲在内存中以便更快地访问。 所以BufferedInputStream.read方法每次调用仍将只返回一个字节,但在BufferedInputStream中,它将主要从内部缓冲区提供服务。 只要请求的字节在此缓冲区中,它们就会从中得到服务。 只有在真正需要时才会再次访问底层文件(-> 请求的字节不再在缓冲区中)。 这大大减少了对硬件的读取访问次数(相比之下,这是此过程中最慢的操作),因此大大提高了读取性能。

初始化如下所示:

InputStream i = new BufferedInputStream(new FileInputStream(myFile));

它的处理与“普通” FileInputStream完全相同,因为它们共享相同的InputStream接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM