来自 马士兵IO基础
流的分类,java.io下分别继承以下四种流类型
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
一个字符(16bit)是两个字节(8bit), 两个字节是一个汉字
- 输入流和输出流: 程序读取数的是输入流
- 字节流和字符流: 读取单位为字节或字符来区分
- 节点流和处理流: 节点流就是单纯传输数据,处理流是针对节点流数据的过滤处理
- InputStream: 三个read方法,请尽量以字节数组读。close(),skip(long n)跳过n个字节不读;存在多个继承类,FileInputStream等等
- OutputStream: 三个write方法,请尽量以字节数组读。close(),flush()。 注意:在close前flush,将缓冲区的数据写到磁盘,避免直接close,管道直接关掉,数据丢失。
- Reader: 三个read,close、skip
- Writer: write,其中包含write(String string)将一个字符串写到输出流。close、flush
注意: read每次读出来的int值是ASCII码,可以强转为char作打印显示
1.处理流-缓冲流:(见方法buffer)
作用是起到缓冲的作用
BufferedReader, BufferedWriter, BufferedInputStream, BufferedOunputStream
2.处理流-转换流:(见方法outStreamWriter和inStreamReader)
作用是字节流和字符流的转换
OutputStreamWriter, InputStreanReader: 字节流转为字符流, OutputStream转成Writer,InputStream转为Reader
3.处理流-数据流:
练习代码如下:
// 存在中文乱码,因为中文占两字节,一个字节一个字节强转是有问题的,需采用字符流
private static void inputS() {
FileInputStream fileInputStream = null;
int c;
try {
fileInputStream = new FileInputStream("/Users/yuanshuwei/a.txt");
while ((c = fileInputStream.read()) != -1) {
System.out.print((char) c);
}
fileInputStream.close();
}catch (FileNotFoundException e) {
System.out.println("文件不存在");
}catch (IOException e) {
System.out.println("文件读取错误");
}
}
// 成功原样复制
private static void ouputS() {
FileInputStream fileInputStream;
FileOutputStream fileOutputStream;
int c;
try {
fileInputStream = new FileInputStream("/Users/yuanshuwei/a.txt");
fileOutputStream = new FileOutputStream("/Users/yuanshuwei/b.txt");
while ((c = fileInputStream.read()) != -1) {
System.out.print((char) c);
fileOutputStream.write(c);
}
// 重要
fileOutputStream.flush();
fileOutputStream.close();
fileInputStream.close();
}catch (FileNotFoundException e) {
System.out.println("文件不存在");
}catch (IOException e) {
System.out.println("文件读取错误");
}
}
// 原样打印
private static void fileReader() {
FileReader fileReader;
int c;
try {
fileReader = new FileReader("/Users/yuanshuwei/a.txt");
while ((c = fileReader.read()) != -1) {
System.out.print((char) c);
}
fileReader.close();
}catch (FileNotFoundException e) {
System.out.println("文件不存在");
}catch (IOException e) {
System.out.println("文件读取异常");
}
}
// 成功原样复制
private static void fileWriter() {
FileReader fileReader;
FileWriter fileWriter;
int c;
try {
fileReader = new FileReader("/Users/yuanshuwei/a.txt");
fileWriter = new FileWriter("/Users/yuanshuwei/b.txt");
while ((c = fileReader.read()) != -1) {
System.out.print((char) c);
fileWriter.write(c);
}
// 重要
fileWriter.flush();
fileWriter.close();
fileReader.close();
}catch (FileNotFoundException e) {
System.out.println("文件不存在");
}catch (IOException e) {
System.out.println("文件读取异常");
}
}
// 处理流(在节点流外面套一次管道)的缓冲流,可一次读一行 >>常用<<
private static void buffer() {
try {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("/Users/yuanshuwei/a.txt"));
BufferedReader bufferedReader = new BufferedReader(new FileReader("/Users/yuanshuwei/a.txt"));
for (int i = 0; i < 100; i++) {
bufferedWriter.write(String.valueOf(Math.random()));
bufferedWriter.newLine();
}
bufferedWriter.flush();
String c;
while ((c = bufferedReader.readLine()) != null) {
System.out.println(c);
}
bufferedReader.close();
bufferedWriter.close();
}catch (FileNotFoundException e) {
System.out.println("没有这个文件");
}catch (IOException e) {
System.out.println("IO异常");
}
}
// 转换流: OutputStreamWriter可以一次写字符串,可指定编码
private static void outStreamWriter() {
try {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("/Users/yuanshuwei/a.txt"));
outputStreamWriter.write("hello 123");
outputStreamWriter.flush();
System.out.println(outputStreamWriter.getEncoding());
outputStreamWriter.close();
// 此处的true为文件追加方式写
outputStreamWriter = new OutputStreamWriter(new FileOutputStream("/Users/yuanshuwei/a.txt", true), "ISO8859_1");
outputStreamWriter.write("hello 123");
System.out.println(outputStreamWriter.getEncoding());
outputStreamWriter.close();
}catch (FileNotFoundException e) {
System.out.println("找不到文件");
}catch (IOException e) {
System.out.println("IO异常");
}
}
// 转换流,此处将终端的输入流转换字符流的Reader,因为bufferedReader有好用的读整行的方法,后面又包了一层缓存流。 秒啊!!
private static void inStreamReader() {
InputStreamReader inputStreamReader = new InputStreamReader(System.in); //阻塞输入,不输入就不能做其他。同步式的
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
try {
String c;
while ((c = bufferedReader.readLine()) != null) {
if (c.equalsIgnoreCase("exit")) {
break;
}
c = c.toUpperCase();
System.out.println(c);
}
bufferedReader.close();
}catch (IOException e) {
System.out.println("IO异常");
}
}