IO学习--Arsu

本文详细介绍了Java的IO流,包括字节流、字符流的输入输出,缓冲流的使用,字符编码与转换,以及序列化与反序列化。通过实例展示了文件复制、Properties集合操作、文本排序和异常处理等,探讨了提高IO操作效率的方法。
摘要由CSDN通过智能技术生成

IO

1.IO概述、分类

在这里插入图片描述
ps(一切皆为字节)
在这里插入图片描述

2.1字节输出流(OutputStream类&FileOutputStream类)的介绍

在这里插入图片描述
在这里插入图片描述

2.2字节输出流写数据到文件(内存到硬盘)

在这里插入图片描述

2.3文件存储原理图

在这里插入图片描述

2.4字节输出流写多个字节的方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5字节输出流的续写与换行

在这里插入图片描述
在这里插入图片描述

3.1字节输入流(InputStream类&FileInputStream类)的介绍

在这里插入图片描述

3.1字节输入流读取字节数据

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.2字节输入流一次读取一个字节原理图

在这里插入图片描述

3.3字节输入流一次读取多个字节

在这里插入图片描述

已知:b.txt文件中存有ABCDE
在这里插入图片描述
原理分析
在这里插入图片描述
优化
在这里插入图片描述

4.文件复制(练习)

在这里插入图片描述
代码

package learn.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @ClassName FileDemo
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/9 8:41
 * @Version 1.0
 **/
//文件复制练习:
public class FileDemo {
    public static void main(String[] args) throws IOException {
        long start=System.currentTimeMillis();
        //创建字节输入流
        FileInputStream fis = new FileInputStream("d:\\cat.jpg");
        //创建字节输出流
        FileOutputStream fos = new FileOutputStream("c:\\cat.jpg");
        //1.循环读写文件
       /* int len = 0;
        while ((len = fis.read()) != -1) {
            fos.write(len);
        }*/
       //2.优化1.方式
        byte[] bytes=new byte[1024];
        int len=0;
        while ((len=fis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        //关流
        fos.close();
        fis.close();
        long end=System.currentTimeMillis();
        System.out.println("复制文件共耗时:"+(end-start)+"毫秒");

    }
}

打印结果截图
在这里插入图片描述

5.使用字节流读取中文出现的问题

在这里插入图片描述
在这里插入图片描述

6.1字符输入流(Reader类&FileReader类)的介绍

在这里插入图片描述
在这里插入图片描述

6.2字符输入流读取字符数据

在这里插入图片描述
在这里插入图片描述

6.3字符输出流(Writer类&FileWriter类)的介绍

在这里插入图片描述
在这里插入图片描述

6.4字符输出流的基本使用----写出单个字符到文件

在这里插入图片描述

6.5flush和close方法的区别

在这里插入图片描述
在这里插入图片描述

6.6字符输出流写数据的其他方法

在这里插入图片描述
在这里插入图片描述

6.7字符输出流的续写和换行

在这里插入图片描述
在这里插入图片描述

7.1 IO流异常的处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2 JDK1.7与JDK1.9流中异常的处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.1 Properties集合的基本使用

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
打印结果截图
在这里插入图片描述

8.2 Properties集合中的store方法

在这里插入图片描述
在这里插入图片描述
打印结果截图
在这里插入图片描述
ps(若使用字节流进行上述操作,则会出现乱码,如:
在这里插入图片描述

8.3 Properties集合中的load方法

在这里插入图片描述
在这里插入图片描述
ps(一般使用Properties的load方法读取配置文件都是使用字符输入流FileReader操作,尽量少使用字节输入流,因为配置文件中可能存在中文,这样读出来的数据就会乱码,当然,如果保证配置文件中没有中文,则两种流都可以用来读取配置文件)

9.缓冲流概念及原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.1 BufferedOutputStream(字节缓冲输出流)

在这里插入图片描述
在这里插入图片描述

10.2 BufferedInputStream(字节缓冲输入流)

在这里插入图片描述
在这里插入图片描述
缓冲区
在这里插入图片描述
数组+缓冲区,效率快
在这里插入图片描述

11.测试(使用字节缓冲流和不使用字节缓冲流复制文件的效率对比)

(一)一个字节一个字节地读取,再一个字节一个字节输出
代码

package learn.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @ClassName FileDemo
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/9 8:41
 * @Version 1.0
 **/
//文件复制练习:
public class FileDemo {
    public static void main(String[] args) throws IOException {
        long start=System.currentTimeMillis();
        //创建字节输入流
        FileInputStream fis = new FileInputStream("d:\\jQuery1.11.3_hemin.chm");
        //创建字节输出流
        FileOutputStream fos = new FileOutputStream("c:\\jQuery.chm");
        //1.循环读写文件
        int len = 0;
        while ((len = fis.read()) != -1) {
            fos.write(len);
        }
        //关流
        fos.close();
        fis.close();
        long end=System.currentTimeMillis();
        System.out.println("复制文件共耗时:"+(end-start)+"毫秒");

    }
}

打印结果截图
在这里插入图片描述

(二)定义字节数组来存储读取的多个字节,然后再一次性将数组中的字节输出
代码

package learn.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @ClassName FileDemo
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/9 8:41
 * @Version 1.0
 **/
//文件复制练习:
public class FileDemo {
    public static void main(String[] args) throws IOException {
        long start=System.currentTimeMillis();
        //创建字节输入流
        FileInputStream fis = new FileInputStream("d:\\jQuery1.11.3_hemin.chm");
        //创建字节输出流
        FileOutputStream fos = new FileOutputStream("c:\\jQuery.chm");
        //1.循环读写文件
       /* int len = 0;
        while ((len = fis.read()) != -1) {
            fos.write(len);
        }*/

        //2.优化1.方式
        byte[] bytes=new byte[1024];
        int len=0;
        while ((len=fis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        //关流
        fos.close();
        fis.close();
        long end=System.currentTimeMillis();
        System.out.println("复制文件共耗时:"+(end-start)+"毫秒");

    }
}

打印结果截图
在这里插入图片描述
(三)使用字节缓冲流复制文件(没有用到数组存储字节)

代码

package learn.io;

import java.io.*;

/**
 * @ClassName FileDemo3
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/9 15:50
 * @Version 1.0
 **/
public class FileDemo3 {
    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        //创建字节输入流
        FileInputStream fis = new FileInputStream("d:\\jQuery1.11.3_hemin.chm");
        //创建字节输出流
        FileOutputStream fos = new FileOutputStream("c:\\jQuery.chm");
        //创建字节缓冲输入流,并把字节输入流对象当参数传进去
        BufferedInputStream bis = new BufferedInputStream(fis);
        //创建字节缓冲输出流,并把字节输出流对象当参数传进去
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int len = 0;
        while ((len = bis.read()) != -1) {
            bos.write(len);
        }
        //关流
        bos.close();
        bis.close();
        long end = System.currentTimeMillis();
        System.out.println("复制文件共耗时:" + (end - start) + "毫秒");

    }
}

打印结果截图
在这里插入图片描述
(四)使用字节缓冲流复制文件(用到数组存储字节)
代码

package learn.io;

import java.io.*;

/**
 * @ClassName FileDemo3
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/9 15:50
 * @Version 1.0
 **/
public class FileDemo3 {
    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        //创建字节输入流
        FileInputStream fis = new FileInputStream("d:\\jQuery1.11.3_hemin.chm");
        //创建字节输出流
        FileOutputStream fos = new FileOutputStream("c:\\jQuery.chm");
        //创建字节缓冲输入流,并把字节输入流对象当参数传进去
        BufferedInputStream bis = new BufferedInputStream(fis);
        //创建字节缓冲输出流,并把字节输出流对象当参数传进去
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }
        //关流
        bos.close();
        bis.close();
        long end = System.currentTimeMillis();
        System.out.println("复制文件共耗时:" + (end - start) + "毫秒");

    }
}

打印结果截图
在这里插入图片描述
综上所述
复制文件效率高低:字节缓冲流(使用到字节数组)>字节流(使用到字节数组)>字节缓冲流(没用到字节数组)>字节流(没用到字节数组)

12.1 BufferedWriter(字符缓冲输出流)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ps(上述代码中的bw.write("\r\n")可以使用bw.newLine()方法代替,该方法是BufferedFileWrite的一个特有成员方法,它会根据操作系统的不同来获取不同的行分隔符)

12.2 BufferedReader(字符缓冲输入流)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.对文本进行排序(练习)

题目:对一下内容进行排序
在这里插入图片描述

分析
在这里插入图片描述
代码

package learn.io;

import java.io.*;
import java.util.HashMap;
import java.util.Set;

/**
 * @ClassName FileDemo4
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/9 17:04
 * @Version 1.0
 **/
public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        //1.创建HahMap集合,键存储文本的序号(1.,2.,...),值用来存储每行文本内容
        HashMap<String, String> map = new HashMap<String, String>();
        //2.创建字符缓冲输入流对象,参数传入字符输入流对象,同时字符输入流对象中绑定有要读取的文本位置
        BufferedReader br = new BufferedReader(new FileReader("in.txt"));
        //3.创建字符缓冲输出流对象,参数传入字符输出流对象,同时字符输出流对象中绑定有要输出的文件路径
        BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
        //4.读取in.txt文件内容
        String str = null;
        while ((str = br.readLine()) != null) {
            //5.使用字符串的split方法将每行文本内容进行分割成序号+内容两部分
            String[] arr = str.split("\\.");
            //6.将arr数组中的内容存储到定义好的map集合中
            map.put(arr[0], arr[1]);
        }
        //7.遍历map集合
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            String value = map.get(key);
            //8.将得到的键和值进行拼接,输出到out.txt目标文件中
            bw.write(key + "." + value);
            bw.newLine();
        }
        //8.释放资源
        bw.close();
        br.close();

    }
}

结果截图
在这里插入图片描述

14.1字符编码和字符集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14.2编码引出的问题

在这里插入图片描述
在这里插入图片描述

15.1转换流原理图

在这里插入图片描述

在这里插入图片描述

15.2 OutputStreamWriter介绍和代码实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.3 InputStreamReader介绍和代码实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.4转换文件编码(练习)

题目
在这里插入图片描述
分析
在这里插入图片描述
代码

package learn.io;

import java.io.*;

/**
 * @ClassName FileDemo5
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/9 19:53
 * @Version 1.0
 **/
public class FileDemo5 {
    public static void main(String[] args) throws IOException {
        //1.编写输入转换流InputStreamReader,参数传递字节输入流和指定的编码表名称
        InputStreamReader isr = new InputStreamReader(new FileInputStream("我是GBK格式.txt"), "GBK");
        //2.编写输出转换流OutputStreamWriter,参数传递字节输出流和指定的编码表名称
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("我是UTF-8格式.txt"), "UTF-8");
        //3.使用InputStreamReader对象中的read方法读文件
        int len = 0;
        while ((len = isr.read()) != -1) {
            //4.使用OutputStreamWriter对象中的write方法将读取到的内容写到指定文件中
            osw.write(len);
        }
        //5.释放资源
        osw.close();
        isr.close();
    }
}
16.1序列化与反序列化的概述

在这里插入图片描述

16.2对象的序列化流ObjectOutputSream

在这里插入图片描述

在这里插入图片描述
前提:定义实体类Person,属性name,age,添加构造方法,getter和setter,以及重写toString,Person类需要实现接口Serializable接口
在这里插入图片描述

16.3对象的反序列化流ObjectInputSream

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

17.transient关键字(瞬态关键字)

在这里插入图片描述
在这里插入图片描述

18.1 InvalidClassException异常原理及解决方案

在这里插入图片描述
在这里插入图片描述

19.序列化集合(练习)

题目
在这里插入图片描述
分析
在这里插入图片描述
代码
定义Person实体类

package learn.io;

import java.io.Serializable;

/**
 * @ClassName Person
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/10 9:02
 * @Version 1.0
 **/
public class Person implements Serializable {
    private static final long SerialVersionUID = 8888L;
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试

package learn.io;

import java.io.*;
import java.util.ArrayList;

/**
 * @ClassName FileDemo6
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/10 9:02
 * @Version 1.0
 **/
public class FileDemo6 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.定义ArrayList集合存储Person对象
        ArrayList<Person> arrayList = new ArrayList<>();
        arrayList.add(new Person("徐凤年", 22));
        arrayList.add(new Person("鱼幼薇", 20));
        arrayList.add(new Person("韩生宣", 59));
        //2.创建序列化流ObjectOutputStream对象,对集合进行序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt"));
        oos.writeObject(arrayList);
        //3.创建反序列化流ObjectInputStream对象,对集合进行反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt"));
        Object o = ois.readObject();
        //4.把Object类型强转为ArrayList集合类型
        ArrayList<Person> personList = (ArrayList<Person>) o;
        //5.遍历集合,打印对象信息
        for (Person person : personList) {
            System.out.println(person);
        }
    }
}

打印结果截图
在这里插入图片描述

20.打印流概述和使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值