1. 字符流
当使用字节流读取中文文件时,如果遇到中文字符,读出来的可能不是一个完整的文字,那是因为一个中文字符可能占用多个字节存储(GBK:占用两个字节、UTF-8:占用三个字节)。
1.1 字符输入流Reader
java.io.Reader抽象类为用于读取字符的所有类的超类,可以读取字符信息到内存中,它定义了字符输入流的基本功性功能方法。
- public void close():关闭此流并释放与此流相关联的任何系统资源。
- public int read():从输入流读取一个字符。
- public int read(char[] cbuf):从输入流中读取一些字符,并将它们保存到cbuf中。
java.io.FileReader extends InputStreamReader extends Reader
FileReader:文件字符输入流,可以把硬盘文件中的数据以字符的方式读取到内存中。
构造方法: FileReader(String fileName/File file)
public class DemoReader {
public static void main(String[] args) throws IOException {
//1. 创建FileReader对象,构造方法中绑定要读取的数据源
FileReader fr = new FileReader("D:\\wenjian\\a.txt");
//2. 使用FileReader对象中的方法read()读取文件
/*
int len = 0;
while((len = fr.read()) != -1){
System.out.print((char)len);
}
*/
char[] cs = new char[1024];
int len = 0;
if((len = fr.read(cs)) != -1){
System.out.println(new String(cs, 0, len));
}
fr.close();
}
}
1.2 字节输出流Writer
java.io.writer抽象类为用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本功性功能方法。
- 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():关闭此流,但是要先刷新它。
java.io.FileWriter extends OutputWriter extends Writer
FileWriter:文件字符输出流,把内存中的字符写入文件中。
构造方法: FileWriter(String fileName/File file)
public class DemoWriter {
public static void main(String[] args) throws IOException {
//1. 创建FileWriter对象,构造方法中绑定要写入数据的目的地
FileWriter fw = new FileWriter("D:\\wenjian\\b.txt");
//2. 使用writer,把数据写入到内存缓冲区
fw.write(88);
//3. 使用flush,把内存缓冲区的数据刷新到文件中
//fw.flush();
//4. 释放资源
fw.close(); //close会自动flush
}
}
** flush和close的区别:** flush后该流还能继续使用,close后就不行了。
1.3 字节输出流的续写和换行
续写
- FileWriter(String fileName, boolean append)
- FileWriter(File file, boolean append)
**换行:**换行符号
windows: \r\n
Linux: /n
mac: /r
public class DemoWriter {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("D:\\wenjian\\b.txt", true);
for(int i = 0; i < 3; i ++){
fw.write("hello" + "\r\n");
}
fw.close(); //close会自动flush
}
}