如何解决使用线程在 Java 中读取图像
我有一个关于在 Java 中读取图像的问题。我正在尝试使用线程读取图像,我很好奇是否这样做:
myInputFile = new FileInputStream(myFile);
我是否已经阅读了整个数据。我已经使用线程将它分 4 块阅读了,我很好奇我是否只阅读了两次,一次使用线程,一次使用 FileInputStream
,或者 FileInputStream
究竟是做什么的。提前致谢!
解决方法
FileInputStream
尚未读取您的文件,只需将其调用为:myInputFile = new FileInputStream(myFile);
。
它基本上只为您提供底层文件的句柄,并准备通过打开与该文件的连接来读取它。它还会运行一些基本检查,包括文件是否存在以及它是否是正确的文件而不是目录。
JavaDocs 中说明了以下内容,您可以在其中找到 here:
通过打开与实际文件的连接来创建 FileInputStream, 由文件系统中的 File 对象文件命名的文件。一个新的 创建 FileDescriptor 对象来表示此文件连接。
首先,如果有安全管理器,则调用其checkRead方法 以文件参数表示的路径作为其参数。
如果命名的文件不存在,则是一个目录而不是一个普通的 文件,或由于某些其他原因无法打开读取然后 抛出 FileNotFoundException。
只有调用 FileInputStream.read
方法才开始读取并返回文件内容。
因此,FileInputStream.read()
方法将仅读取文件的一个字节,而 FileInputStream.read(byte[] b)
方法将读取与字节数组 b
的大小一样多的字节。
编辑:
因为逐字节读取文件非常慢,而且使用普通的 FileInputStream.read(byte[] b)
方法可能有点麻烦,所以在 Java 中使用 BufferedInputStream
处理文件是一个好习惯。>
默认情况下,它将读取文件的下一个 8192 字节并将其缓冲在内存中以加快访问速度。所以 BufferedInputStream.read
方法每次调用仍然只返回一个字节,但在 BufferedInputStream
中它主要从内部缓冲区提供。只要请求的字节在这个缓冲区中,它们就会从中得到服务。只有在真正需要时才会再次访问底层文件(-> 请求的字节不再在缓冲区中)。这大大减少了对硬件的读取访问次数(相比之下,这是此过程中最慢的操作),因此大大提高了读取性能。
初始化看起来像这样:
InputStream i = new BufferedInputStream(new FileInputStream(myFile));
对它的处理与“普通”FileInputStream
完全相同,因为它们共享相同的 InputStream
接口。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。