一、IO流的分类:
1.按流向不同:输入流、输出流(以程序为主体)
2.按类型不同:字节流、字符流(字符流用于操作文本文件 .txt .java 字节流用于操作非文本文件 .avi .jpg)
3.按角色不同:节点流、处理流
二、IO流的结构体系
抽象基类 节点流 缓冲流(处理流的一种)
InputStream FileInputStream BufferedInputStream
OutputStream FileOutputStream BufferedOutputStream(flush()-强制清空缓冲区)
Reader FileReader BufferedReader
Writer FileWriter BufferedWriter
//使用缓冲流完成非文本文件的复制
public static void copyFile(String src, String dest) {
// 2. 使用对应的缓冲流,包装节点流,用于提高效率
BufferedInputStream bis = null;
// 4. 使用对应的缓冲流,包装节点流,用于提高效率
BufferedOutputStream bos = null;
try {
// 1. 创建 FileInputStream 的实例,同时打开指定文件
FileInputStream fis = new FileInputStream(src);
bis = new BufferedInputStream(fis);
// 3. 创建 FileOutputStream 的实例,同时打开指定文件
FileOutputStream fos = new FileOutputStream(dest);
bos = new BufferedOutputStream(fos);
// 5. 使用缓冲流读取指定文件的内容
byte[] buf = new byte[1024];
int len = 0;
while ((len = bis.read(buf)) != -1) {
// 6. 使用缓冲流将读取的内容写到目标地点
bos.write(buf, 0, len);
}
//bos.flush(); //强制清空缓冲区
} catch (IOException e) {
e.printStackTrace();
} finally {
// 7. 关闭流
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三、对象流: ObjectInputStream & ObjectOutputStream
1. 序列化:将内存中的对象永久的以二进制形式保存到磁盘中
①创建节点流对象,同时打开指定文件
②(可选)创建对应的缓冲流,包装节点流,用于提高效率
③创建对象流,包装节点流,用于完成对象的序列化
④通过 writeXxx() 方法完成对象序列化操作
⑤关闭流
⑥需要序列化对象的类实现 java.io.Serializable 接口
⑦提供一个序列号 private static final long serialVersionUID = 235645768L;
注意:使用 trainsient 和 static 修饰的属性不能被序列化
2. 反序列化:将磁盘中保存的对象读取
// 反序列化
@Test
public void test2() {
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream("person.dat");
BufferedInputStream bis = new BufferedInputStream(fis);
ois = new ObjectInputStream(bis);
Person p1 = (Person) ois.readObject();
Person p2 = (Person) ois.readObject();
Person p3 = (Person) ois.readObject();
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 对象的序列化
@Test
public void test1() {
Person p1 = new Person("张", 18);
Person p2 = new Person("李四", 20);
Person p3 = new Person("王五", 22);
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream("./person.dat");
BufferedOutputStream bos = new BufferedOutputStream(fos);
oos = new ObjectOutputStream(bos);
oos.writeObject(p1);
oos.writeObject(p2);
oos.writeObject(p3);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四、控制台 IO
【了解】
System.in : "标准"的输入流
System.out : "标准"的输出流 可以通过 System.setOut(PrintStream p) 方法改变默认的输出位置
System.err : "标准"的错误输出流
打印流: PrintStream & PrintWriter
【重要】转换流: InputStreamReader & OutputStreamWriter
编码:字符串 -> 字节数组
解码:字节数组 -> 字符串
//转换流
@Test
public void test3(){
BufferedReader br = null;
try {
InputStream in = System.in;
InputStreamReader isr = new InputStreamReader(in);
br = new BufferedReader(isr);
String str = null;
while((str = br.readLine()) != null){
System.out.println("--" + str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
五、其他 IO 流
【了解】
数据流: DataInputStream & DataOutputStream
随即存储文件流:RandomAccessFile
getFilePointer() : 获取记录指针
seek(long pos) : 移动记录指针位置
六、java.io.File 类:表示文件或者目录。用于对文件或目录进行新建、删除、重命名等基本操作。
若需要操作文件的内容,File 类对象将无能为力。
若需要操作文件的内容需要使用 IO 流。
通常将 File 对象与 IO 流配合使用。 可将 File 对象作为参数
传递给 IO 流的构造器
访问文件名:
getName()
getPath()
getAbsoluteFile()
getAbsolutePath()
getParent()
renameTo(File newName)
文件检测
exists()
canWrite()
canRead()
isFile()
isDirectory()
获取常规文件信息
lastModified()
length()
文件操作相关
createNewFile()
delete()
目录操作相关
mkDir()
mkDirs()
list()
listFiles()