两个体系:InputStream、OutputStream和Reader、Writer。
源和目的:文件、内存、网络、控制台。
File操作以及装饰器模式。
- 1、源或目的是字节还是文本?是读还是写?
字节流读、写:FileInputStream、FileOutputStream;
文本流读、写:FileReader、FileWriter;
- 2、使用缓冲
字节缓冲流:BufferedInputStream、BufferedOutputStream;
字符缓冲流:BufferedReader、BufferedWriter;
- 3、字节流转字符流
读转换流:InputStreamReader;
写转换流:OutputStreamWriter;
- 4、其他流:
RandomAccessFile(随机访问文件位置、可读可写)、SequenceInputStream、DataOutputStream(写基本数据类型)
- 小练习:复制字节文本和字符文本
复制字节文本范例:
package com.agg.common.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyDemo {
public static void main(String[] args) {
File srcFile = new File("e:\\temp\\java\\agg.txt");
File desFile = new File("e:\\temp\\java\\copy_agg.txt");
if (srcFile.exists()) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(desFile);
int len;
byte[] buf = new byte[1024];
if ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
throw new RuntimeException("系统资源关闭失败");
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
throw new RuntimeException("系统资源关闭失败");
}
}
}
}
}
}
复制字符文本范例:
package com.agg.common.demo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileCharCopyDemo {
public static void main(String[] args) {
File file = new File("e:\\temp\\java\\agg.txt");
if (!file.exists()) {
System.out.print("file not exists!");
return;
}
try (BufferedReader br = new BufferedReader(new FileReader("e:\\temp\\java\\agg.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\temp\\java\\copy_agg.txt"))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 总结:
牢记IO流的使用思想,JDK再增加IO流对象的话,就只是在原有基础上装饰(装饰器模式)。