复习(基础4)IO流(2)

目录

1、字符流

1.1、字符输入流:Reader

1.2、字符输出流:Writer

2、缓冲流

2.1、概述

2.2、字节缓冲流的使用

2.3、字符缓冲流的使用

3、转换流

4、序列化对象

4.1、对象序列化

4.2、对象反序列化

5、打印流


1、字符流

1.1、字符输入流:Reader

文件字符输入流:FileReader

作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去

构造器

说明

public FileReader​(File file)

创建字符输入流管道与源文件对象接通

public FileReader​(String pathname)

创建字符输入流管道与源文件路径接通

方法名称

说明

public int read()

每次读取一个字符返回,如果字符已经没有可读的返回-1

public int read(char[] buffer)

每次读取一个字符数组返回读取的字符个数,

如果字符已经没有可读的返回-1

一次读取一个字符:读取中文字符不会出现乱码(如果代码文件编码一致),性能较慢

package com.itwpf.d03_stream;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Arrays;

public class FileReaderDemo1 {
    public static void main(String[] args) throws IOException {

        Reader reader = new FileReader(new File("day05_file\\src\\main\\java\\data.txt"));
        int len ;
        while((len = reader.read())!=-1){
            System.out.print((char)len);
        }
    }
}

一次读取一个字符数组:读取的性能得到了提升,读取中文字符输出不会乱码。

package com.itwpf.d03_stream;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Arrays;

public class FileReaderDemo1 {
    public static void main(String[] args) throws IOException {

        //创建一个字符输入流管道与源文件接通
        Reader reader = new FileReader("day05_file\\src\\main\\java\\data.txt");
        char []code = new char[1024];
        int len ;
        //使用循环读取字符
        while((len = reader.read(code))!=-1){
            //解码
            String s = new String(code,0,len);
            //输出
            System.out.print(s);
        }
    }
}

1.2、字符输出流:Writer

文件字符流:FileWriter

作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流。

构造器

说明

public FileWriter(File file)

创建字符流管道与源文件对象接通

public FileWriter​(File fileboolean append)

创建字符流管道与源文件对象接通

可追加数据

public FileWriter​(String filepath)

创建字符流管道与源文件路径接通

public FileWriter​(String filepathboolean append)

创建字符流管道与源文件路径接通

可追加数据

文件字符FileWriter)写数据出去的API

方法名称

说明

void write​(int c)

写一个字符

void write​(char[] cbuf)

写入一个字符数组

void write​(char[] cbuf, int off, int len)

写入字符数组的一部分

void write​(String str)

写一个字符串

void write​(String str, int off, int len)

写一个字符串的一部分

流的关闭与刷新

方法

说明

flush()

刷新流,还可以继续写数据

close()

关闭流,释放资源,但是在关闭之前会先刷新流。

一旦关闭,就不能再写数据

package com.itwpf.d03_stream;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class FileWriterDemo1 {
    public static void main(String[] args) throws IOException {
        //1、创建一个字符输出流管道与目标文件接通,覆盖通道,每次启动都会清空文件之前的数据
        Writer fileWriter = new  FileWriter("day05_file\\src\\main\\java\\data03.txt");

        //2.写数据
        fileWriter.write("adv");

        //3.刷新
        fileWriter.flush();

        //4.关闭
        fileWriter.close();

    }
}

字符输出流如何实现写出去的数据能换行

fw.write("\r\n");

字节流、字符流的使用场景总结:

        字节流适合做一切文件数据的拷贝(音视频,文本)

        字节流不适合读取中文内容输出

        字符流适合做文本文件的操作(读,写)

2、缓冲流

2.1、概述

缓冲流概述:

缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流

作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能

 

 

字节缓冲流性能优化原理:

        字节缓冲输入流自带了8KB缓冲池以后我们直接从缓冲池读取数据,所以性能较好

        字节缓冲输出流自带了8KB缓冲池数据就直接写入到缓冲池中去,写数据性能极高了

字节缓冲流

        字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能。

        字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能。

构造器

说明

public BufferedInputStream​(InputStream is)

可以把低级的字节输入流包装成一个高级的缓冲字节

输入流管道,从而提高字节输入流读数据的性能

public BufferedOutputStream​(OutputStream os)

可以把低级的字节输出流包装成一个高级的缓冲字节

输出流,从而提高写数据的性能

2.2、字节缓冲流的使用

package com.itwpf.d04_BufferedInputOutputStream;

import java.io.*;

public class ByteBufferDemo {
    public static void main(String[] args) {
        try(
                InputStream inputStream = new FileInputStream("D:\\log4j\\00\\01.mp4");
                OutputStream outputStream = new FileOutputStream(new File("D:\\log4j\\01\\04.mp4"));
                InputStream bufferinputStream = new BufferedInputStream(inputStream);
                OutputStream bufferoutputStream = new BufferedOutputStream(outputStream);
                ){
            byte []bytes= new byte[1024];
            int len;
            while((len = bufferinputStream.read(bytes))!=-1){
                bufferoutputStream.write(bytes,0,len);
                bufferoutputStream.flush();
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

2.3、字符缓冲流的使用

 

字符缓冲输入流

        字符缓冲输入流:BufferedReader。

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

构造器

说明

public BufferedReader​(Reader r)

可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能

字符缓冲输入流新增功能

方法

说明

public String readLine()

读取一行数据返回,如果读取没有完毕,

无行可读返回null

字符缓冲输出流

字符缓冲输出流:BufferedWriter

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

构造器

说明

public BufferedWriter​(Writer w)

可以把低级的字符输出流包装成一个高级的

缓冲字符输出流管道,从而提高字符输出流写数据的性能

字符缓冲输出流新增功能

方法

说明

public void newLine()

换行操作

package com.itwpf.d04_BufferedInputOutputStream;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;

public class BufferReaderDemo1 {
    public static void main(String[] args) {
        try(
                Reader rd = new FileReader("day05_file\\src\\main\\java\\data.txt");
                BufferedReader br = new BufferedReader(rd);

                ){
            String s;
            while((s = br.readLine())!=null){
                System.out.println(s);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

 

package com.itwpf.d04_BufferedInputOutputStream;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;
import java.util.stream.Stream;

public class BufferReaderDemo2 {
    public static void main(String[] args) {
        try(
                BufferedReader br  = new BufferedReader(new FileReader("day05_file\\src\\main\\java\\data03.txt"));
                BufferedWriter bw = new BufferedWriter(new FileWriter("D:/log4j/01/01.txt"));
                ){
            String s;
            Map<Integer,String> map = new TreeMap<>();
            while((s=br.readLine())!=null){
                String s2 = s.split(" ")[0];
                int n = Integer.parseInt(s2);
                map.put(n,s);
            }
            int size = map.size();
            for (String value:map.values()) {
                bw.write(value);
                bw.newLine();
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

3、转换流

 

字符输入转换流

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

构造器

说明

public InputStreamReader(InputStream is)

可以把原始的字节流按照代码默认

编码转换成字符输入流。几乎不用,

与默认的FileReader一样。

public InputStreamReader(InputStream is String charset)

可以把原始的字节流按照指定

编码转换成字符输入流

这样字符流中的字符就不乱码了(重点)

package com.itwpf.d04_BufferedInputOutputStream;

import java.io.*;

public class InputStreamReaderDemo1 {
    public static void main(String[] args) {

        try(
                Reader reader = new InputStreamReader(new FileInputStream("D:\\log4j\\01\\02.txt"),"GBK");
                BufferedReader fr = new BufferedReader(reader);
        ){
            String line;
            while((line=fr.readLine())!=null){
                System.out.println(line);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

字符输出转换流

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

构造器

说明

public OutputStreamWriter(OutputStream os)

可以把原始的字节输出流按照代码

默认编码转换成字符输。几乎不用。

public OutputStreamWriter(OutputStream osString charset)

可以把原始的字节输出流按照

指定编码转换成字符输(重点)

package com.itwpf.d04_BufferedInputOutputStream;

import java.io.*;

public class OutputStreamWriterDemo1 {
    public static void main(String[] args) {

        try(
                OutputStream outputStream = new FileOutputStream("day05_file\\src\\main\\java\\data11.txt");
                Writer writer  = new OutputStreamWriter(outputStream,"GBK");
                BufferedWriter bufferedOutputStream = new BufferedWriter(writer);
        ){

            bufferedOutputStream.write("1 public class CharacterDemo {\n" +
                    "2 public static void main(String[] args) {\n" +
                    "3 // 创建对象\n" +
                    "4 // Character ch = new Character((char) 97);\n" +
                    "5 Character ch = new Character('a');\n" +
                    "6 System.out.println(\"ch:\" + ch);\n" +
                    "7 }\n" +
                    "8 }");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

4、序列化对象

 

4.1、对象序列化

对象序列化

        作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。

        使用到的流是对象字节输出流:ObjectOutputStream

 

构造器

说明

public ObjectOutputStream(OutputStream out)

把低级字节输出流包装成高级的对象字节输出流

ObjectOutputStream序列化方法

方法名称

说明

public final void writeObject(Object obj)

把对象写出去到对象序列化流的文件中去

创建Student对象(对象必须实现Serializable接口)

package com.itwpf.d04_BufferedInputOutputStream;

import java.io.Serializable;

public class Student implements Serializable {
    private String name;
    private String loginName;
    private String password;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

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

    public Student(String name, String loginName, String password, int age) {
        this.name = name;
        this.loginName = loginName;
        this.password = password;
        this.age = age;
    }

    public Student() {
    }
}
package com.itwpf.d04_BufferedInputOutputStream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamDemo1 {
    public static void main(String[] args) throws Exception {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("day05_file\\src\\main\\java\\data12.txt"));
        Student s = new Student("张三","zhangsan","123456",20);
        os.writeObject(s);
        os.close();
    }
}

4.2、对象反序列化

对象反序列化

        使用到的流是对象字节输入流:ObjectInputStream

        作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化

构造器

说明

public ObjectInputStream(InputStream out)

把低级字节输如流包装成高级的对象

字节输入流

ObjectInputStream序列化方法

方法名称

说明

public Object readObject()

把存储到磁盘文件中去的对象数据恢复成

内存中的对象返回

package com.itwpf.d04_BufferedInputOutputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.ObjectInputStream;

public class ObjectInputStreamDemo2 {
    public static void main(String[] args) throws Exception {
        ObjectInputStream os = new ObjectInputStream(new FileInputStream("day05_file\\src\\main\\java\\data12.txt"));
        Object o = os.readObject();
        System.out.println(o.toString());
    }
}

5、打印流

 

打印流

        作用:打印流可以实现方便、高效的打印数据到文件中去

        打印流一般是指:PrintStreamPrintWriter两个类。

        可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印booleantrue,写出去就是true

PrintStream

构造器

说明

public PrintStream(OutputStream os)

打印流直接通向字节输出流管道

public PrintStream(File  f)

打印流直接通向文件对象

public PrintStream(String filepath)

打印流直接通向文件路径

方法

说明

public void print(Xxx xx)

打印任意类型的数据出去

PrintWriter

构造器

说明

public PrintWriter(OutputStream os)

打印流直接通向字节输出流管道

public PrintWriter (Writer w)

打印流直接通向字符输出流管道

public PrintWriter (File  f)

打印流直接通向文件对象

public PrintWriter (String filepath)

打印流直接通向文件路径

方法

说明

public void print(Xxx xx)

打印任意类型的数据出去

package com.itwpf.d05_printStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class PrintDemo1 {

    public static void main(String[] args) throws Exception {
        PrintStream ps = new PrintStream(new FileOutputStream("day05_file\\src\\main\\java\\data02.txt",false),false,"UTF-8");
        ps.println("你好世界");
        ps.close();
    }
}

PrintStreamPrintWriter的区别

打印数据功能上是一模一样的,都是使用方便,性能高效(核心优势)

PrintStream继承自字节输出流OutputStream,支持写字节数据的方法。

PrintWriter继承自字符输出流Writer,支持写字符数据出去。

输出语句重定向

        属于打印流的一种应用,可以把输出语句的打印位置改到文件。

PrintStream ps = new PrintStream("文件地址")
System.setOut(ps);

package com.itwpf.d05_printStream;

import java.io.FileOutputStream;
import java.io.PrintStream;

public class PrintDemo2 {

    public static void main(String[] args) throws Exception {
        System.out.println("你好世界123456");
        PrintStream ps = new PrintStream("day05_file\\src\\main\\java\\data02.txt");
        System.setOut(ps);
        System.out.println("shijian123456");
    }
}


控制台输出:
你好世界123456
文件day05_file\\src\\main\\java\\data02.txt中出现:
shijian123456

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值