第19章 IO流

韩顺平_循序渐进学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流原理和分类

  • 分类:
    1. 按操作数据单位不同分为字节流和字符流
    2. 按数据流的流向不同分为输入流和输出流
    3. 按流的角色的不同分为字节流和处理流(包装流)

Java 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;
// class java.io.BufferedInputStream
System.out.println(System.in.getClass());
  • 标准输出:System.out 编译类型是 PrintStream,运行类型也是 PrintStream
public final static PrintStream out = null;
// class java.io.PrintStream
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!");
// print 方法底层调用了 write 方法,因此等价
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

猜你喜欢

转载自blog.csdn.net/weixin_51008866/article/details/121483043