I/O流之进步认识、InputStream以及FileInputStream

2023-11-19

File类: 用于描述一个文件或者文件夹的。
通过File对象,我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要使用IO流技术。

IO流(Input Output)
IO流解决问题: 解决设备与设备之间的数据传输问题。
内存—>硬盘 硬盘—>内存

IO流技术:

IO流分类:
1)如果是按照数据的流向划分:
a)输入流 b)输出流
2)如果按照处理的单位划分:
a)字节流: 字节流读取得都是文件中二进制数据,读取到二进制数据不会经过任何的处理。
b)字符流: 字符流读取的数据是以字符为单位的 。字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能识别的字符。
字符流 = 字节流 + 解码

输入字节流:
——–| InputStream 所有输入字节流的基类 抽象类
————| FileInputStream 读取文件数据的输入字节流

使用FileInputStream读取文件数据的步骤:
1、找到目标文件。
2、建立数据的输入通道。
3、读取文件中的数据。
4、关闭资源。

四种读取数据的方法:
读取的方式一,缺陷: 无法读取完整一个文件的数据。

public static void readTest1() throws IOException{
    //1. 找到目标文件
    File file = new File("F:\\a.txt");
    //建立数据的输入通道。
    FileInputStream fileInputStream = new FileInputStream(file);
    //读取文件中的数据
    int content = fileInputStream.read(); 
    // read() 读取一个字节的数据,把读取的数据返回。
    System.out.println("读到的内容是:"+ (char)content);
    //关闭资源    实际上就是释放资源。 
    fileInputStream.close();
}

方式2 : 使用循环读取文件的数据。

public static void readTest2() throws IOException{
    long startTime = System.currentTimeMillis();
    //找到目标文件
    File file = new File("E:/180192541/FileRecv/DSC_0007.JPG");
    //建立数据的输入通道
    FileInputStream fileInputStream = new FileInputStream(file);
    //读取文件的数据
    int content = 0; //声明该变量用于存储读取到的数据
    while((content = fileInputStream.read())!=-1){
        System.out.print((char)content);
    }
    //关闭资源
    fileInputStream.close();    
    long endTime = System.currentTimeMillis();
    System.out.println("读取的时间是:"+ (endTime-startTime)); 
}

方式3:使用缓冲数组读取,缺点: 无法读取完整一个文件的数据。

public static void readTest3() throws IOException{
    //找到目标文件
    File file = new File("F:\\a.txt");
    //建立数据的输入通道
    FileInputStream fileInputStream = new FileInputStream(file);
    //建立缓冲字节数组,读取文件的数据。
    byte[] buf = new byte[1024];  
    //相当于超市里面的购物车。
    // 如果使用read读取数据传入字节数组,那么数据是存储到字节数组中的,而这时候read方法的返回值是表示的是本次读取了几个字节数据到字节数组中。
    System.out.println("length:"+ length);  
    //使用字节数组构建字符串
    String content = new String(buf,0,length);
    System.out.println("内容:"+ content);
    //关闭资源
    fileInputStream.close();
}

方式4:使用缓冲数组配合循环一起读取。

public static void readTest4() throws IOException{
    long startTime = System.currentTimeMillis();
    //找到目标文件
    File file = new File("E:/180192541/FileRecv/DSC_0007.JPG");
    //建立数据的输入通道
    FileInputStream fileInputStream = new FileInputStream(file);
    //建立缓冲数组配合循环读取文件的数据。
    //保存每次读取到的字节个数。
    byte[] buf = new byte[1024]; 
    //存储读取到的数据缓冲数组的长度一般是1024的倍数,因为与计算机的处理单位。理论上缓冲数组越大,效率越高
    while((length = fileInputStream.read(buf))!=-1){ 
    // read方法如果读取到了文件的末尾,那么会返回-1表示。
        System.out.println(length);
        System.out.print(new String(buf,0,length));
    }
    //关闭资源
    fileInputStream.close();
    long endTime = System.currentTimeMillis();
    System.out.println("读取的时间是:"+ (endTime-startTime)); 
}

第一种和第三种有一定的缺陷不建议使用,所以一般使用第二种和第四种,但是大家应该注意到了其中的currentTimeMillis()方法了,通过这种方法得出了第四种比第一种的效率高,输入数据数据快,尤其文件越大,效果越明显。

大家仔细观察四种方法,无论哪种最后都会有fileinputstream.close()方法,那如果读取完一个文件的数据的时候,我不关闭资源有什么影响?
答: 资源文件一旦使用完毕应该马上释放,否则其他的程序无法对该资源文件进行其他的操作(譬如我想删除这个文件,就会被拒绝操作)。

有这么一个问题,如果我的read()方法每次仅读取4个字节,而我一共有七个字节,那结果第二次读取时,第四位是清空了‘/0’还是上一次的第四位了。
举例:
a.txt文档内容:aaaabbb
第二次读取结果是:bbba这代表第二次读取时替代,还是bbb’\0’代表第二次读取时为清空。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

I/O流之进步认识、InputStream以及FileInputStream 的相关文章

  • html图片平铺div,前端小知识——图片平铺问题

    图片平铺有两种方式 直接写img标签或者通过background image方式 1 img标签 HTML CSS row margin 0 auto width 100 img width 100 height 100 margin 0
  • 用于Arduino的S4A图形化编程图文详解

    文章结构 1 说明 2 实操 2 1 S4A安装 2 2 Arduino IDE 安装 2 3 下载S4A的固件 2 4 连接 2 5 刷入S4A固件 2 6 打开S4A并测试 3 附录 Uno引脚图 1 说明 作者还拥有个人公众号 会写一
  • Dcat-admin 多级联动

    Dcat admin 2 x 多级联动 需求 一个省市区的三级联动功能 在表单中 需要可以实现三级联动 在列表的查询中 也需要实现三级联动 实现说明 前提 dcat admin 提供了 一个 load 方法 有两个参数 第一个是选项框的字段
  • deepin操作系统无法打开蓝牙

    自己用的deepin系统无法使用蓝牙传送图片 发现系统里面找不到这个功能 可以使用命令安装蓝牙功能 sudo apt install bluetooth blueman blueman assistant 安装以后 很方便手机传送文件
  • 怎样修改一个正在运行的soket的端口

    0 目录 整体架构目录 ASP NET Core分布式项目实战 目录 在开发项目的过程中 我新创建了一个controller 发现vs会给我们直接在controller头添加前缀 比如 Route api controller 即在访问接口
  • ESB开发WebService接口

    1 概述 在进行系统间集成时经常利用WebService 但是从建立WebService和调用的重复性和维护性的工作量都相当大 首先简单介绍一下 ESB全称为Enterprise Service Bus 即企业服务总线 它是传统中间件技术与
  • HertzBeat监控部署及使用

    易用友好的高性能监控告警系统 网站监测 PING连通性 端口可用性 数据库监控 API监控 自定义监控 阈值告警 告警通知 邮件微信钉钉飞书 安装部署 HertzBeat最少依赖于 关系型数据库MYSQL8 实际亲测用mysql5 7 也行
  • 单元测试总结

    概念 百度百科 单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 对于单元测试中单元的含义 一般来说 要根据实际情况去判定其具体含义 如C语言中单元指一个函数 Java里单元指一个类 图形化的软件中可以指一个窗
  • (算法-双指针)判断子序列

    算法 双指针 判断子序列 题目描述 题目分析 解决方案 题目描述 给定一个长度为 n 的整数序列 a1 a2 an 以及一个长度为 m 的整数序列 b1 b2 bm 请你判断 a 序列是否为 b 序列的子序列 子序列指序列的一部分项按原有次
  • 1.windows系统:

    conda更新 conda update conda conda安装tensorflow 首先建立一个新的虚拟环境 1 conda create n my env python 3 6 n 也可以写全为 name 激活环境并安装tensor
  • 微信二次分享

    微信二次分享 效果演示 如何运行项目 克隆代码到本地 git clone https github com Jameswain WeiXinSDK git 安装依赖 npm i 运行项目 npm run dev 通过charles配置代理
  • 无法加载 DLL“halcon”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)

    将项目拷贝到没有安装halcon的电脑上 出现标题所示异常 参考文章 https www 51halcon com thread 997 1 1 html 我的解决办法是将halcon dll 文件拷贝到 bin debug目录下
  • Vscode连接远程服务器(一套配置成功)

    安装远程开发插件Remote Development 1 在商店中搜索Remote Development并安装 2 添加服务器连接配置 点击该选项卡 会进入SSH TARGETS的添加 如下图所示 填写配置信息可在下边操作中查看 修改 想
  • vue中 el-table 实现拖拽排序教程

    el table基础上如何实现表格上下拖拽排序 element ui 表格没有自带的拖拽排序的功能 只能借助第三方插件Sortablejs来实现 实现步骤 1 安装Sortable js npm install save sortablej
  • 初识区块链

    这篇博客主要从社会和经济层面来直白的向大家讲述区块链是什么 比特币是什么 分享的内容仅限于自己的理解 里面会存在本人的观点 但是希望读者能有自己的独立看法 审慎的阅读本文 甚至能考虑到我的认知不足导致的偏差 不为任何投资电子货币者提供意见
  • Mysql命令use:使用数据库

    use命令可以让我们来使用数据库 use命令格式 use lt 数据库名 gt 例如 如果xhkdb数据库存在 尝试存取它 mysql gt use xhkdb 屏幕提示 Database changed 1 use 语句可以通告MySQL
  • java加载多个properties文件_Spring加载配置和读取多个Properties文件的讲解

    一个系统中通常会存在如下一些以Properties形式存在的配置文件 1 数据库配置文件demo db properties database url jdbc mysql localhost smaple database driver
  • 全卷积网络(FCN)与图像分割

    全卷积网络 FCN 与图像分割 从图像分类到图像分割 卷积神经网络 CNN 自2012年以来 在图像分类和图像检测等方面取得了巨大的成就和广泛的应用 CNN的强大之处在于它的多层结构能自动学习特征 并且可以学习到多个层次的特征 较浅的卷积层
  • 西安烽火通信面经——Java后端开发

    由于地方比较太偏远 2号线 3号线 6号线 等了半个小时的公交还不来 只能打滴滴 一面 技术面 1 先自我介绍一下 这个没什么说的 简单介绍了一下 2 说一下Java语言的跨平台性 这个是基于JVM实现的 简单说了一下 3 说一下Java语

随机推荐

  • 1300*C. Page Numbers

    解析 注意单个数的情况 include
  • 使用pycharm入门python的一些注意点

    今儿在帮别人跑一段python代码 实际上我对python并不熟悉 只能边摸索边尝试 选择了pycharm这个工具 一 怎么安装python使用的库文件 能用来安装python的库文件的 有很多种办法 这里只介绍pip和pip3 因为pip
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • FFmpeg下载及命令行使用

    下载地址 访问FFmpeg官网 选择Dlownload 选择 Windows Package 选择相应版本 点击进行下载 并进行解压 可得到如下几个文件 版本说明 Static 只包含了3个体积很大的exe Shared 除了体积很小的ex
  • DeepSpeed配置参数 - 快速上手

    目录 DeepSpeed配置参数 快速上手 batch Size optimizer scheduler fp16 zero optimization csv monitor 例子 DeepSpeed配置参数 快速上手 DeepSpeed是
  • AI推荐的初级算法工程师学习路线

    学习算法是一项长期而且不断更新的工作 以下是一份初学者从入门到达到任职初级算法工程师要求的学习内容大纲 供您参考 1 编程语言 首先学习至少一门主流编程语言 如Python C Java等等 2 数据结构 学习数据结构是学习算法的基础 建议
  • CentOS 防火墙配置 80端口

    看了好几个页面内容都有错 下面是正确方法 sbin iptables I INPUT p tcp dport 80 j ACCEPT sbin iptables I INPUT p tcp dport 22 j ACCEPT 然后保存 et
  • 【STM32】标准库 串口下载以及STLINK

    STM32的串口下载 打开FlyMcu 接线就像之前那样接 USART1串口通信 必须是1 其他的不支持串口通信 编译之后就会生成HEX文件 而且上面的按钮Select也可以选择生成的位置 搜索串口 选择 然后波特率选择115200 在联机
  • 【tvm官网教程01】设计和架构-1

    tvm官网教程01 设计和架构 1 目的 1 编译流 1 1 关键数据结构 1 2 Transformations 1 2 1 变换的分类 1 2 2 relay transform 1 2 2 1 子函数 1 2 2 2 overall问
  • Consul服务注册与发现

    目录 一 Consul简介 一 官网 二 特点 二 安装并运行Consul 一 官网安装说明 二 下载 三 使用开发模式启动 三 服务提供者 四 服务消费者 五 三个注册中心异同点 一 CAP理论 二 AP架构 三 CP架构 一 Consu
  • 带有两个/三个未知数的算数-几何均值不等式的证明及其思路解析

    这是一篇学习手记 注 尽管文中大量使用了 一个显然的想法 自然而然 我们会想 等词语 我们也必须承认 这些伟大成果的证明需要天才的思路和不断的尝试 因此 第一次学习理解不了是很有可能的 比如我 基础 带有两个未知数的算数 几何均值不等式的证
  • MySQL同时In俩个字段,In多个字段,Mybatis多个In查询问题,Mysql多个IN查询多出数据问题,Mysql多个IN查询 数据准确问题

    背景 今天产品验收的时候 导入了大量数据 发现造价项目某个查询列表数据多出了几条数据 看了Mybatis查询 才发现是同时使用了多个IN查询导致的问题 入参是对象列表 In值是分开循环赋值的 问题就出在这里 需要根据两个字段去查询多个值 这
  • Barcode Reader Toolkit for Windows v8.3.3.3正式发布!

    Barcode Reader Toolkit for Windows 是一个工具包 允许开发人员在其应用程序中添加条形码检测 该工具包将图像文件或内存位图作为输入 并返回有关每个条形码的信息 包括值 类型和位置 所有主要的线性 1 D 条形
  • 1流明等于多少lux_要想投影仪画质清晰,投影仪流明和对比度不得不看

    在选购投影机的时候 大家都会根据预算 尽可能选择画质清晰的投影机 一般来说会根据使用场景的不同 从XGA到1080P甚至4K的分辨率 那么 投影机的画质清晰效果只和分辨率有关么 其实不是 一款画质效果好的投影机 和投影机的流明和对比度也是息
  • Vue—实现动画、过度效果

    动画效果
  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • extends OverWrite

    extends 扩展延伸 继承 用这个方法对class有了进一步的汇总 减少了对具有相同属性的类重复enter的工作量 使函数模块化更高 注 构造函数内的属性和方法能继承 package Extends 定义一个父类public class
  • 远程桌面连接技术【包含出现问题的解决手段】

    远程桌面连接技术 文章目录 远程桌面连接技术 前言 定义 远程连接的方法 远程桌面协议 RDP 由于我没有两台电脑 这里用虚拟机演示 1 为两台计算机设置相同的网段的 IP 地址 2 远程计算机的设置 2 1 在电脑中找到 远程桌面连接 2
  • 【单片机】keil和Proteus使用教程

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 kei
  • I/O流之进步认识、InputStream以及FileInputStream

    File类 用于描述一个文件或者文件夹的 通过File对象 我们可以读取文件或者文件夹的属性数据 如果我们需要读取文件的内容数据 那么我们需要使用IO流技术 IO流 Input Output IO流解决问题 解决设备与设备之间的数据传输问题