当前位置: 首页 > ds >正文

7.22 Java基础 | I/O流【下】

【前情回顾】

 字节流

  • OutputStream常用方法  write() \flush()\close()\【都是void类型的函数】
  • FileOutputStream使用文件输出流将“幼稚鬼同学快学习”写入磁盘文件                              FileOutputStream(String name)   /      FileOutputStream(String name,boolean append)/FileOutputStream(File file)     /       FileOutputStream(File file,boolean append)
  • InputStream常用方法  read()、available()【除了close都是int类型函数】
  • FileOutputStream将文件信息从磁盘中读取到内存中,并在控制台输出
  • 使用字节流实现磁盘文件拷贝

感觉上一篇写了一tan 粑粑,可能当时人不太清醒而且不够理解

 重新理解了一遍概念:

I/O流是磁盘内存之间的实现数据交互通道,I代表input,o代表Output,而FileOutputStream文件输出流 就是一个具有   “把内存中的数据 传给 文件” 的功能的通道,而“内存中的数据”可以代表如“数组”中的数据,所以前边说:把数组中的数据传给文件。

所以后来编写程序的时候说:把数组(内存)中的数据传入通道,通道实现数组和文件之间的数据交互。通道.write(数组)

可能图片能更清楚一点:

(自己的理解,欢迎指正)


 

FileOutputStream使用文件输出流将“幼稚鬼同学快学习”写入磁盘文件    

将数组内容写入"通道":法一:使用for循环一个一个输入法二:一次性全部发送过去法三:使用偏移量(注意考虑数组越界的问题)

三个方法:

主要代码部分: 创建文件、创建通道、创建数组、数据交换

           File dir=new File("D:\\JFM code\\Java_test\\d722");if(!dir.exists()){dir.mkdirs();}File f=new File(dir,"io_3.txt");//构建通道 文件与(“到”)内存之间的通道,文件输出流FIleOutputStream是从内存到文件的数据传输通道OutputStream os=new FileOutputStream(f,true);//创建字符串,并将字符串变成数组String text="幼稚鬼同学快学习";byte[] bytes=text.getBytes();法一        for(byte a:bytes){os.write(a);}法二        os.write(bytes);法三        os.write(bytes,3,bytes.length-3);os.flush();os.close();

结果一:

结果二:

结果三:


 

FileOutputStream将文件信息从磁盘中读取到内存中,并在控制台输出 

创建文件对象、创建通道、创建数组

此时读取的是一串数字:

new String(buf) 字节数组转化成字符串

结果转化成字符串: 

 小 贴士(加new String的原因):
  1. 数据类型不同:
    • buf 是字节数组(byte[]),存储的是原始二进制数据(0-255 的数值)
    • 字符串(String)是字符序列,存储的是 Unicode 字符
  2. 为什么需要转换
    • System.out.println() 可以直接打印字节数组,但会输出其内存地址(如 [B@1b6d3586
    • 通过 new String(buf) 可以将字节数组按照默认字符集(通常是 UTF-8)解码为有意义的字符串
    • 如果直接打印字节数组,得到的是无意义的内存标识,而不是实际内容

通道中的数据太大了,而内存不够,只能一次读取部分,多读几次

方法一:

 

 方法二:

小贴士  read(byte[] buf) 方法的补充:

  1. 当读取到数据时:返回实际读取的字节数(范围是 1~ 缓冲区长度)。

  2. 当流结束时:返回 -1(表示已经到达流的末尾,没有更多数据可读取)。

  3. 特殊情况

    • 只有在使用带有缓冲区的 read(byte[] buf) 方法时,才可能返回 0,但这并不表示 "没有数据",而是表示:

      • 缓冲区长度为 0(buf.length == 0

      • 或者在非阻塞模式下,当前确实没有数据可读取(但流并未结束)

http://www.xdnf.cn/news/16160.html

相关文章:

  • 小米视觉算法面试30问全景精解
  • HCIA/IP(一二章)笔记
  • Redis 初识
  • vcs门级仿真(后仿真)指南
  • Linux研学-Tomcat安装
  • 深入解析Hadoop中的Region分裂与合并机制
  • [pdf epub]《软件方法》电子书202507更新下载
  • 如何安装没有install.exe的mysql数据库文件
  • C# 析构函数
  • 虚幻5入门教程:如何在虚幻5中创建一个C++的Plugin
  • Zabbix 6.0+ 使用官方模板监控 Redis 数据库的完整配置指南
  • Linux 内核不能直接访问物理地址,必须通过虚拟地址访问。
  • Java+Vue构建的固定资产内控管理系统,融合移动端便捷与后台管理强大功能,模块完备,提供全量源码,轻松实现资产智能管控
  • 【uboot/kernel1】启动流程,环境变量,内存,initramfs
  • 构建智能视频中枢--多路RTSP转RTMP推送模块在轨道交通与工业应用中的技术方案探究
  • 知识库搭建之Meilisearch‘s 搜索引擎 测评-东方仙盟测评师
  • 二分查找-852.山峰数组的峰顶索引-力扣(LeetCode)
  • 【coze扣子】第1篇:coze快速入门
  • 【Spring AI 0基础教程】1、基础篇 环境搭建 - 智能天气预报助手
  • csp基础知识——递推
  • OpenCV快速入门之CV宝典
  • axios统一封装规范管理
  • oracle查询数据结构滤涉及的sql语句
  • Oracle 12c 创建数据库初级教程
  • 消息队列学习
  • .net 警告【代码 CS1998】此异步方法缺少 “await“ 运算符,将以同步方式运行。
  • VRRP技术
  • 基于springboot的医院管理系统(源码+论文+开题报告)
  • AWS RDS 排查性能问题
  • 【AI总结】网线技术演进史:从语音电缆到40Gbps的蜕变之路