字符流
使用字节流读取中文文件
1个中文:
GBK:占用两个字节
UTF-8:占用3个字节。
当使用字节流读取文本文件时可能会有一些小问题,就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储,所以java提供了一些字符流,以字符为单位读写数据,专门用于处理文本文件。
字符输入流【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)
FileReader(File file)
参数:读取文件文件的数据源
String fileName;文件的路径
File file:一个文件
FileReader构造方法的作用:
1.创建一个FileReader对象。
2.会把FileReader对象指向要读取的文件。
字符输入流的使用步骤:
- 创建FileReader对象,构造方法中绑定要读取的数据源。
- 使用FileReader对象中的方法read读取文件。
- 释放资源。
代码演示:
package day7;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class FileReader01 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader(new File("C:\a\b.txt"));
//读取单个字符
// int len = 0;
// while ((len = fr.read())!=-1){
// System.out.print((char) len);
// }
//读取多个字符
char[] cs =new char[1024];
int len = 0;
while ((len = fr.read(cs))!=-1){
System.out.println(new String(cs,0,len));
}
fr.close();
}
}
字符输出流【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.FileWrite extends OutputStreamwriter extends writer
FileWriter:文件字符输出流
作用:把内存中字符数据写入到文件中。
构造方法:
FileWriter(File file)根据给定的File对象构造一个FileWriter对象。
FileWriter(String fileName)根据给定的文件名构造一个FileWriter对象。
参数:写入数据的目的地。
String fileName:文件的路径。
File file:是一个文件。
构造方法的作用:
- 会创建一个FileWriter对象。
- 会根据构造方法中传递的文件/文件的路径,创建文件。
- 会把FileWriter对象指向创建好的文件。
字符输出流的使用步骤(重点):
- 创建一个FileWriter对象,构造方法中绑定要写入数据的目的地。
- 使用FileReader中的方法write,吧数据写入到内存缓冲区中(字符转换为字节的过程)
- 使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中。
- 释放资源(会先把内存缓冲区的数据刷新到文件中)
写入字符数据
代码演示:
package day7;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class WriterDemo02 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("C:\a\d.txt");
fw.write("你");
fw.write("好");
fw.flush();
FileReader fr = new FileReader("C:\a\d.txt");
int len = 0;
while((len = fr.read())!=-1){
System.out.println((char)len);
}
fr.close();
}
}
Flush方法和close方法的区别
flush:刷新缓冲区,流对象可以继续使用。
close:先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用了。
字符输出流写数据的其他方法
- 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写的字符个数。
代码演示:
package day7;
import java.io.FileWriter;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("C:\a\e.txt");
char[] cs = {'a','b','c','d'};
// void write(char[] cbuf)写入字符数组。
fw.write(cs);
// void write(char[] cbuf,int off,int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
fw.write(cs,1,3);
// void write(String str)写入字符串。
fw.write("方舟安全团队");
fw.close();
}
}
字符输出流的续写和换行
续写:追加写,使用两个参数的构造方法。
FileWriter(String fileName,boolean append)
FileWriter(File file,boolean append)
参数:
String fileName,File file:写入数据的目的地。
Boolean append;续写开关,true:不会创建新的文件覆盖源文件,可以续写;false:创建新的文件覆盖源文件。
换行:
windows:
linux:/n
mac:/r
代码演示:
package day7;
import java.io.FileWriter;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("C:\a\f.txt",true);
for (int i = 0; i < 10; i++) {
fw.write("方舟"+i+"
");
}
fw.close();
}
}