一、字符流
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();
}
}