IO字符流
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
Reader
java.io.Reader
抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
常用方法
abstract void | close() 关闭该流并释放与之关联的所有资源。 |
int | read() 读取单个字符。 |
int | read(char[] cbuf) 将字符读入数组。 |
abstract int | read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。 |
int | read(CharBuffer target) 试图将字符读入指定的字符缓冲区。 |
常用的已知子类
FileReader
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
FileReader
用于读取字符流。
构造方法
方法名 | 说明 |
---|---|
FileReader(File file) | 创建一个新的 FileReader ,给定要读取的File对象。 |
FileReader(String fileName) | 创建一个新的 FileReader ,给定要读取的文件的名称。 |
注意:当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream 。
读取数据(一次读取一个字节)
public class FileReaderDemo01 {
public static void main(String[] args) throws IOException {
/**
* FileReader(File file)
* 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
* FileReader(String fileName)
* 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
*/
FileReader fileReader = new FileReader(new File("day150429\\a.txt"));
FileReader fr = new FileReader("day150429\\bb.txt");
int len;
while ((len = fr.read()) != -1){
System.out.println((char) len);
}
while ((len = fileReader.read()) != -1){
System.out.println((char)len);
}
//释放资源
fr.close();
}
}
数据读取(一次读取一个数组)
public class FileReaderDemo02 {
public static void main(String[] args) throws IOException {
/**
* // int read(char[] cbuf) : 一次读取一个字符数组
*/
FileReader fileReader = new FileReader("day150429\\bb.txt");
int len;
char[] chars = new char[1024];
while ((len = fileReader.read(chars)) != -1){
//将字符数组转换成字符串
System.out.println(new String(chars,0,len));
}
//
fileReader.close();
}
}
Writer
写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
常用已知子类
常用方法
方法名 | 说明 |
---|---|
void write(int c) | 写入单个字符 |
void write(char[] cbuf) | 写入字符数组。 |
abstract void write(char[] cbuf, int off, int len) | 写入字符数组的某一部分,off数组的开始索引,len写的字符个数 |
void write(String str) | 写入字符串 |
void write(String str, int off, int len) | 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。 |
void flush() | 刷新该流的缓冲。 |
void close() | 关闭此流,但要先刷新它。 |
FileWriter
用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
文件是否可用或是否可以被创建取决于底层平台。特别是某些平台一次只允许一个 FileWriter(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
FileWriter
用于写入字符流。
构造方法
方法名 | 说明 |
---|---|
FileWriter(File file) | 创建一个新的 FileWriter,给定要读取的File对象。 |
FileWriter(String fileName) | 创建一个新的 FileWriter,给定要读取的文件的名称。 |
注意:当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。
写数据
public class FileWriterDemo01 {
public static void main(String[] args) throws IOException {
/**
* FileWriter(File file)
* 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) : 写入字符串的某一部分。
* void flush() : 刷新该流的缓冲。
* void close() : 关闭此流,但要先刷新它。
*/
FileWriter fw = new FileWriter("day150429\\w.txt");
//void write(int c) : 写入单个字符。
fw.write(65);
fw.write(97);
fw.write('b');
//void write(char[] cbuf) : 写入字符数组。
char[] chars = {'a','b','c','d'};
fw.write(chars);
//void write(char[] cbuf, int off, int len) : 写入字符数组的某一部分。
fw.write(chars,0,3);
//void write(String str) : 写入字符串。
String str = "opqrst";
fw.write(str);
//void write(String str, int off, int len) : 写入字符串的某一部分。
fw.write(str,0,2);
fw.flush();
fw.close();
}
}
public class FileWriterDemo02 {
public static void main(String[] args) throws IOException {
/**
* 续写和换行
* FileWriter(File file, boolean append)
*/
FileWriter fileWriter = new FileWriter(new File("day150429\\c.txt"));
for (int i = 1; i <= 5; i++) {
fileWriter.write(i+":"+"hello");
fileWriter.write("\r\n");
}
fileWriter.close();
}
}
flush与close之间的区别
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要
flush
方法了。flush:刷新缓冲区,流对象可以继续使用
close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再使用。