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)