外观
节点流和处理流
节点流和处理流
节点流
对应资源的流
文件资源(File)
内存资源(char、string、byte)
进程间的通讯
网络通讯
键盘输入
控制台输出
处理流
采用装饰器模式
1.缓冲流(Buffered-xxxx-In/OutputStream)
特点:带缓冲(读写效率高)它依托于字符输入输出流
1.创建流
它依托于字符输入输出流
Reader reader = new FileReader("./test/test4.txt"); BufferedReader bufferedReader = new BufferedReader(reader);
2.操作流
1.bufferedReader.readLine()读取一行
2.循环读取整个内容
3.bufferedReader.skip(2)跳过一行中的n个字符
private static void test1() {
try(
Reader reader = new FileReader("./test/test4.txt");
BufferedReader bufferedReader = new BufferedReader(reader);
) {
// 读取一行
// System.out.println(bufferedReader.readLine());// 第一行
// System.out.println(bufferedReader.readLine());// 第二行
// System.out.println(bufferedReader.readLine());// 第三行......
// 读取整个内容
// String s = "";
// while((s = bufferedReader.readLine()) != null) {
// System.out.println(s);
// }
// 跳过一行中的n个字符
bufferedReader.skip(2);
// System.out.println(bufferedReader.read());
System.out.println(bufferedReader.readLine());
// bufferedReader.skip(3);
// System.out.println(bufferedReader.readLine());
// bufferedReader.skip(3);
// System.out.println(bufferedReader.readLine());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
2.转换流(一定是字符流)
它依托于字节输入输出流
作用:字节流转换为字符流
字节流一般不需要转字符流(除非需要显式控制输)
字符集:
ISO-8859-1:西欧文字
中文:GB2312、GBK(简体中文国标)、BIG5(繁体中文,台湾)
UTF-8(1-4字节变长字符集)兼容世界各国语言,支持中文
1.输入转换流(InputStreamRander)
1.创建流
InputStream inputStream = new FileInputStream("./test/test.txt"); InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
2.操作流
1.inputStreamReader.read()读取一个字符
2.inputStreamReader.read(char[] chs)读取字符数组
3.System.in.read()从系统输入流读取
4.指定字符编码读取
构造方法第二个参数可以指定字符编码
inputStreamReader = new InputStreamReader(inputStream, "GBK");
public static void test1() throws IOException {
InputStream inputStream = new FileInputStream("./test/test.txt");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//
// System.out.println(inputStreamReader.read());
// 读取字符数组
char[] chs = new char[10];
// inputStreamReader.read(chs);
// System.out.println(Arrays.toString(chs));
// 从系统输入流读取
// System.out.println(System.in.read());
// byte[] bytes = new byte[10];
// System.in.read(bytes);
// System.out.println(Arrays.toString(bytes));
// inputStreamReader = new InputStreamReader(s
// 指定字符编码读取
inputStream = new FileInputStream("./test/test3.txt");
// inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
inputStreamReader = new InputStreamReader(inputStream, "GBK");
inputStreamReader.read(chs);
System.out.println(Arrays.toString(chs));
inputStreamReader.close();
inputStream.close();
}
2.输出转换流(OutputStreamRander)
1.创建流
OutputStream outputStream = new FileOutputStream("./test/test5.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
2.操作流
1.outputStreamWriter.write("你好")写出到文件
2.以指定编码写入
构造方法第二个参数可以指定字符编码
outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
private static void test1() throws IOException {
OutputStream outputStream = new FileOutputStream("./test/test5.txt");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
// 写出到文件
// outputStreamWriter.write("你好");
// 以指定编码写入
outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
outputStreamWriter.write("你好");
outputStreamWriter.flush();
outputStreamWriter.close();
outputStream.close();
System.out.println("ok");
}
3.转换
使用输入转换流(InputStreamRander)以指定字符编码读入再使用输出转换流(OutputStreamRander)以指定字符编码写出即可完成文件的编码转换
3.打印流(PrintStream)
系统打印流
1.System.err
2.System.out
特点:
1.重写了大量的print()方法
2.自身处理异常,不影响显示
3.自动执行flush()方法
1.创建流
OutputStream outputStream = new FileOutputStream("./test/test6.txt"); PrintStream printStream = new PrintStream(outputStream);
2.操作流
1.printStream.println("你好时间")写入一行字符到文件
2.通过设置系统打印流实现系统函数写入文件内容
PrintStream syso = System.out;
System.setOut(printStream); System.out.println("哈哈哈哈哈"); System.setOut(syso); System.out.println("切回来");
private static void test1() throws IOException {
OutputStream outputStream = new FileOutputStream("./test/test6.txt");
PrintStream printStream = new PrintStream(outputStream);
// 写入一行字符到文件
printStream.println("你好时间");
// 存储系统打印流
PrintStream syso = System.out;
// 设置系统打印流
System.setOut(printStream);
System.out.println("哈哈哈哈哈");
System.setOut(syso);
System.out.println("切回来");
outputStream.close();
printStream.close();
System.out.println("ok");
}
4.数据流(DataInputStream)
好处:非常方便的读写各种数据类型
不需要按单个字节进行读写操作。可以按照数据类型读写
1.数据输出流(DataInput/OutputStream)
1.创建流
使用文件创建输出流OutputStream out = new FileOutputStream("./test/test7.txt"); 使用系统输出流创建输出流OutputStream out = System.out; 使用byte数组流创建输出流ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(out);
2.操作流
1.dataOutputStream.writeChars("DataOutputStraem测试")写入指定数据类型的数据
2.dataOutputStream.writeByte(byte[] b)写入byte数组
private static void test1() throws IOException {
// OutputStream out = new FileOutputStream("./test/test7.txt");
OutputStream out = System.out;
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(out);
dataOutputStream = new DataOutputStream(arrayOutputStream);
// 写入指定数据类型的数据
dataOutputStream.writeChars("DataOutputStraem测试");
// 写入byte数组
String b = "1235698";
dataOutputStream.writeBytes(b);
byte[] r = arrayOutputStream.toByteArray();
System.out.println(Arrays.toString(r));
out.close();
arrayOutputStream.close();
System.out.println("ok");
}
注:当使用系统输出流创建输出流时,进行的数据写入操作会直接显示在控制台
2.数据输入流(DataInputStream)
1.创建流
byte[] buf = {1,2,3}; ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(buf); DataInputStream dataInputStream = new DataInputStream(arrayInputStream);
2.操作流
1.dataInputStream.readByte()读取一个byte类型的数
2.dataInputStream.read(byte[] b)读取到byte数组
private static void test1() throws IOException {
byte[] buf = {1,2,3};
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(buf);
DataInputStream dataInputStream = new DataInputStream(arrayInputStream);
// 读取一个byte类型的数
// System.out.println(dataInputStream.readByte());
// System.out.println(dataInputStream.readByte());
// System.out.println(dataInputStream.readByte());
// 读取到byte数组
byte[] r = new byte[20];
dataInputStream.read(r);
System.out.println(Arrays.toString(r));
}
5.对象流(ObjectInput/OutputStream)
注意
需要序列化(串化)
序列化:把对象转换成数据流(一个个的字节)用来保存到磁盘或者网络上传输
反序列化:把字节流转换成内存中的对象
序列化接口:Serializable,标志性接口
表示该类的对象具有序列化和反序列化的能力不实现接口
在序列化过程中可能会产生java.io.NotSerializableException
只要实现了Serializable接口的类的对象都可以序列化
SerialVersionUID可防止读取不合适的数据
transient关键字
transient关键字修饰的变量(字段)在对象序列化时不进行序列化,可局部控制序列化的顺序
Externalizable接口
可指定某个字段序列化
// 从文件读取对象
private static void test1() throws IOException, ClassNotFoundException {
InputStream inputStream = new FileInputStream("./test/studnet.dat");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
// // 读取文件中的student对象
// Student student = (Student) objectInputStream.readObject();
// System.out.println(student);
Object students = objectInputStream.readObject();
System.out.println(students);
objectInputStream.close();
inputStream.close();
}
// 将对象写入文件
private static void test2() throws IOException {
OutputStream outputStream = new FileOutputStream("./test/studnet.dat");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
// 写入一个序列化的对象数据
Student student = new Student(1001, "张三", 16);
// objectOutputStream.writeObject(student);
System.out.println("ok");
// 写入一个list对象
List<Student> students = new LinkedList<Student>();
students.add(student);
students.add(new Student(1002));
students.add(new Student(1003));
objectOutputStream.writeObject(students);
objectOutputStream.close();
outputStream.close();
System.out.println("ok");
}