目录
一、IO 流的结构体系
二、缓冲流:BufferedInputStream & BufferedOutputStream
三、对象流:ObjectInputStream & ObjectOutputStream
四、控制台IO
五、转换流 InputStreamReader & OutputStreamWriter
六、java.io.File 类 :
处理流的一种,包装现有节点流,用于提高效率,内置缓冲区
//非文本文件的复制
@Test
public void test1(){
//3. 创建 BufferedInputStream 的实例,包装对应的节点流,用于提高效率
BufferedInputStream bis = null;
//4. 创建 BufferedOutputStream 的实例,包装对应的节点流,用于提高效率
BufferedOutputStream bos = null;
try {
//1. 创建 FileInputStream 的实例,同时打开指定文件
FileInputStream fis = new FileInputStream("C:\\Users\\LI/Desktop/1.jpg");
//2. 创建 FileOutputStream 的实例,同时打开指定文件
FileOutputStream fos = new FileOutputStream("C:\\Users\\LI\\Desktop\\2.jpg");
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//5. 通过 read(byte[] b)读取指定文件的内容
byte[] b = new byte[1024];
int len = 0; //接收实际读取的字节总数
while((len = bis.read(b)) != -1){
//6. 通过 write(byte[] b, int off, int len) 将读取的内容写到目标地点去
bos.write(b, 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();
}
}
}
}
对象的序列化:将内存中的对象永久的以二进制形式保存到磁盘中。
①创建节点流的对象
②(可选)使用缓冲流包装现有节点流,用于提高效率
③创建对象流包装现有缓冲流,用于序列化
④通过 writeXxx() 方法 Xxx: 对应的数据类型,完成对象的序列化操作
⑤关闭流
⑥需要序列化对象的类必须实现 java.io.Serializable 接口(该类其他属性也必须实现该接口)
⑦需要提供一个序列号,保证如何序列化就如何反序列化
public static final long serialVersionUID = 9239893899894L;
对象的反序列化:将磁盘中的数据进行读取
public class ObjectStreamTest {
// 反序列化
@Test
public void test1() {
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream("./person.dat");
BufferedInputStream bis = new BufferedInputStream(fis);
ois = new ObjectInputStream(bis);
List list = (List) ois.readObject();
Iterator it = list.iterator();
while(it.hasNext()){
Person p = it.next();
System.out.println(p);
}
} catch (ClassNotFoundException | IOException e1) {
e1.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 序列化
public static void main(String[] args) {
Person p1 = new Person("张三", 18, 98.88);
Person p2 = new Person("李四", 20, 100.22);
Person p3 = new Person("王五", 38, 300.33);
List list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream("./person.dat");
BufferedOutputStream bos = new BufferedOutputStream(fos);
oos = new ObjectOutputStream(bos);
oos.writeObject(list);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
【了解】
System.in : “标准”的输入流
System.out : "标准"的输出流(System.setOut() 可以改变 println 方法的默认输出位置)
System.err :"标准"的错误输出流
打印流:PrintStream & PrintWriter
编码:字符串 -> 字节数组 OutputStreamWriter
//编码
@Test
public void test2(){
String str = "好好学习天天向上!";
BufferedWriter bw = null;
try {
//注意:应该使用字符流操作文本文件,暂时为了演示转换流的用法,使用字节流操作文本文件
FileOutputStream fos = new FileOutputStream("hello.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
bw = new BufferedWriter(osw);
bw.write(str);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bw != null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
解码:字节数组 -> 字符串
//解码
@Test
public void test3(){
BufferedReader br = null;
try {
FileInputStream fis = new FileInputStream("hello.txt");
InputStreamReader isr = new InputStreamReader(fis, "ISO8859-1");
br = new BufferedReader(isr);
String str = br.readLine();
System.out.println(str);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
描述文件或目录,用于操作文件或目录新建、删除、重命名等基本操作
若需要操作文件的内容,File 对象将无能为力,需要使用 IO 流
通常 File 对象与 IO 配合使用,将 File对象作为参数传递给 IO 流的构造器。
访问文件名:
文件检测
获取常规文件信息
文件操作相关
目录操作相关