1.文件字节输入流:FileInputStream
构造器 | 说明 |
---|---|
public FileInputStream(File file) | 创建字节输入流管道与源文件对象接通 |
public FileInputStream(String pathname) | 创建字节输入流管道与源文件路径接通 |
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字节返回字节本身,如果字节已经没有可读的返回-1 |
public int read(byte[ ] buffer) | 每次读取一个字节数组返回读取字节数量,如果没有可读的返回-1 |
字节输入流读取中文内容容易乱码,解决方法是定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。但如果文件过大,可能导致内存溢出。因此,读中文内容最好用字符流。
从JDK9开始,官方给出读取全部字节的API
方法名称 | 说明 |
---|---|
public byte[ ] readAllBytes() throws IOException | 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回 |
2.文件字节输出流:FileOutputStream
构造器 | 说明 |
---|---|
public FileOutputStream(File file) | 创建字节输出流管道与源文件对象接通,覆盖管道,会清空之前的数据 |
public FileOutputStream(File file, boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据,append:true |
public FileOutputStream(String filepath) | 创建字节输出流管道与源文件路径接通,覆盖管道 |
public FileOutputStream(String filepath, boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据,append:true |
方法名称 | 说明 |
---|---|
public void write(int a) | 写一个字节出去 |
public void write(byte[ ] buffer) | 写一个字节数组出去 |
public void write(byte[ ] buffer, int pos, int len) | 写一个字节数组的一部分出去 |
写数据必须刷新数据,防止没写进去,flush()方法,close()自带刷新
换行一般另写,os.write(“\r\n”.getBytes()),\r\n兼容性更好
字节流适合文件的拷贝,不适合中文文件的读取
3.try-catch-finally
- finally: 在异常处理时常用finally块执行所有清除操作,比如IO流中的资源释放
- 特点:finally块中语句一定会执行,除非JVM退出(System.exit(0))
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream("data/a.txt");
os = new FileOutputStream("data/b.txt");
} catch (Exception e){
e.printStackTrace();
} finally {
try {
if(os != null) os.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(is != null) is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
注意事项:
- 流的定义在try-catch块外,要是再try里定义,在finally里用不了
- 关闭流时也要try-catch
- 关闭流时判断一下流是否为null
4.try-with-resources
优点: 自动释放,代码简洁
JDK7改进方案:
try(定义流对象){
可能异常的代码;
} catch (异常类名 变量名){
异常的处理代码;
}
资源用完最终会自动释放
JDK9改进方案:
定义输入流对象;
定义输出流对象;
try(输入流对象名; 输出流对象名){
可能出现异常的代码;
} catch (异常类名 变量名){
异常的处理代码;
}
资源用完最终会自动释放
资源就是实现了Closeable或AutoCloseable接口的类
5.文件字符输入流:FileReader
构造器 | 说明 |
---|---|
public FileReader(File file) | 创建字符输入流管道与源文件对象接通 |
public FileReader(String pathname) | 创建字符输入流管道与源文件路径接通 |
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字符返回,没有返回-1 |
public int read(char[ ] buffer) | 每次读取一个字符数组,返回读取字符的个数,没有返回-1 |
6.文件字符输出流:FileWriter
方法名称 | 说明 |
---|---|
void write(int c) | 写一个字符 |
void write(char[ ] cbuf) | 写入一个字符数组 |
void write(char[ ] cbuf, int off, int len) | 写入字符数组的一部分 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
7.字节流与字符流的选择
- 字节流适合做一切文件数据的拷贝
- 字节流不适合读取中文内容输出
- 字符流适合做文本文件的操作