Java-IO-字符流
字符流
字符流
为了解决读取中文可能会出现的显示不了完整的字符的问题,java提供了字符流类
Reader
用于读取字符流的抽象类,是一个抽象类所以我们得使用子类
子类很多,我们重点学习InputStreamReader
类下的FileReader
这个类
包路径
1 | java.io |
常用方法
1 | public int read()throws IOException |
Writer
同样有很多子类,我们主要关注FileWrite
这个子类
包路径
1 | java.io |
常用方法
1 | public void write(int c)throws IOException |
FileReader
用来读取字符文件的便捷类,
包路径
1 | java.io |
构造方法
1 | public FileReader(File file)throws FileNotFoundException |
构造方法的作用:
- 创建一个FileReader对象
- 会把FileReader对象指向要读的文件
读取数据
步骤:
- 创建
FileReader
对象,构造方法中绑定要读取的数据源 - 使用
FileReader
对象中的方法read
读取文件 - 释放资源
1 | FileReader fr = new FileReader("D:\\a.txt"); |
数组也是可以的
1 | FileReader fr = new FileReader("D:\\a.txt"); |
FileWrite
把内存中的字符数据写入到文件中
包路径
1 | java.io |
构造方法
1 | public FileWriter(File file)throws IOException |
步骤:
- 创建
FileWriter
对象,构造方法中绑定要写入数据的目的地 - 使用
FileWriter
中的方法write
,把数据写入到内存缓冲区中(字符转换为字节的过程) - 使用
FileWriter
中的方法flush
,把内存缓冲区中的数据刷新到文件中 - 释放资源(会先把内存缓冲区中的数据刷新到文件中)
注意:
与其他输出方法不同,writer要走内存缓冲区
1 | FileWriter fw = new FileWriter("D:\\a.txt"); |
close
与flush
区别
两个方法都可以把数据刷新到文件中
- flush : 刷新缓冲区,流对象可以继续使用
- close : 先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用了
写出其他数据
可以写字符数组,写字符数组的一部分,写字符串,还有字符串的某一部分
1 | FileWriter fw = new FileWriter("D:\\a.txt"); |
续写与换行
同字节流
1 | FileWriter fw = new FileWriter("D:\\a.txt",true); |
IO流异常抛出的处理
一直我们都是throws丢给JVM来处理,但是我们可以使用try\catch\finally来处理异常
1 | public static void main(String[] args) { |
JDK7新特性
在try的后边可以增加一个(),在括号中可以定义流对象,那么这个流对象的作用域就在try有效,try中的代码执行完毕,会把流对象自动释放,不用写finally
格式:
1
2
3
4
5try(定义流对象;定义流对象...){
//可能会产生异常代码
}catch(异常类变量 变量名){
//异常的处理逻辑
}1
2
3
4
5
6
7
8
9
10
11try (
FileInputStream fis = new FileInputStream("D:\\a.txt");
FileOutputStream fos = new FileOutputStream("D:\\a.txt");
) {
int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}
} catch (IOException e) {
e.printStackTrace();
}JDK9新特性
try的前面我们可以定义流对象,try后面的()中,可以直接引入流对象的名称(变量名)
在try代码执行完毕之后,流对象也可以释放掉,不用写finally
格式:
1
2
3
4
5
6
7A a = new A();
B b = new B();
try(a,b){
//可能会产生异常代码
}catch(异常类变量 变量名){
//异常的处理逻辑
}