FileInputStream和Files.newInputStream?

前言

在上传文件的时候,发现还有一个新的东西叫做Files.newInputStream,就稍微看了一下下。主要应用示例在这篇文章中,也可以看这里。

FileInputStream

很久很久以前大家就在用这个库了,是一个文件流,可以读取文件。

主要用法也是直接新建:

FileInputStream fis = new FileInputStream("filePath");

或者

FileInputStream fis = new FileInputStream(new File("filePath"));

在源码中这两个的效果也是一样的。

使用完毕后,关闭:

fis.close();

或者你想稳妥一点:

fis.finalize();

这个库主要就是以只读的方式打开文件,读取文件,最后处理。就不再多说了。网上研究这个的人比我吃的饭都多。

Files.newInputStream

这个库是java.nio.file.Files中的方法,是FileInputStream的升级版。

我们来看看这个玩意的源码是什么意思:

public static InputStream newInputStream(Path path, OpenOption... options) throws IOException {
    return provider(path).newInputStream(path, options);
}

通过自己的静态方法provider,获取到FileSystemProvider,然后调用newInputStream方法。

这个FileSystemProvider是一个抽象类,也提供了一个newInputStream方法:

public InputStream newInputStream(Path path, OpenOption... options) throws IOException {
  if (options.length > 0) {
    for (OpenOption opt: options) {
      // All OpenOption values except for APPEND and WRITE are allowed
      if (opt == StandardOpenOption.APPEND ||
          opt == StandardOpenOption.WRITE)
          throw new UnsupportedOperationException("'" + opt + "' not allowed");
    }
  }
  return Channels.newInputStream(Files.newByteChannel(path, options));
}

在这里,将通过Channels类的newInputStream方法给出输入流。

为什么偏偏要这么做呢?

最后看到这个方法是这样的:

/**
 * Constructs a stream that reads bytes from the given channel.
 *
 * <p> The <tt>read</tt> methods of the resulting stream will throw an
 * {@link IllegalBlockingModeException} if invoked while the underlying
 * channel is in non-blocking mode.  The stream will not be buffered, and
 * it will not support the {@link InputStream#mark mark} or {@link
 * InputStream#reset reset} methods.  The stream will be safe for access by
 * multiple concurrent threads.  Closing the stream will in turn cause the
 * channel to be closed.  </p>
 *
 * @param  ch
 *         The channel from which bytes will be read
 *
 * @return  A new input stream
 */
public static InputStream newInputStream(ReadableByteChannel ch) {
  checkNotNull(ch, "ch");
  return new sun.nio.ch.ChannelInputStream(ch);
}

不难看出,这个方法的优势正如注释所述,是线程安全的。

为什么偏偏他是线程安全的?

这就是sun.nio.chChannelInputStream类的作用了。这个类以ReadableByteChannel作为构造函数。ReadableByteChannel类是这样注释的:

/**
 * A channel that can read bytes.
 *
 * <p> Only one read operation upon a readable channel may be in progress at
 * any given time.  If one thread initiates a read operation upon a channel
 * then any other thread that attempts to initiate another read operation will
 * block until the first operation is complete.  Whether or not other kinds of
 * I/O operations may proceed concurrently with a read operation depends upon
 * the type of the channel. </p>
 *
 *
 * @author Mark Reinhold
 * @author JSR-51 Expert Group
 * @since 1.4
 */

public interface ReadableByteChannel extends Channel {}

这就是线程安全的非阻塞IO的核心了。

所以,不难看出,这个类最核心的地方就是将IO模式转变为非阻塞的NIO模式,这也顺应了现阶段高吞吐量或处理大文件的应用场景,趁着CPU把任务丢给磁盘的时候,趁着闲下来的时间做点别的事,提升处理效率。

而这一点,也使得Files.newInputStream能够进一步与其他的NIO操作集成,从而在处理大文件的时候,充分利用缓冲区的优势,处理起来也比FileInputStream要快很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/598716.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一、vue3专栏项目 -- 1、项目介绍以及准备工作

这是vue3TS的项目&#xff0c;是一个类似知乎的网站&#xff0c;可以展示专栏和文章的详情&#xff0c;可以登录、注册用户&#xff0c;可以创建、删除、修改文章&#xff0c;可以上传图片等等。 这个项目全部采用Composition API 编写&#xff0c;并且使用了TypeScript&#…

阴影渲染在AI去衣技术中的关键作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;深度学习在图像处理领域取得了突破性的进展。其中&#xff0c;AI去衣技术作为一种高度复杂的图像到图像的转换过程&#xff0c;不仅要求算法能够精确地识别并处理衣物纹理和结构&#xff0c;还要求生成的结果具有高度的…

进制乘法表(任意进制均可以)

#include <iostream> // 包含输入输出流库 #include <vector> // 包含向量库&#xff0c;未使用&#xff0c;可以删除 #include <string> // 包含字符串库using namespace std; // 使用标准命名空间// 将十进制数转换为P进制形式的字符串 string toBase(…

Mac数据恢复软件快速比较:适用于Macbook的10佳恢复软件

数据丢失导致无数个人和组织每天损失大量资金。更糟糕的是&#xff0c;某些文件具有货币价值和情感意义&#xff0c;使它们不可替代&#xff0c;并使数据恢复成为唯一可行的选择。最好的消息是Mac用户可以从各种数据恢复程序中进行选择。为了帮助您尽可能快速、轻松地恢复丢失的…

品鉴中的音乐搭配:如何为红酒选择合适的音乐伴侣

品鉴红酒时&#xff0c;音乐是一个不可忽视的元素。合适的音乐能够增强红酒的口感&#xff0c;提升品鉴体验。对于云仓酒庄雷盛红酒而言&#xff0c;如何为其选择合适的音乐伴侣&#xff0c;是一个值得探讨的话题。 首先&#xff0c;了解红酒的风格和特点至关重要。云仓酒庄雷…

vin码查询接口快速对接

vin码查询接口全称叫VIN车辆识别代码查询接口&#xff0c;也叫车架号查询接口&#xff0c;指的是通过车辆VIN&#xff08;车架号&#xff09;查询车辆相关信息&#xff0c;如车辆品牌、车型、油耗、车身形式、排量等等。那么vin查询接口如何快速对接呢&#xff0c;接下来我们聊…

ODOO17数据库安全策略一(ODOO17 Database Security Policy I)

ODOO17作为ERP软件&#xff0c;其核心优势在于数据安全。凭借强大的原生安全机制及灵活的配置&#xff0c;确保数据安全无忧&#xff1a; ODOO17, as an ERP software, boasts its significant advantage in exceptional data security performance. It effectively ensures wo…

##06 神经网络训练基础:一步步构建和完善你的第一个模型

文章目录 前言开始之前&#xff1a;理解神经网络的构成第一步&#xff1a;初始化你的网络和数据第二步&#xff1a;选择损失函数和优化器第三步&#xff1a;训练循环第四步&#xff1a;评估模型和调整第五步&#xff1a;迭代改进示例项目&#xff1a;手写数字识别结语 前言 在…

C#简单创建DLL文件并调用

DLL是Dynamic Link Library的缩写&#xff0c;意为动态链接库。动态链接库其实是由编译器将一系列相关的类型编译、链接并封装成一个独立的文件&#xff0c;与对其进行调用的程序分开。这样一个独立的文件相当于程序的一个模块&#xff0c;如果需要对程序进行更新&#xff0c;只…

大模型日报|今日必读的 3 篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.清华团队提出“智能体医院”&#xff1a;医生智能体可实现自我进化 在这项工作中&#xff0c;来自清华大学的研究团队提出了一种名为“智能体医院”&#xff08;Agent Hospital&#xff09;的模拟医院&#xff0c;…

火山引擎数据飞轮携手美宜佳 探索拓店营销新思路

在刚刚过去的 3 月&#xff0c;美宜佳又交出了门店增长的高分答卷。 最新数据显示&#xff0c;美宜佳在全国的连锁店数已经超过 35000 家&#xff0c;每年净增 3000-4000 家店&#xff0c;月均服务顾客超 2 亿人次&#xff1b;同时&#xff0c;在中国连锁经营协会(CCFA)近日发布…

本机MySQL数据库服务启动了,但是cmd登录不上10061

注意&#xff1a;不建议安装MySQL8&#xff0c;建议直接使用phpstudy中自带的MySQL5.7 错误信息 ERROR 2003 (HY000): Cant connect to MySQL server on x.x.x.x (10061) 原因 可能是端口号错误。比如修改了my.ini中&#xff0c;或者phpstudy中数据库端口的配置&#xff0c;…

PLX82-EIP-61850 主要特点是什么?

PLX82-EIP-61850是一种基于以太网的电力线通信&#xff08;PLC&#xff09;设备&#xff0c;用于在现有的电力线网络上实现数据通信。这种设备通常用于智能电网、智能家居和工业自动化等领域&#xff0c;以实现远程监控和控制功能。 PLX82-EIP-61850的主要特点包括&#xff1a…

小心电子合同这个坑:PS章

近期&#xff0c;我发现网上有很多教程教大家如何自己动手用PS制作电子章&#xff0c; 看似方便&#xff0c;实则危机四伏&#xff01; 通过PS技术&#xff0c;你可以生成任何一家公司的印章&#xff0c; 用以冒充电子章&#xff0c;或打印出来冒充实体章。 甚至还能进行做旧…

阿里云国际服(alibabacloud)介绍、注册、购买教程?

一、什么是阿里云国际版&#xff1f; 阿里云分为国内版和国际版。国内版仅面向中国大陆客户&#xff0c;国际版面向全球客户。 二、国际版与国内版有何异同&#xff1f; 1&#xff09;异&#xff1a;除了目标客户不同&#xff0c;运营主体不同&#xff0c;所需遵守的法律与政…

【如此简单!数据库入门系列】之效率基石 -- 磁盘空间管理

文章目录 1 前言2 磁盘空间管理3 磁盘空间管理的实现4 存储对象关系5 总结6 系列文章 1 前言 如何将表中的记录存储在物理磁盘上呢&#xff1f; 概念模式中&#xff0c;记录&#xff08;Record&#xff09;表示表中的一行数据&#xff0c;由多个列&#xff08;字段或者属性&…

Web 3.0时代:软文发稿对企业品牌的影响

Web 3.0的到来&#xff0c;标志着我们已经进入了一个全新的互联网时代。在这个新时代中&#xff0c;信息的生成和传播有了更多的可能性和更广的空间。作为企业品牌宣传的重要手段之一的软文发稿&#xff0c;在Web 3.0时代将会面临什么样的挑战和机遇&#xff1f; 首先&#xf…

YouTube广告全教学:形式、投放步骤与技巧(2024年更新)

YouTube作为全球最大的视频分享和观看平台吸引了大量的观众&#xff0c;这一平台以其无与伦比的用户参与度和覆盖范围&#xff0c;重新定义了人们获取与分享知识的方式&#xff0c;同时也为企业开辟了一片前所未有的营销蓝海。 据统计&#xff0c;全球观众平均每天观看 YouTub…

2024深圳杯数学建模C题完整思路+配套解题代码+半成品参考论文持续更新

所有资料持续更新&#xff0c;最晚我们将于5.9号更新参考论文。 【无水印word】2024深圳杯A题成品论文23页mtlab(python)双版本代码https://www.jdmm.cc/file/27105652024深圳杯数学建模C题完整思路配套解题代码半成品参考论文持续更新https://www.jdmm.cc/file/2710545 深圳杯…

Postman接口关联实战解析

在使用postman做接口测试时&#xff0c;有时候后面的接口需要获取前面接口的某一个返回值做为请求参数&#xff0c;这时就可以使用关联。 如从A接口提取出a字段的值&#xff0c;供B接口的b字段使用。 一个接口的返回报文如下&#xff1a; {"retCode": "0&quo…
最新文章