首页 > 其他分享 >m2_day09 [IO流]

m2_day09 [IO流]

时间:2024-06-13 23:21:39浏览次数:14  
标签:day09 字节 int 过滤 FileOutputStream IO m2 byte data

课程内容:
  • 流的概述和分类

  • InputStream和OutputStream

  • FileInputStream和FileOutputStream

  • 处理IO异常的两种方式

  • BufferedInputStream和BufferedOutputStream

  • DataInputStream和DataOutputStream

  • ObjectInputStream和ObjectOutputStream


流的概述和分类
IO流 I = Input = 输入      O = Output = 输出

流 : 指的是数据从源点 传输到 汇点的 "管道" 而已

流的分类:
按照方向分: 输入流   输出流 参照物: Java程序
按照单位分: 字节流   字符流
按照功能分: 节点流   过滤流(包装流\处理流)
InputStream和OutputStream
InputStream     所有字节输入流统一的父类 抽象类
int read()
☛*:int read(byte[] data)*☚
int read(byte[] data,int offset,int length)

OutputStream 所有字节输出流统一的父类 抽象类
write(int data)
write(byte[] data)
☛*:write(byte[] data,int offset,int length)*☚
FileInputStream和FileOutputStream
FileInputStream     输入流 字节流 节点流
FileOutputStream 输出流 字节流 节点流
   "节点流~针头,文件~皮肉,目录~石头"
*: 它们都是节点流 构造方法允许传入String路径 或者 File对象
☞*: 虽然它们都是节点流 但是只能连接文件 不能连接目录
  否则直接触发异常 FileNotFoundException 拒绝访问
   *: 如果想要连接目录 递归kill(tar)所有目录以及所有文件
*: FileInputStream 最常用的 read(byte[])
*: FileOutputStream 最常用的 write(byte[],int,int)
*: FileInputStream 以-1作为读取结束的标识
*: FileOutputStream 是节点输出流
节点输出流创建对象的时候 如果[连接的文件]不存在
也会在创建流的那一刻自动创建出来 不需要手动建
其实 File类有个方法 createNewFile()  咱们没讲
☞但是 如果其[连接的目录结构]都不存在 不但不会创建
还会导致异常出现 FileNotFoundException 系统找不到指定路径
所以 File类有个方法 mkdirs() 一等优先级
*: FileOutputStream 是节点输出流
节点输出流是有极强的杀伤性的
创建节点输出流对象的时候 如果其连接的文件已经存在
也会在创建流的那一刻 被新的空白文件直接替换
如果我们的需求是在原有内容的最后追加新内容
可以构造方法传参 指定追加模式开启
new FileOutputStream("a.txt",true);
*: 你必须学会 标准的try catch 和 TWR两种处理异常 since jdk7.0
处理IO异常的两种方式
标准连环try catch finally:
*代码实现:
   FileInputStream fis = null;
   FileOutputStream fos = null;
   try{
       fis = new FileInputStream("keyboard.jpg");
       fos = new FileOutputStream("kkk.jpg");

       byte[] data = new byte[5<<20];
       int len;
       while((len = fis.read(data))!= -1){
           fos.write(data,0,len);
      }
  }catch(Exception e){
       e.printStackTrace();
  }finally{
       try{
           fos.close();
      }catch(Exception e){
           e.printStackTrace();
      }finally{
           try{
               fis.close();
          }catch(Exception e){
               e.printStackTrace();
          }
      }
  }
TWR资源自动关闭:
*代码实现:
try(FileInputStream fis = new FileInputStream("keyboard.jpg");
       FileOutputStream fos = new FileOutputStream("kkk.jpg");){
       byte[] data = new byte[5<<20];
       int len;
       while((len = fis.read(data))!= -1){
           fos.write(data,0,len);
      }
  }catch(Exception e){
       e.printStackTrace();
  }
BufferedInputStream和BufferedOutputStream
BufferedInputStream     字节流  输入流  过滤流
BufferedOutputStream 字节流  输出流  过滤流
*: 作为过滤流的它们 给原本的流添加缓冲空间
  从而提高每次读写的吞吐量 进而提高效率
*: 作为过滤流的它们 不能直接连接文件 只能连接其它的流
*: 它们构造方法第二个参数 都可以指定缓冲空间大小
  默认的缓冲空间 8192  == 8k
*: BufferedInputStream 最常用的read()
*: BufferedOutputStream 最常用的write(int data)
*: BufferedInputStream 同样以-1作为读取结束的标识
*: BufferedOutputStream 是带缓冲区的输出流
使用带缓冲区的输出流 务必注意及时清空缓冲
以防止数据滞留缓冲空间而导致丢失
缓冲区什么情况下会清空
1.满了自动清空 无需操作
2.关闭流的操作会触发清空缓冲
3.手动调用flush()方法
*: 如果使用TWR 请尽量保证 包装流初始化一步到位
DataInputStream和DataOutputStream
DataInputStream     输入流 字节流 过滤流
DataOutputStream 输出流 字节流 过滤流
*: 作为过滤流的它们 给原本的流添加读写基本数据类型的功能
*: 它们都是过滤流 只能连接其它的流 不能连接文件

  boolean char byte short int long float double

*: DataInputStream 核心方法 readXxxx();   有返回值
*: DataOutputStream 核心方法 writeXxxx(); 要参数

*: DataInputStream 不能再以-1作为读取结束的标识了
而是一旦到达文件结尾还继续尝试读取
将会直接触发 EOFException => End Of File
ObjectInputStream和ObjectOutputStream
ObjectInputStream   输入流 字节流 过滤流
ObjectOutputStream 输出流 字节流 过滤流
*: 它们都是过滤流 是为了给原本的流添加读写对象的功能的
*: 它们都是过滤流 不能直接连接文件 只能连接其它的流
*: ObjectInputStream 核心方法 readObject()   有返回值
*: ObjectOutputStream 核心方法 writeObject() 要参数
*: ObjectInputStream 同样不能以-1作为读取结束的标识了
*: 想要持久化 必须先要序列化  Serializable
想要被保存到磁盘文件当中的对象的类
必须实现序列化接口 implements Serializable
如果这个类型当中有其它引用类型的属性
就连这些属性的类型也必须实现序列化接口
如果某些属性无关紧要 不需要参与持久化存储
则可以使用transient修饰
transient : 不参与持久化的
*: 如果想要持久化的对象 是一个集合
则必须保证集合当中的元素的类型
也要实现序列化接口
*: 如果要持久化的是一个使用了比较器的TreeSet 或者TreeMap
就连比较器的类型也要实现序列化接口
因为 比较器是TreeSet或者TreeMap的一个属性

标签:day09,字节,int,过滤,FileOutputStream,IO,m2,byte,data
From: https://www.cnblogs.com/zhaodenghui33/p/18246954

相关文章

  • 【ZZULIOJ】1105: 判断友好数对(函数专题)
    题目描述输入两个正整数m和n,顺序输出m到n之间的所有友好数对。如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的。例如:1184和1210是友好数对,因为1184的因子之和为1+2+4+8+16+32+37+74+148+296+592=12101210的因子之和为1+2+5+10+11+22+55+110+121+2......
  • (半成品) Lesson 1+2 in Numerical methods for Navier-Stokes equations and phase-fie
    Lesson1+2inNumericalmethodsforNavier-Stokesequationsandphase-fieldmodels梯度流从自由能开始一个常见的自由能是这样定义的:\[E(\phi)=\int_{\Omega}\frac{1}{2}\left|\nabla\phi\right|^2+F(\phi)\,d\Omega\]其中,\(\nabla\)是梯度算子,\(\phi\)是标......
  • Redis之线程IO模型
    引言Redis是个单线程程序!这点必须铭记。除了Redis之外,Node.js也是单线程,Nginx也是单线程,但是他们都是服务器高性能的典范。Redis单线程为什么能够这么快!因为他所有的数据都在内存中,所有的运算都是内存级别的运算。正因为Redis是单线程,所以要小心使用Redis指令,对于那些时......
  • VideoGeneration
    StableVideoDiffusion:ScalingLatentVideoDiffusionModelstoLargeDatasets主要贡献:设计了一套数据清洗策略来清洗大规模的低质量的数据,用于训练T2V的SOTA模型,并证明了此模型具有足够强的关于动作和3D的先验知识可以用于视频相关的下游任务。目前主要的T2V的模型都是......
  • 过渡属性transition
    *transition这个属性添加在谁的身上就在谁的身上发生变化!!!注意:不要加在hover上!!!*例如:在box盒子上就在box盒子上变化1、瞬间变长,看不到过程<!DOCTYPEhtml><!--文档类型--><htmllang="en"> <head> <metacharset="utf-8"> <metaname="viewport"c......
  • 显著性目标检测(弱监督):Mutual Information Regularization for Weakly-supervised
    文章地址:MutualInformationRegularizationforWeakly-SupervisedRGB-DSalientObjectDetection|IEEEJournals&Magazine|IEEEXplore摘要:1.引入一个信息上界和一个互信息最小化正则项,鼓励每个模态的解纠缠表示用于SOD;2.运用非对称的特征提取器;3.引入多模态的......
  • 【Python】成功解决UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in p
    【Python】成功解决UnicodeDecodeError:‘gbk’codeccan’tdecodebyte0x80inposition45:illegalmultibytesequence 下滑即可查看博客内容......
  • G. D-Function
    原题链接题解先不考虑k的限制,而是考虑对于任意一个数,存不存在一个k使得题目所给等式成立当\(n·k\)没有进位时,等式一定成立(赛时也许想到这就够了)假如有进位呢?对于任何一个位数大于1的数,必有\(D(n)\ltn\)(想想十进制是怎么表示数的)而对于位数为1的数,有\(D(n)=n\)所......
  • vivado HW_SIO_TX
    描述在硬件设备上,每个GT包括一个独立的发射机hw_sio_tx由一个PCS和一个PMA组成。并行数据从设备逻辑流入FPGATX接口,通过PCS和PMA,然后输出TX驱动器作为高速串行数据。相关对象有关HW_SIO_TX对象与与其他硬件对象具有。SIO_TX对象与HW_,hw_target、hw_device、hw_sio_ibe......
  • 文件IO,创建编号为ABC三个线程,三个线程循环打印自己的编号,要求打印出来的结果必须是ABC
    第二个,拷贝图片#include<myhead.h>typedefstruct{ constchar*srcfile; constchar*destfile; intlen;}info;void*task1(void*arg){ infobuf=*((info*)(arg)); //打开这两个文件,只读的形式 intfd=-1; if((fd=open(buf.srcfile,O_RDONLY))==-1) {......