Java--IO--字符流

一、字符流

1.1 字符流概述

  • 字节流能读写任意类型的文件
  • 一个字符可能是一个或者多个字节组成
    • a一个字节
    • 床2个字节
    • 嬴3个字节
  • 使用字节流每次读取一个字节可能会造成读取半个文字
  • 需要一种能按照个数读取数据的流–字符流

1.2 字符输入流

抽象类reader
  • 用于读取字符流的抽象类。
实现类InputStreamReader
FileReader
  • 用来读取字符文件的便捷类。
创建对象
FileReader(String fileName) 
          在给定从中读取数据的文件名的情况下创建一个新 FileReader。
读取数据
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;

public class Demo03 {
    public static void main(String[] args) throws IOException {
        /**
             int read() 
                      读取单个字符。 
             int read(char[] cbuf) 
                      将字符读入数组。 
             int read(char[] cbuf, int off, int len) 
                      将字符读入数组的某一部分。 
         */
        
        FileReader reader = new FileReader("world.txt");
        
        char[] c = new char[4];
        int len;
        len = reader.read(c);
        System.out.println(len);
        System.out.println(Arrays.toString(c));
        
        len = reader.read(c);
        System.out.println(len);
        System.out.println(Arrays.toString(c));
        
        len = reader.read(c);
        System.out.println(len);
        System.out.println(Arrays.toString(c));
        
        len = reader.read(c);
        System.out.println(len);
        System.out.println(Arrays.toString(c));
        
        len = reader.read(c);
        System.out.println(len);
        System.out.println(Arrays.toString(c));
                
        reader.close();
        
    }
}

1.3 字符输出流

抽象类Writer
  • 写入字符流的抽象类。
实现类OutputStreamWriter
FileWriter
  • 用来写入字符文件的便捷类。
创建对象和写入数据
import java.io.FileWriter;
import java.io.IOException;

public class Demo01 {
    public static void main(String[] args) throws IOException {
        /**
            FileWriter(String fileName) 
                      根据给定的文件名构造一个 FileWriter 对象。 
            FileWriter(String fileName, boolean append) 
                      根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 
         */
        
        FileWriter writer = new FileWriter("hehe.txt",true);
        
        
        /**
             void write(char[] cbuf, int off, int len) 
                      写入字符数组的某一部分。 
             void write(int c) 
                      写入单个字符。 
             void write(String str, int off, int len) 
                      写入字符串的某一部分。 
         */
        writer.write("斯是陋室惟吾德馨。");
        
        writer.close();
        
    }
}

1.4 使用字符流复制小说

1、创建字符流镀锡
2、循环读写数据
3、关闭流
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo02 {
    public static void main(String[] args) throws IOException {
        /**
         * 复制小说
         *  1、创建流对象
         *  2、读写数据
         *  3、关闭流
         */
        // 创建流对象
        FileReader reader = new FileReader("D:\threeCountry.txt");
        FileWriter writer = new FileWriter("C:\Users\dushine\Desktop\threeCountry.txt");
        
        
        // 循环读写
        char[] c = new char[1024];
        int len = -1;
        
        while ((len = reader.read(c)) != -1) {
            writer.write(c, 0, len);
        }
        
        writer.flush();
        // 关闭流
        writer.close();
        reader.close();
        
        System.out.println("OVER");
    }
}

二、转换流

2.1 概述

  • 解决乱码问题
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Demo01 {
    public static void main(String[] args) throws IOException {
        /**
         *  解决乱码
         *      --UTF-8的格式读取内容
         *      --GBK的格式写入内容
         */
        // 创建转换流对象
        InputStreamReader isr = new InputStreamReader(new FileInputStream("Day19笔记--IO.md"), "UTF-8");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("Day19笔记--IO-副本.md"), "GBK");
        
        // 循环读写
        char[] c = new char[1024];
        int len = -1;
        
        while ((len = isr.read(c)) != -1) {
            osw.write(c, 0, len);
        }
        
        // 关闭流
        osw.close();
        isr.close();
        System.out.println("OVER");
    }
}

三、对象流

3.1 概述

  • 传输对象
  • 发送数据【序列化】
  • 接收数据【反序列化】

3.2 案例

收发JDK内置类型
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Demo01 {
    public static void main(String[] args) throws IOException {
        /**
         * 写入数据
         */
        
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file"));
        
        oos.writeObject(1000);
        oos.writeObject(3.14);
        oos.writeObject("Hello");
        oos.writeObject(true);
        oos.writeObject(new int[] {11,22,33,44,55});
        
        oos.close();
        
        System.out.println("OVER");
    }
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Demo02 {
    public static void main(String[] args) throws ClassNotFoundException, IOException {
        /**
         * 读取数据
         */
        // 创建对象流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file"));
        
        // 读取数据
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        
        // 关闭流
        ois.close();
        
    }
}
收发自定义类型
  • 自定义类型需要实现序列化接口
import java.io.Serializable;

public class Student implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 3456789091230876L;
	String name;
	int age;
	String address;
	String info;

	public Student(String name, int age, String address, String info) {
		super();
		this.name = name;
		this.age = age;
		this.address = address;
		this.info = info;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", address=" + address + ", info=" + info + "]";
	}

}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Demo03 {
	public static void main(String[] args) throws IOException {
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu"));
		
		// 发送数据:对象需要实现序列化接口 && 对象中的每一个属性都必须实现序列化接口
		oos.writeObject(new Student("罗永浩", 42, "东北", "真还传"));
		
		oos.close();
		
		System.out.println("OVER");
	}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Demo04 {
	public static void main(String[] args) throws ClassNotFoundException, IOException {
		// 创建输入流
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("stu"));
		
		// 读取对象
		Object obj = ois.readObject();
		System.out.println(obj);
		
		ois.close();
	}
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值