目录
④abstract void write(char[] cbuf, int off, int len)
⑦void write(String str, int off, int len)
一、字符输入流(Reader)
1、Reader类概述
①是抽象类(抽象类是无法实例化对象的,用其子类);
②是所有字节输出流最顶层的父类;
③定义了一些子类共性的成员方法;
④重点研究子类InputStreamReader的子类FileReader;
2、Reader类的成员方法(部分)
①abstract void close()
关闭该流并释放与之关联的所有资源;
②int read()
读取单个字符;
③int read(char[] cbuf)
将字符读入数组;
3、FileReader类
字符输入流的作用:
把硬盘文件中的数据以字符的方式读取到内存中;
构造方法:
FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader;
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader;
构造方法的参数说明:读取文件的数据源,file是file对象,fileName是文件的路径;
构造方法的作用:
①创建一个FileReader对象;
②将FileReader对象指向要读取的文件;
二、字符输入流读取字符数据
1、字符输入流(FileReader)的使用步骤
①创建一个FileReader对象,构造方法传入要读取的数据源;
②使用FileReader类中的read方法读取数据;
③释放资源;
2、代码演示
package study.io;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
public static void main(String[] args) throws IOException {
//①创建一个FileReader对象,构造方法传入要读取的数据源;
FileReader fileReader = new FileReader("C:\\Users\\Administrator\\Desktop\\test.txt");
//②使用FileReader类中的read方法读取数据;
int i = fileReader.read();
System.out.println(i);//97,若资源读取完毕,同样是返回-1
//一次读取多个字符
char[] chars = new char[1024];
int j = fileReader.read(chars);
System.out.println("读取到的有效字符个数为:"+j);//2,因为第一次读取完,指针后移了
System.out.println("读取到的多个字符为:"+ new String(chars));//bc
//③释放资源;
fileReader.close();
}
}
三、字符输出流(Writer)
1、Writer类概述
①是抽象类(抽象类是无法实例化对象的,用其子类);
②是所有字节输出流最顶层的父类;
③定义了一些子类共性的成员方法;
④重点研究子类OutputStreamWriter的子类FileWriter;
2、Writer类的成员方法(部分)
①abstract void close()
关闭此流,但要先刷新它;
②abstract void flush()
刷新该流的缓冲;
③void write(char[] cbuf)
写入字符数组;
④abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分;
⑤void write(int c)
写入单个字符;
⑥void write(String str)
写入字符串;
⑦void write(String str, int off, int len)
写入字符串的某一部分;
3、FileWriter类
字符输出流的作用:
把内存中字符数据写入到文件中;
构造方法:
FileWriter(File file)
根据给定的 File 对象构造一个 FileWriter 对象;
FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象;
构造方法的参数说明:读取文件的数据源,file是file对象,fileName是文件的路径;
构造方法的作用:
①创建一个FileWriter对象;
②根据构造方法中传递文件或者文件的路径创建一个文件;
③将FileWriter对象指向创建好的文件;
四、字符输出流的基本使用
1、字符输出流的使用步骤(重点)
①创建FileWriter对象,构造方法中传入要写入数据的目的地;
②使用FileWriter中的write方法,把数据写入到内存缓冲区(字符转换为字节的过程);
③使用FileWriter中的flush方法,将内存缓冲区中的数据,刷新到文件中;
④释放资源(会先把内存缓冲区中的数据刷新到文件中);
2、代码演示
代码:
package study.io;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args) throws IOException {
//①创建FileWriter对象,构造方法中传入要写入数据的目的地;
FileWriter fileWriter = new FileWriter("C:\\Users\\Administrator\\Desktop\\test001.txt");
//②使用FileWriter中的write方法,把数据写入到内存缓冲区(字符转换为字节的过程);
fileWriter.write(97);//写入单个字符a
fileWriter.write("写入一个字符串!");//写入一个字符串
fileWriter.write(new char[]{'a','b','c'});//写入一个字符数组
//③使用FileWriter中的flush方法,将内存缓冲区中的数据,刷新到文件中;
fileWriter.flush();
//④释放资源(会先把内存缓冲区中的数据刷新到文件中);
fileWriter.close();
}
}
运行结果:
五、字符输出流的续写和换行(跟字符流一样)
1、代码
package study.io;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args) throws IOException {
//①创建FileWriter对象,构造方法中传入要写入数据的目的地;
FileWriter fileWriter = new FileWriter("C:\\Users\\Administrator\\Desktop\\test001.txt",true);
//②使用FileWriter中的write方法,把数据写入到内存缓冲区(字符转换为字节的过程);
fileWriter.write(97);//写入单个字符a
fileWriter.write("\r\n");//写入单个字符a
fileWriter.write("写入一个字符串!\r\n");//写入一个字符串
fileWriter.write(new char[]{'a','b','c'});//写入一个字符数组
//③使用FileWriter中的flush方法,将内存缓冲区中的数据,刷新到文件中;
fileWriter.flush();
//④释放资源(会先把内存缓冲区中的数据刷新到文件中);
fileWriter.close();
}
}
2、运行结果
六、使用try...catch处理异常
1、代码(JDK1.7之前)
package study.io;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args) {
FileWriter fileWriter = null;
try {
//①创建FileWriter对象,构造方法中传入要写入数据的目的地;
fileWriter = new FileWriter("C:\\Users\\Administrator\\Desktop\\test001.txt",true);
//②使用FileWriter中的write方法,把数据写入到内存缓冲区(字符转换为字节的过程);
fileWriter.write(97);//写入单个字符a
fileWriter.write("\r\n");//写入单个字符a
fileWriter.write("写入一个字符串!\r\n");//写入一个字符串
fileWriter.write(new char[]{'a','b','c'});//写入一个字符数组
//③使用FileWriter中的flush方法,将内存缓冲区中的数据,刷新到文件中;
fileWriter.flush();
}catch (IOException e){
System.out.println(e);
}finally {
//④释放资源(会先把内存缓冲区中的数据刷新到文件中);
if(fileWriter!=null) {//若之前就失败,则fileWriter为空,会出现空指针异常,加个判断
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
七、JDK7与JDK9处理异常的新特性
1、JDK7
jdk1.7中try后面增加一个括号(),括号中可以定义流对象,那么这个流对象只在try中有效,try代码块执行完毕后会自动释放;
格式:
try(定义流对象...){
//可能出现异常的代码
}catch(异常变量 变量名){
//异常的处理逻辑
}
2、JDK9
JDK1.9中try中可以传入流对象。那么这个流对象只在try中有效,try代码块执行完毕后会自动释放;
格式:
A a = new A();
B b = new B();
try(a,b...){
//可能出现异常的代码
}catch(异常变量 变量名){
//异常的处理逻辑
}