韩顺平_循序渐进学Java零基础_第19章 IO流(P611 - P644)
第19章 IO流
611. 文件基础知识
- 流:数据在数据源(文件)和程序(内存)之间经历的路径
- 以程序(内存)为参照,流入内存为输入流,流出内存为输出流
612. 创建文件
方法名 | 功能 |
---|
new File(String) | 根据路径构建一个 File 对象 |
new File(File,String) | 根据父目录文件 + 子路径构建 |
new File(String,String) | 根据父目录 + 子路径构建 |
613. 获取文件信息
方法名 | 功能 |
---|
getName() | 获取文件名,包含文件扩展名 |
getAbsolutePath() | 获取文件绝对路劲 |
getParent() | 获取文件父级目录 |
length() | 获取文件大小,以字节为单位 |
exists() | 判断是否存在 |
isFile() | 判断是否是文件 |
isDirectory() | 判断是否是目录 |
614. 目录操作
方法名 | 功能 |
---|
mkdir() | 创建一级目录 |
mkdirs() | 创建多级目录 |
delete() | 删除空目录或文件 |
615. IO流原理和分类
- 分类:
- 按操作数据单位不同分为字节流和字符流
- 按数据流的流向不同分为输入流和输出流
- 按流的角色的不同分为字节流和处理流(包装流)
- 抽象基类:InputStream(字节输入流)、 OutputStream(字节输出流)、Reader(字符输入流)、 Writer(字符输出流)
616. FileInputStream
- InputStream 的常用子类:FileInputStream、BufferedInputStream、ObjectInputSteam
617. FileOutputStream
- OutputStream 的常用子类:FileOutputStream、BufferedOutputStream、ObjectOutputStream
618. 文件拷贝
String src = "C:\\\\Users\\\\Admin\\\\Desktop\\\\BeFree.jpg";
String dst = "C:\\\\Users\\\\Admin\\\\Desktop\\\\BeFree.png";
FileInputStream fileInputStream = new FileInputStream(src);
FileOutputStream fileOutputStream = new FileOutputStream(dst);
int readLen;
byte[] buf = new byte[1024];
while ((readLen = fileInputStream.read(buf)) != -1)
fileOutputStream.write(buf, 0, readLen);
fileInputStream.close();
fileOutputStream.close();
619. 文件字符流说明
- FileWriter 使用后,必须 close() 或 flush(),否则数组只是写在缓冲区,未写入文件
- 字符流底层调用字节流实现具体功能
620. FileReader
621. FileWriter
622. 节点流处理流
- 节点流可以从一个特定的数据源读写数据,如 FileReader、FileWriter
- 处理流(包装流)是 “连接” 在已存在的流,为程序提供了更为强大的读写功能,如 BufferedReader、BufferedWriter
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputSteam | ByteArrayOutputStram | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
访问字符串 | | | StringReader | StringWriter |
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | | | InputStreamReader | OutputStreamWriter |
对象流 | ObjectInputStream | ObjectOutputStream | | |
抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
打印流 | | PirntStream | | PrintWriter |
推回输入流 | PushbackInputStream | | PushbackReader | |
特殊流 | DataInputStream | DataOutputStream | | |
- 处理流设计理念体现了修饰器模式。列表中前 5 行为节点流,其余行对应的流为包装流
623. 处理流设计模式
- 节点流是底层流,直接对数据源进行操作
- 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更加方便的方法来完成文件操作,底层调用节点流实现具体功能。优点主要有以下两点:1. 性能的提高:主要以增加缓冲的方式来提高输入输出的效率;2. 操作的便捷:提供了一系列便捷的方法来一次输入、输出大批量的数据(比如 BufferedReader 可以一次读取一行,而 FileReader 最多以字符数组形式进行读取)
- 使用处理流时,只需关闭外层流即可,对应的节点流会自动关闭
624. BufferedReader
String src = "C:\\\\Users\\\\Admin\\\\Desktop\\\\Java.txt";
BufferedReader bufferedReader = new BufferedReader(new FileReader(src));
String str;
while ((str = bufferedReader.readLine()) != null)
System.out.println(str);
bufferedReader.close();
625. BufferedWriter
626. Buffered拷贝
627. Buffered字节处理流
628. 字节处理流拷贝文件
- BufferedInputStream(new FileInputStream(String)) 缓冲处理本质上与 FileInputStream(String) 一致,并无特殊提高读写效率之处
629. 对象处理流
- 序列化与反序列化:Java 序列化 是指把 Java 对象转换为字节序列的过程;而 Java 反序列化 是指把字节序列恢复为 Java 对象的过程
- 若某个对象需支持序列化机制,则必须让其类是可序列化的,也即必须实现 Serializable 或 Externalizable 接口其中之一;其中 Serializable 是标记接口,无需实现任何方法;而 Externalizable 继承自 Serializable,需要实现方法
630. ObjectOutputStream
631. ObjectInputStream
String path = "C:\\\\Users\\\\Admin\\\\Desktop\\\\out.dat";
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(path));
objectOutputStream.writeUTF("Spring-_-Bear");
objectOutputStream.writeObject(new People(11, "小明"));
objectOutputStream.close();
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(path));
String str = objectInputStream.readUTF();
Object people = objectInputStream.readObject();
System.out.println(str);
System.out.println(people);
objectInputStream.close();
632. 对象处理流使用细节
- 序列化的类中建议添加 SerialVersionUID,为了提高版本的兼容性:private static final long SerialVersionUID = 1L
- 序列化对象时,默认将除了 static、transient(让某些被修饰的成员不被序列化) 修饰的成员以外的所有成员进行序列化保存
- 序列化对象时,要求类的所有属性的类型也需要实现序列化接口
- 序列化具备可继承性,实现的序列化接口的父类,其子类默认可序列化
633. 标准输入输出流
- 标准输入:System.in 编译类型是 InputStream,运行类型是 BufferedInputStream
public final static InputStream in = null;
System.out.println(System.in.getClass());
- 标准输出:System.out 编译类型是 PrintStream,运行类型也是 PrintStream
public final static PrintStream out = null;
System.out.println(System.out.getClass());
634. 乱码引出转换流
635. InputStreamReader
- InputStreamReader -> Reader:可以将 InputStream(字节流)包装成 Reader(字符流),同时指定编码
- OutputStreamWriter -> Writer:可以将 OutputStream(字节流)包装成 Writer (字符流),同时指定编码
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("c:\\\\users\\\\admin\\\\desktop\\\\temp1.txt"), StandardCharsets.UTF_8));
String str;
while ((str = bufferedReader.readLine()) != null)
System.out.println(str);
bufferedReader.close();
636. OutputStreamWriter
637. PrintStream
PrintStream printStream = System.out;
printStream.print("Hello World!");
printStream.write("Hello Java!".getBytes(StandardCharsets.UTF_8));
printStream.close();
System.setOut(new PrintStream("c:\\\\users\\\\admin\\\\desktop\\\\1.txt"));
System.out.println("Spring-_-Bear");
638. PrintWriter
- 设计字符输出到文件时需要 close() 或 flush(),否则内容不会写入到文件
639. 配置文件引出Propeties
640. Propeties读文件
- 键值对不需要有空格,值不需要引号,默认是 String
方法名 | 功能 |
---|
load(InputStream | Reader) | 加载配置文件的键值对 |
list(PrintStream | PrintWriter) | 将数据显示到指定设备 |
getProperty(String) | 根据键获取值 |
setProperty(String,String) | 设置键值对到 Propertiles 对象 |
store(OutputStream | Writer,String) | 保存到配置文件,含有中文默认保存 unicode 码值 |
641. Propeties修改文件
642. 家庭作业1
643. 家庭作业2
644. 家庭作业3