IO流

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流相关的知识,希望对你有一定的参考价值。

第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. 按流的角色的不同分为字节流和处理流(包装流)

  • 抽象基类: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

分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputSteamByteArrayOutputStramCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
访问字符串StringReaderStringWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter
对象流ObjectInputStreamObjectOutputStream
抽象基类FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
打印流PirntStreamPrintWriter
推回输入流PushbackInputStreamPushbackReader
特殊流DataInputStreamDataOutputStream
  • 处理流设计理念体现了修饰器模式。列表中前 5 行为节点流,其余行对应的流为包装流
  1. 处理流设计模式
  • 节点流是底层流,直接对数据源进行操作
  • 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更加方便的方法来完成文件操作,底层调用节点流实现具体功能。优点主要有以下两点: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

以上是关于IO流的主要内容,如果未能解决你的问题,请参考以下文章

IO流之IO流综述

IO异常--缓冲流--转换流--序列化流( IO流2 )

IO流(序列流)

java中的io流都有哪些

java IO流 IO流概述

IO流