java中的io流知识总结_java中的io流开发用的多吗

java中的io流知识总结_java中的io流开发用的多吗通过前面的简单学习,我们已经能够大致了解了关于文件的操作,但是能够明显感受到在执行其他的操作的时候,还是会有一些不方便的地方存在,因此今天我们会学习另外四个IO流来帮助我们对文件进行操作,这四个流分别是缓冲流、转换流、序列化、打印流。好了,废话不多说,我直接开始今天的学习吧!……

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

目录

引言

缓冲流 

字节缓冲流 

字符缓冲流 

转换流 

字符输入转换流 

字符输出转换流 

序列化和反序列化 

对象序列化 

对象反序列化 

打印流 

Properties


引言

通过前面的简单学习,我们已经能够大致了解了关于文件的操作,但是能够明显感受到在执行其他的操作的时候,还是会有一些不方便的地方存在,因此今天我们会学习另外四个IO流来帮助我们对文件进行操作,这四个流分别是缓冲流转换流序列化打印流。好了,废话不多说,我直接开始今天的学习吧!

java中的io流知识总结_java中的io流开发用的多吗

缓冲流 

  • 缓冲流也称为高效流、或者高级流。之前学习的字节流也可以称为原始流。
  • 作用:缓冲流自带缓冲区,可以提高原始字节流、字符流读取数据的性能。
  • 形象举例:倘若我们将对文件的输入和输出操作想象为运输水的过程的话,在最初的时候,水(数据)是直接对接水管进行运输,而缓冲流的不同之处在于水不需要对接水管,仅需要和水管前的水缸进行对接,这么做可以提高了运输的效率。
  • 缓冲流分为两种,一种是字节缓冲流,另一种则是字符缓冲流。分别是BufferedInputStream(字节缓冲输入流)BufferedOuputStream(字节缓冲输出流)BufferedReader(字符缓冲输入流)BufferedWriter(字符缓冲输出流)。 

字节缓冲流 

  • 字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能,读写功能上并无变化
  • 字节缓冲输出流:BufferedOutputStream, 提高字节输出流读取数据的性能,读写功能上并无变化
构造器 说明

public BufferedInputStream(InputStream is)

可以把低级的字节输入流包装成一个高级的字节缓冲输入流管道,从而提高字节输入流读数据的性能
public BufferedOutputStream(OutputStream os) 可以把低级的字节输出流包装成一个高级的字节缓冲输出流管道,从而提高写数据的性能
InputStream is = new FileInputStream("File//data.txt");
InputStream bis = new BufferedInputStream(is);
OutputStream os = new FileOutputStream("File//data01.txt");
OutputStream bos = new BufferedOutputStream(os);
int len;
byte []buffer = new byte[1024];
while ((len = bis.read(buffer))!=-1){
bos.write(buffer,0,len);
bos.flush();

通过字节缓冲流实现将一个文件中的内容复制在另一个文件之中。

java中的io流知识总结_java中的io流开发用的多吗

字符缓冲流 

字符缓冲输入流:BufferedReader,提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能

构造器 说明
public BufferedReader(Reader r) 可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能
方法 说明
public String readLine() 读取一行数据返回,如果读取没有完毕,无行可读取返回null
        Reader r = new FileReader("File//data.txt");
        BufferedReader br = new BufferedReader(r);//由于是子类独有的功能,所有不能使用多态创建
        String s;
        byte []buffer = new byte[1024];
        while ((s = br.readLine())!=null){
            System.out.println(s);
        }
//正常情况下会将文件中的数据依次输出;
        Reader r = new FileReader("File//data.txt");
        BufferedReader br = new BufferedReader(r);
        br.readLine();
        br.readLine();
//若文件中的数据不足两行:
//kdirvingJamesJame
//null

字符缓冲输出流:BufferedWriter,提高字符输出流写取数据的性能,除此之外多了换行功能 

构造器 说明
public BufferedWriter(Writer w) 可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能
方法 说明
public void newLine() 执行操作
        Writer w = new FileWriter("File//data.txt",true);
        BufferedWriter bw = new BufferedWriter(w);//由于是子类独有的功能,所有不能使用多态创建
        bw.write("石原里美");
        bw.newLine();
        bw.write("工藤静香");
        bw.newLine();
        bw.flush();

需要留意的地方是,在写文件的时候如果想要对文件进行追加操作,需要对Writer的对象设置true,而不是BufferedWriter的对象。

转换流 

在学习转换流之前,我们应该要了解的是如果代码编码和文件编码如果不一致。使用字符流直接读取会造成乱码,因此我们需要代码编码和文件编码一致,才能保证不会乱码,而转换流的出现就是为了能够避免这种事情的发生的。 

java中的io流知识总结_java中的io流开发用的多吗

字符输入转换流 

首先是对于乱码的问题提供一个简单的思路:

1、使用字符输入转换流;

2、可以提取文件(不同的编码)的原始字节流,原始字节不会存在问题;

3、将字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不会乱码了。

字符输入转换流:InputStreamReader,可以把原始字节流按照指定编码转换成字符输入流

构造器 说明
public InputStreamReader(InputStream is) 可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用
public InputStreamReader(InputStream is,String charset) 可以把原始的字节流按照指定指定编码转换成字符输入流,这样字符流中的字符就不乱码了
        InputStream is = new FileInputStream("File//data.txt");
        InputStreamReader isr = new InputStreamReader(is);
        InputStreamReader isr = new InputStreamReader(is,"GBK");

在以上代码中,已知将data.txt文件的编码格式设置为GBK,而代码编码是utf-8,所以需要通过转换流将编码变为一致。而一种构造器默认utf-8,显然是不行的,第二种则是可以指定编码,将原始的字节输入流转换为字符输入流,并以GBK的形似进行读取。

字符输出转换流 

字符输出转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流

构造器 说明
public OutputStreamWriter(OutputStream os) 可以把原始的字节输出流按照代码默认编码转换成字符输出流,几乎不用
public OutputStreamWriter(OutputStream os,String charset) 可以把原始的字节输出流按照指定的编码转换成字符输出流

首先我们应该知道字符输出转换流是为了应对哪些现实中的事情:假如你的客户智能编码为GBK的文件,那么你给他传过去一个utf-8的文件的话,文件是会乱码的,那么这个时候就需要我们传过去一个编码为GBK的文件。

        OutputStream os = new FileOutputStream("File//data.txt");
        Writer osw = new OutputStreamWriter(os);
        Writer osw = new OutputStreamWriter(os,"GBK");

在以上代码中,第一种是默认utf-8的,所以是几乎不用的,而第二种则是可以指定客户需要的编码文件格式。

java中的io流知识总结_java中的io流开发用的多吗

序列化和反序列化 

对象序列化 

  • 对象字节输出流,ObjectOutputStream
  • 作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化
构造器 说明
public ObjectOutputStream(OutputStream os) 把低级字节输出流包装成高级的对象字节输出流

 首先是简单的创建了一个学生类Student,需要注意的是Java规定对象序列化的时候,类需要实现Serializable接口

public class Student implements Serializable {
    private String name;
    private int age;
    private String number;
    private String classroom;
}

接下来则是实现对象的序列化的操作:

        Student s = new Student("石原里美",18,"001","智能一班");
        OutputStream os = new FileOutputStream("File//data.txt");
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(s);
        oos.close();

另外如果不希望对象中的某个数据不参与序列化,则可以通过transient对其进行修饰,如“private transient String name”,执行该操作之后,对其进行反序列化的时候该数据会显示null。

对象反序列化 

  • 对象字节输入流,ObjectInputStream
  • 作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化
构造器 说明
public ObjectInputStream(InputStream is) 把低级字节输入流包装成高级的对象字节输入流
方法名称 说明
public Object readObject() 把存储到磁盘文件中去的对象数据恢复成内存中的对象返回
        InputStream is = new FileInputStream("File//data.txt");
        ObjectInputStream ois = new ObjectInputStream(is);
        Object s = ois.readObject();
        System.out.println(s);
//输出结果:
//Student{name='石原里美', age=18, number='001', classroom='智能一班'}

另外还有一个知识点,在定义类的时候,可以定义一个版本序列号,而在反序列号的时候,其序列号必须一致才可以正常的读取,如“private static final long serialVersionUID = 1;”

若在第一次序列化之后,将类中的版本序列号更改,在没有作第二次重新序列化之前,反序列化会出现报错的情况。

java中的io流知识总结_java中的io流开发用的多吗

打印流 

  • 作用:打印流可以实现方便、高效的打印数据到文件中去。一般指PrintStream,WriteStream两个类
  • 可以实现打印什么数据就是什么数据,例如打印整数97,写出去就是97,打印boolean的true,写出去就是true
构造器 说明
public PrintStream(OutputStream os) 打印流直接通向字节输出流管道
public PrintStream(File f) 打印流直接通向文件对象
public PrintStream(String filepath) 打印流直接通向文件路径
方法名称 说明
public void print(Xxx xx) 打印任意类型的数据出去
//三种构造器的使用
PrintStream ps = new PrintStream("File//data01.txt");
PrintStream ps1 = new PrintStream(new File("File//data.txt"));
PrintStream ps2 = new PrintStream(new FileOutputStream(new          File("File//data.txt")));
ps.print(11);
ps.print("凯里·欧文");

PrintStream和WriterStream的区别

  • 打印数据功能上是一模一样,都是使用方便,性能高效
  • PrintStream继承字节输出流OutputStream,支持写字节数据的方法
  • PrintWriter继承字符输出流Writer,支持写字符出去

Properties

  • 作用:Properties代表的是一个属性文件可以把自己对象中的键值对信息存入到一个属性文件中去
  • 属性文件:后缀是.properties结尾的文件,里面的内容都是key=value,后续做系统配置信息的
构造器 说明
void load (InputStream is) 从输入字节流读取属性列表(键值对)
void load (Reader r) 从输入字符流读取属性列表(键值对)
void store (OutputStream os,String comments) 将此属性列表(键值对)写入此Properties中,以适合于使用load(InputStream)方法的格式输出字节流
void store(Writer w,String comments) 将此属性列表(键值对)写入此Properties中,以适合于使用load(reader)方法的格式输出字符流
public Object setProperty(String key,String value) 保存键值对(put)
public String getProperty(String key) 使用此属性列表中指定的键搜索属性值(get)
public Set<String> stringPropertyNames() 所有键的名称的集合(keySet())
        Properties properties = new Properties();
        properties.setProperty("石原里美","18");
        properties.setProperty("工藤静香","19");
        properties.setProperty("朱茵","20");
        System.out.println(properties);
        //第一个参数是文件存储路径,第二个是对文件的注释
        properties.store(new FileWriter("File//Baby.properties"),"这些都是绝世美女,不接受反驳哈哈哈");

java中的io流知识总结_java中的io流开发用的多吗

        Properties properties = new Properties();
        properties.load(new FileReader("File//Baby.properties"));
        System.out.println(properties);
//输出结果:
//{"石原里美"=18,"工藤静香"=19,"朱茵"=20}

创作不易,给个三连吧

java中的io流知识总结_java中的io流开发用的多吗

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179928.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SpringMVC 运行流程[通俗易懂]

    SpringMVC的工作原理图:SpringMVC流程1、用户发送请求至前端控制器DispatcherServlet。2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherS…

  • 60道计算机网络面试题(附答案,背诵版)

    60道计算机网络面试题(附答案,背诵版)在大概三个月前,我在我网站就整理了计算机网络的面试题了,不过那时候才整理了20道核心的,大概过了两个月,我花了大半天去找计算机网络的面试题,因为20道肯定不够,于是我整理到了42道。不过最近我不是在整理各个公司的面经嘛?发现42道还是漏掉了不少,于是这周就又把自己整理面经看到的计算机网络面试题又补上了,一共60多道。只要把这些面试题拿下,计算机网络基本就差不多了,面试题如下?1.OSI的七层模型分别是?各自的功能是什么?2.为什么需要三次握手?两次不行?3.为什么需要四次

  • 传统图像降噪算法之BM3D原理详解

    传统图像降噪算法之BM3D原理详解       图像降噪是一个十分具有实用价值的研究方向,因为噪声总是无处不在的。当处于比较昏暗的环境时,噪声将极大地影响着我们所拍摄的图像。如今,随着深度学习算法以及相关硬件的不断发展,深度卷积网络同样在图像降噪领域占据了主流,并且代表了该领域最优异的成绩。但是,深度神经网络同样有着其缺点,例如模型过于庞大而计算复杂度过高,以及缺乏一些理论上的解释性,当然这些缺点正不断地得到弥补。为了更好地理解图像降噪的基本原理,我们有必要回过头来仔细研

  • SOAP协议详解「建议收藏」

    SOAP协议详解「建议收藏」一.概念:SOAP:简单对象访问协议,是交换数据的一种协议规范,它是一个轻量级\简单的\基于xml的协议;它被设计成在WEB上交换结构化的和固化的信息。二.相关定义1.基于类对象的传输协议;2.SOAP封装(envelop),它定义了一个框架,描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们;3.SOAP编码规则(encodingrules),它定义了一种序列化机制,用

  • C++ map 根据value找key、 根据key找value

    C++ map 根据value找key、 根据key找value根据value找key    有可能找到多个结果根据key找value    、、、、、、运行效果:代码很简单,如下:#include&lt;iostream&gt;#include&lt;map&gt;#include&lt;string&gt;usingnamespacestd;intmain(intargc,char*…

  • linux提示未找到命令unzip和zip解决方法[通俗易懂]

    linux提示未找到命令unzip和zip解决方法[通俗易懂]linux中使用unzip和zip命令时,提示未找到命令解决方案:安装zip和unzip命令:yumlist|grepzip/unzipyuminstallzipyuminstallunzip

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号