Java之IO总结概述

一、流的分类

Java的IO模型设计非常优秀,它使用Decorator(装饰者)模式,按功能划分Stream,您可以动态装配这些Stream,以便获得您需要的功能。例如,您需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。
在这里插入图片描述

  1. 按照流的方向区分:
    输入流:从别的地方(本地文件,网络上的资源等)获取资源 输入到 我们的程序
    输出流:从我们的程序中 输出到别的地方(本地文件), 比如将一个字符串保存到本地文件中
  2. 按处理数据单位区分:
    字节流:每次读取(写出)一个字节,当传输的资源文件有中文时,就会出现乱码
    字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文
    注:1字符 = 2字节 、 1字节(byte) = 8位(bit) 、 一个汉字占两个字节长度
  3. 功能不同区分:
    节点流:以从或向一个特定的地方(节点)读写数据。如FileInputStream
    处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。比如:
		//创建一个接收键盘输入的输入流
        InputStreamReader is=new InputStreamReader(System.in);
        //把输入流放进缓存流中
        BufferedReader br=new BufferedReader(is);

4.四个基本的抽象流类型,所有的流都继承这四个:

字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

流的选择
1、首先自己要知道是选择输入流还是输出流

2、然后考虑你传输数据时,是选择使用字节流传输还是字符流,也就是每次传1个字节还是2个字节,有中文肯定就选择字符流了。
3、前面两步就可以选出一个合适的节点流了,比如字节输入流inputStream,如果要在此基础上增强功能,那么就在处理流中选择一个合适的即可,比如常用的缓冲流

在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是FileOutputStreamInputStreamWriterReader;一个接口指的是Serializable

Java语言系统预定了3个可以直接使用的流对象,分别是:
System.in(标准输入),通常代表键盘输入。

InputStreamReader is=new InputStreamReader(System.in);
        //把输入流放进缓存流中
        BufferedReader br=new BufferedReader(is);
        String str="";//定义一个临时接收数据的字符串
        while ((str=br.readLine())!=null){
            System.out.println(str);
        }
        br.close();
        is.close();

System.out(标准输出):通常写往显示器。
System.err(标准错误输出):通常写往显示器。

二、流的特性

  1. 先进先出,最先写入输出流的数据最先被输入流读取到。
  2. 顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile可以从文件的任意位置进行存取(输入输出)操作
  3. 只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流

三、字节流和字符流使用情况

字符流和字节流的使用范围:字节流一般用来处理图像,视频,以及PPT,Word类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,字节流可以用来处理纯文本文件,但是字符流不能用于处理图像视频等非文本类型的文件。

四、字节流和字符流相互转换

  1. InputStreamReader:字节到字符的桥梁
    OutputStreamWriter(OutStream out):将字节流以字符流输出
  2. OutputStreamWriter:字符到字节的桥梁
    InputStreamReader(InputStream in):将字节流以字符流输入

五、字节流和字符流的区别

  • 字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

结论:
只要是处理纯文本数据,就优先考虑使用字符流
除此之外都使用字节流

六、序列化

序列化:将对象写入到IO流中
反序列化:从IO流中恢复对象
意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在

给出一个类并实现Serializable接口

import java.io.Serializable;
//创建一个可以序列化与反序列化的类
public class Person implements Serializable {
    String name;
    int age;

}

序列化

public static void testSerialize() throws IOException {
        //定义对象输出流,把对象序列化后放入指定文件中
        ObjectOutputStream  out=new ObjectOutputStream(new FileOutputStream("E:\\JAVA code\\tt8.txt"));

        Person p =new Person();
        p.name="张三";
        p.age=11;

        out.writeObject(p);//序列化写入
        out.flush();
        out.close();

    }

反序列化

 public static void testDeserialize() throws IOException, ClassNotFoundException {
        ObjectInputStream in =new ObjectInputStream(new FileInputStream("E:\\JAVA code\\tt8.txt"));

        Object obj=in.readObject();//反序列化读取
        Person p =(Person) obj;//强行转换
        System.out.println(p.name+p.age);

    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值