IO(2)

75 阅读7分钟

IO(2)

1 字节流

1.1 原始流

​ - InputStream

​ - OutputStream

1.2 缓冲流
1.2.1 原理

​ 字节缓冲输入流自带了8KB缓冲池;字节缓冲输出流也自带了8KB缓冲池。

1.2.2 BufferedOutputStream - (字节缓冲输出流)

​ - 流关联文件: public BufferedOutputStream(OutputStream os)

​ - 写数据: 跟原始的字节输出流是一样的

1.2.3 BufferedInputStream - (字节缓冲输入流)

​ - 流关联文件: public BufferedInputStream(InputStream is)

​ - 写数据: 跟原始的字节输入流是一样的

1.2.4 性能最优的拷贝组合

​ 字节缓冲输入流, 字节缓冲输出流 + 字节数组

1.3 PrintStream - 打印流 (输出流)
1.3.1 作用

​ 打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去

1.3.2 流关联文件
	- 打印流直接通向字节输出流/文件/文件路径: public PrintStream(OutputStream/File/String)

	- 可以指定写出去的字符编码: public PrintStream(String fileName, Charset charset)

	- 可以指定实现自动刷新: public PrintStream(OutputStream out, boolean autoFlush)

	- 可以指定实现自动刷新,并可指定字符的编码: public PrintStream(OutputStream out, boolean autoFlush, String encoding)
1.3.3 写数据

​ 1) 特有方法:

​ 打印任意类型的数据出去: public void println(Xxx xx)

​ 2) 其他方法: ​ 跟原始的字节输出流是一样的

1.3.4 换行

\r: 把后面的内容覆盖掉前面的内容

\n: 换行

\r\n: 换行 (置顶换行)

1.4 数据流
1.4.1 DataOutputStream

​ 允许把数据和其类型一并写出去

1) 流关联文件

​ public DataOutputStream(OutputStream out)(实际上就是包装原始的字节输出流)

2) 写数据

	- 将byte类型的数据写入基础的字节输出流: public final void writeByte(int v) throws IOException

	- 将int类型的数据写入基础的字节输出流 : public final void writeInt(int v) throws IOException

	- 将double类型的数据写入基础的字节输出流: public final void writeDouble(Double v) throws IOException

	- 将字符串数据以UTF-8编码成字节写入基础的字节输出流: public final void writeUTF(String str) throws IOException

	- 支持写字节数据出去
1.4.2 DataInputStream

​ 用于读取数据输出流写出去的数据

1) 流关联文件

​ public DataInputStream(InputStream is)(实际上就是包装原始的字节输出流)

2) 写数据

	- 读取字节数据返回: public final byte readByte() throws IOException

	- 读取int类型的数据返回: public final int readInt() throws IOException

	- 读取double类型的数据返回: public final double readDouble() throws IOException

	- 读取字符串数(UTF-8)据返回: public final String readUTF() throws IOException

	- 支持读字节数据进来: public int readInt()/read(byte[])
1.5 序列化流
1.5.1 ObjectOutputStream (对象字节输出流)

​ 1) 作用: 可以把Java对象进行序列化:把Java对象存入到文件中去

​ 2) 流关联文件: public ObjectOutputStream(OutputStream out) ==> 实际上就是包装原始的字节输出流

​ 3) 写数据:

​ 把对象写出去 => public final void writeObject(Object o) throws IOException

​ 支持写字节数据出去

​ 4) 注意事项: 对象如果要参与序列化,必须实现序列化接口

1.5.2 ObjectInputStream(对象字节输入流)

​ 1) 作用: 可以把Java对象进行反序列化:把存储在文件中的Java对象读入到内存中来

​ 2) 流关联文件: public ObjectInputStream(InputStream is) ==> 实际上就是包装原始的字节输出流

​ 3) 读数据: 把存储在文件中的Java对象读出来 => public final Object readObject()

2 字符流

2.1 原始流
2.1.1 FileReader(文件字符输入流)

1) 作用: 以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。

2) 流关联文件:

​ - 创建字符输入流管道与源文件接通: public FileReader(File file)

​ - 创建字符输入流管道与源文件接通: public FileReader(String pathname)

3) 读数据

​ - 每次读取一个字符返回,如果发现没有数据可读会返回-1: public int read()

​ - 每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会 返回-1: public int read(char[] buffer)

2.1.2 FileWriter(文件字符输出流)

1) 作用: 以内存为基准,把内存中的数据以字符的形式写出到文件中去。

2) 流关联文件:

	- 创建字节输出流管道与源文件对象接通:  public FileWriter(File file)

	- 创建字节输出流管道与源文件路径接通:  public FileWriter(String filepath)

	- 创建字节输出流管道与源文件对象接通,可追加数据: public FileWriter(File file,boolean append)	

	- 创建字节输出流管道与源文件路径接通,可追加数据: public FileWriter(String filepath,boolean append)

3) 写数据

	- 写一个字符: void write(int c)

	- 写一个字符串: void write(String str)
		
	- 写一个字符串的一部分: void write(String str, int off, int len)

	- 写入一个字符数组: void write(char[] cbuf)

	- 写入字符数组的一部分: void write(char[] cbuf, int off, int len)

4) 注意

​ 字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效

2.2 缓冲流
2.2.1 原理

​ 自带8K的字符缓冲池,可以提高字符输出流写字符数据的性能

2.2.2 BufferedWriter (字符缓冲输出流)

​ - 流关联文件: public BufferedWriter(Writer r) => 实际上就是包装原始的字符输出流

​ - 写数据: 跟原始的字符输出流是一样的

​ - 新增方法: 换行 => public void newLine()

2.2.3 BufferedReader (字符缓冲输入流)

​ - 流关联文件: public BufferedReader(Reader r) => 实际上就是包装原始的字符输入流

​ - 写数据: 跟原始的字符输入流是一样的

​ - 新增方法: 读取一行数据返回,如果没有数据可读了,会返回null => public String readLine()

2.3 转换流
2.3.1 OutputStreamWriter(字符输出转换流)

1) 作用: 可以控制写出去的字符使用什么字符集编码

2) 流关联文件: public OutputStreamWriter(OutputStream os,String charset)

3) 写数据: 跟原始流字符输出流是一样的

2.3.2 InputStreamReader(字符输入转换流)

1) 作用: 解决不同编码时,字符流读取文本内容乱码的问题

2) 流关联文件: public InputStreamReader(InputStream is ,String charset)

3) 读数据: 跟原始字符输入流是一样的

2.4 PrintWriter - 打印流 (输出流)
2.4.1 作用

​ 打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去

2.4.2 流关联文件
	- 打印流直接通向字节输出流/文件/文件路径: publicPrintWriter(OutputStream/Writer/File/String)
	
	- 可以指定写出去的字符编码: public PrintWriter(String fileName, Charset charset)

	- 可以指定实现自动刷新: public PrintWriter(OutputStream out/Writer, boolean autoFlush)

	- 可以指定实现自动刷新,并可指定字符的编码: public PrintWriter(OutputStream out, boolean  			autoFlush, String encoding)
2.4.3 写数据

1) 特有方法:

​ 打印任意类型的数据出去: public void println(Xxx xx)

2) 其他方法: ​ 跟原始的字节输出流是一样的

3 资源释放方式

3.1 try-catch-finally
3.2.1 格式
try { 
    ... 	
} catch (IOException e) {  
     e.printStackTrace();
}finally{
}
3.2.2 特点

​ finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止

3.2.3 作用

​ 一般用于在程序执行完成后进行资源的释放操作(专业级做法)。

3.2.4 弊端

​ 代码臃肿

3.2 try-with-resource
3.2.1 格式
try(定义资源1;定义资源2;…){     
可能出现异常的代码;
}catch(异常类名 变量名){        
异常的处理代码;
} 
3.2.2 资源

​ 资源一般指的是最终实现了AutoCloseable接口

4 IO框架

4.1 FileUtils
	- 复制文件: public static void copyFile(File srcFile, File destFile)

	- 复制文件夹: public static void copyDirectory(File srcDir, File destDir) 

	- 删除文件夹: public static void deleteDirectory(File directory)

	- 读数据: public static String readFileToString(File file, String encoding)

	- 写数据: public static void writeStringToFile(File file, String data, String charname, boolean append)
4.2 IOUtils
	- 复制文件Input/Output Stream: public static int copy(InputStream inputStream,OutputStream outputStream)

	- 复制文件 Reader/Writer: public static int copy(Reader reader, Writer writer) 

	- 写数据: public static void write(String data, OutputStream output, String charsetName)