首页 > 编程语言 >java io流 高级流

java io流 高级流

时间:2023-04-29 22:56:01浏览次数:43  
标签:文件 ZipEntry java 字节 打印 高级 io 序列化 public

转换流

是字符流和字节流之间的桥梁

转换输入流 InputSteamReader
转换输出流 OutputStreamWriter

作用1:指定字符集读写(JDK 11之后淘汰)
JDK11之后可直接用字节流的构造方法

  //指定GBK的编码 读取数据
  FileReader fr= new FileReader(File fileName , Charset.forName ("GBK"));

  //指定GBK的编码 写入数据
  FileWriter fr= new FileWriter(File fileName , Charset.forName("GBK")); 

作用2:字节流想要使用字符流中的方法

序列流和反序列化流

序列化流/对象操作输出流: 可以将java中的对象写到本地文件中

//构造方法 将基本流包装为高级流
public ObjectOutputStream (OutputStream out)

//常用成员方法 将对象序列化(写出)到文件中去
public final void writeObject (Object obj)

Tips:使用对象输出流将对象保存在本地文件时会出现 NotSerializableException 异常,此时需要让JavaBean类实现 Serializable 接口

Serializable 接口里面没有抽象方法,是一个标记型接口,一旦实现了这个接口,就表示当前JavaBean类可以被序列化

序列化之后的文件不可更改,否则反序列化时,代码会报错
若是对象的成员变量中有不想被序列化的成员属性,可以使用 transient 关键字修饰


反序列化流/对象操作输入流:可以把序列化到本地文件中的对象,读取到程序中来

//构造方法 将基本流包装为高级流
public ObjectInputStream (InputStream out) 

//常用成员方法 将序列化到本地文件中的对象,读取到程序中来
public final void readObject (Object obj)

为了防止序列化对象之后,修改JavaBean类造成反序列化代码和已经序列化写入文件中的原代码不符,造成的UID不符。可以给JavaBean类添加一个 serialVersinUID
private static final long serialVersionUID=xxxxxL;

serialVersinUID 尽量在所有成员属性及方法写完之后再写

在序列化对象过程中,为了防止不知道到底序列化里几个,可以将所有将要序列化的对象放在一个集合中,因为集合实现了 Serializable 接口,可以直接被序列化到文件中

反序化时可以用相应泛型的集合接受反序列化的对象,之后增强for循环输出

打印流

打印流没有输入流,只有输出流

分类:打印流一般是指 PrintStream(字节打印流),Printwriter(字符打印流)两个类

特点1:打印流之操作文件目的地,不操作数据源

特点2:特有的写出方法,可以实现,数据原样写出

特点3:特有的写出方法,可以实现自动换行,自动刷新

//字节打印流/字符打印流 构造方法

//关联字节输出流/文件/文件路径
public PrintStream(OutoutStream/File/Striing)

//指定字符编码
public PrintStream(Striing fileName, Charset charset)

//自动刷新
public PrintStream(OutoutStream out, boolean antoFlush)

//指定字符编码且自动刷新
public PrintStream(OutoutStream out, boolean antoFlush,String encoding)
//字节打印流/字符打印流 常用成员方法

//常规方法:将指定字节写出
public void write(int b)

//特有方法:打印任意数据,自动刷新,自动换行
public void println(xxx xxx)

//特有方法:打印任意数据,不换行
public void print(xxx xxx)

//特有方法:带有占位符的打印语句,不换行(类似于C语言的输出语句)
public void printf(String format, Object...args)

由于字节打印流没有缓冲区,所以自动刷新开不开都一样,但字符打印流有缓冲区,如果需要自动刷新,一定要自己手动开启

System.out,println()
特殊的打印流:系统的标准输出流,此打印流在虚拟机启动的时候,由虚拟机创建,默认指向控制台,不能关闭,在系统中是 唯一的

解压缩流/压缩流

压缩流是ZipOutputStream
解压缩流是ZipInputStream

在Java中 压缩包中每一个文件都是一个ZipEntry对象,Java中也只能识别.zip后缀的压缩包

在Java中解压的本质 就是把每一个ZipEntry按照层级拷贝到本地的另一个文件夹中

ZipEntry的操作有点像迭代器

先通过ZipInputStream打开文件
ZipInputStream zip=new ZipInputStream(InputStream in);
之后操作 ZipEntry 的 getNextEntry() (读取下一个 ZIP 文件条目并将流定位到该条目数据的开始处)方法进行判断,是文件夹还是文件,按照层级结构一个一个拷贝要先有文件夹,才可以创建文件夹中的文件

在解压缩过程中间注意读入文件的编码与当前默认的编码是否一致,还要注意压缩包中文件夹不要为中文命名,否则会有报错

在Java中压缩的本质 就是把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中

先创建压缩流关联压缩包注意文件路径格式
ZipOutoutStream zos=new ZipOutputStream(new FileOutputStream(new File(String 父级路径,String 子级路径)));
之后创建ZipEntry表示压缩包中每一个文件和文件夹并放入压缩包中
ZipEntry entry=new ZipEntry(File file); zos.putNextEntry(entry);
最后通过字节输出流,将原文件中数据写到压缩包中,之后执行 closeEntry()方法结束当前文件的拷贝并接着循环判断 getNextEntry()方法接着压缩,结束时释放资源

标签:文件,ZipEntry,java,字节,打印,高级,io,序列化,public
From: https://www.cnblogs.com/naoziinicu/p/17364600.html

相关文章

  • javaScript基础之 --- 作用域和闭包
    本文是我学习《你所不知道的javaScript上卷》的读书笔记的整理。更多详细内容,请微信搜索“前端爱好者“,戳我查看。作用域和闭包作用域是什么javaScript工作原理中的角色引擎-从头到尾负责整个javascript程序的编译及执行过程编译器-负责语法分析及代码生成......
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介模板方法模式(TemplateMethodPattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有......
  • XML-RPC Specification
    转载于http://xmlrpc.com/spec.md。:::{#idMenubar.divMenubar}:::{.topbar-wrapperstyle="z-index:5;"}:::{.navbar.navbar-fixed-topdropdown="dropdown"}:::divVersionNumber[]{#idPublishStatus}[]{#idSavedStatus} []{#idVersionNumber}......
  • B/S结构系统的会话机制(session)
    B/S结构系统的会话机制(session)目录B/S结构系统的会话机制(session)每博一文案1.session会话机制的概述2.什么是session的会话3.session的作用4.session的实现原理解释5.补充:Cookie禁用了,session还能找到吗?6.总结一下到目前位置我们所了解的域对象:7.oa项目的优......
  • Python MatplotlibDeprecationWarning Matplotlib 3.6 and will be removed two minor
    百度飞桨(PaddlePaddle)-数字识别在Pycharm中使用Matplotlib中的pyplot时,运行代码报错:MatplotlibDeprecationWarning:SupportforFigureCanvaseswithoutarequired_interactive_frameworkattributewasdeprecatedinMatplotlib3.6andwillberemovedtwominorreleases......
  • Java Lambda Stream
    javalist中的字符是否包括在另一个list中,::方法使用::方法使用条件:lambada表达式的主体仅包含一个表达式,且lambada表达式只调用一个已经存在的方法;被引用的方法的参数列表与lambada表达式的输入输出一致以下是Java8中方法引用的一些语法:静态方法引用(s......
  • 合并与最高级别
    问题:部门和项目名称相同的整理成一行,名称合并,工程级别显示最高级别。函数公式解决:部门与项目名称的唯一值:{=UNIQUE(B2:C5)}合并名称:{=TEXTJOIN("、",,FILTER(D$2:D$5,(B$2:B$5=G2)*(C$2:C$5=H2)))}工程最高级别:{=MAX((B$2:B$5=G2)*(C$2:C$5=H2)*--SUBSTITUTE(E$2:E$5,"......
  • Java学习2——第四-六次题目集的分析与总结
     一.前言 本次Blog是对java学习中第二阶段练习的一个总结,作为刚学习JAVA的小白,以下依旧只是本人作为普通学生,以当前能力和状态所做出的总结和分析,不足之处也欢迎各位大佬的指正! 这次的三个题目集,题量除了题目集六很少外,其它都是正常数量,当然题目集六的题也是最难的。总体难......
  • Vue 异步通信Axios
    使用Axios实现异步通信需要先导入cdn:<scriptsrc="https://unpkg.com/[email protected]/dist/axios.min.js"></script>使用到的数据data.json{"name":"kuang","url":"https://www.bilibili.com/?spm_id_from=333.788.0......
  • c语言报错 [Error] invalid initialization of non-const reference of type 'LinkQue
     进行地址传递是出现报错临时值不能作为非常量引用参数进行传递所以需要在main函数中·重新定义指针传递 ......