文章目录
- 概述
- 流的划分
- 文件流
- 缓冲流
- 转换流(字符编码和解码)
- 序列化
- 系统输入输出:Scanner、print
概述
- 全称:inputoutputstream
- 译名:输入输出流
流的划分
- 以内存为参照,根据数据的流向,可分为:
输入流(input stream):把数据从其他设备读到内存中的流
输出流(output stream):把数据从内存写到其他设备上的流 - 按照数据的类型划分:
字节流 :以字节为单位,读写数据的流
字符流 :以字符为单位,读写数据的流 - 按功能划分
节点流,例如:文件流…
处理流,例如:缓冲流、转换流…
Java的4个IO抽象基类 | 输入流 | 输出流 |
字节流 |
|
|
字符流 |
|
|
文件流
文件流 | Java类 |
文件字节输入流 |
|
文件字节输出流 |
|
文件字符输入流 |
|
文件字符输出流 |
|
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Hello {
public static void main(String[] args) throws IOException {
File f = new File("a.txt");
// 输出流:写数据到文件
FileOutputStream fO = new FileOutputStream(f);
// fO.write("abc".getBytes());
byte[] b = {'a', 'b', 'c'};
fO.write(b);
// 关闭资源
fO.close();
// 输入流:从文件读数据
FileInputStream fI = new FileInputStream(f);
// 循环逐个地读取
int i;
while ((i = fI.read()) != -1) {
System.out.print((char) i);
}
// 关闭资源
fI.close();
}
}
上面的Java代码≈下面这个Python代码
# 输出
with open('a.txt', 'wb')as fw:
fw.write(b'abc')
# 输入
with open('a.txt', 'rb')as fr:
first = fr.read(1)
while first:
print(first.decode(), end='')
first = fr.read(1)
缓冲流
缓冲流 | Java类 |
缓冲字节输入流 |
|
缓冲字节输出流 |
|
缓冲字符输入流 |
|
缓冲字符输出流 |
|
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;
public class Hello {
public static void main(String[] args) throws IOException {
// 文件字符输出流
FileWriter fW = new FileWriter("a.txt");
// 缓冲字符输出流
BufferedWriter bW = new BufferedWriter(fW);
// 按行写数据
bW.write("落水无花");
bW.newLine();
bW.write("落翔无痕");
// 关闭资源
bW.close();
fW.close();
// 文件字符输入流
FileReader fR = new FileReader("a.txt");
// 缓冲字符输入流
BufferedReader bR = new BufferedReader(fR);
// 按行读数据
String line;
while ((line = bR.readLine()) != null) {
System.out.println(line);
}
// 关闭资源
bR.close();
fR.close();
}
}
上面的Java代码≈下面这个Python代码
# 输出
with open('a.txt', 'w', encoding='utf-8')as fw:
fw.write('落水无花')
fw.write('\n')
fw.write('落翔无痕')
# 输入
with open('a.txt', 'r', encoding='utf-8')as fr:
for line in fr.read().split('\n'):
print(line)
转换流(字符编码和解码)
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class Hello {
public static void main(String[] args) throws IOException {
// 文件字节输出流
FileOutputStream fOS = new FileOutputStream("a.txt");
// 转换输出流,设定编码
OutputStreamWriter oSW = new OutputStreamWriter(fOS, StandardCharsets.UTF_8);
// 写数据
oSW.write("落水无花\n拉");
oSW.write("屎无痕");
// 关闭资源
oSW.close();
fOS.close();
// 文件字节输入流
FileInputStream fIS = new FileInputStream("a.txt");
// 转换输入流
InputStreamReader bSR = new InputStreamReader(fIS, StandardCharsets.UTF_8);
// 读数据
int read;
while ((read = bSR.read()) != -1) {
System.out.print((char) read);
}
// 关闭资源
bSR.close();
fIS.close();
}
}
对比Python的编码方式
s = 'si落无花'
se = s.encode('utf-8')
print(se) # b'si\xe8\x90\xbd\xe6\x97\xa0\xe8\x8a\xb1'
sd = se.decode('utf-8')
print(sd) # si落无花
序列化
- 序列化:将对象的状态信息转换为可存储或传输的形式的过程
- 跨进程通信时,需要序列化
import java.io.*;
class Student implements Serializable {
@Override
public String toString() {
return "学生";
}
}
public class Hello {
public static void main(String[] args) {
// 创建可序列化对象
Student s0 = new Student();
// 文件
File f = new File("xjj");
// 写对象
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream((f)));
oos.writeObject(s0);
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
// 读对象
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
Student s1 = (Student) ois.readObject();
System.out.println(s1);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
系统输入输出:Scanner、print
一个简单的文本扫描器,可以使用正则表达式解析基本类型和字符串
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
// 创建扫描器
Scanner input = new Scanner(System.in);
// 获取字符串
System.out.print("请输入一个字符串:");
String string = input.nextLine();
System.out.println(string);
// 获取整数
System.out.print("请输入一个整数:");
Integer integer = input.nextInt();
System.out.println(integer);
}
}
效果