使用字节流读取中文的问题
- 1个中文占用的不只一个字节
- 所以字节流在读取中文字符时会产生乱码
FileInputStream fis=new FileInputStream("D:\\document\\code\\xuexi\\java\\aaa\\a.txt");//你好(换行)欸嘿
int len=0;
while ((len=fis.read())!=-1){
System.out.print((char)len);
}
fis.close();
//结果
//ä½ å¥½
//欸å¿
- java提供了一些字符流类,以字符为单位读写数据,专门用于处理文本文件
字符输入流 Reader类
- 用于读取字符流的抽象类。子类必须实现的方法只有
read(char[], int, int)和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
- 字符输入流的最顶层的父类,定义了一些共性的成员方法
int read()读取单个字符。
int read(char[] cbuf) 将字符读入数组。
void close()关闭该流并释放与之关联的所有资源。
- 字符流,只能操作文本文件,不能操作图片,视频等非文本文件。
- 当我们单纯读或者写文本文件时 使用字符流,其他情况使用字节流
类 FileReader
- class FileReader extends InputStreamReader extends Reader
- 文件字符输入流
- 把硬盘文件中的数据以字符的方式读取到内存中
构造方法
FileReader(File file) :在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(String fileName) :在给定从中读取数据的文件名的情况下创建一个新 FileReader。
public class Demo {
public static void main(String[] args) throws IOException {
FileReader fis=new FileReader("D:\\document\\code\\xuexi\\java\\aaa\\a.txt");
int len=0;
while ((len=fis.read())!=-1){
System.out.print((char)len);//你好欸嘿www===
}
fis.close();
}
}
public class Demo {
public static void main(String[] args) throws IOException {
FileReader fis=new FileReader("D:\\document\\code\\xuexi\\java\\aaa\\a.txt");
int len=0;
char[] cs=new char[1024];
while ((len=fis.read(cs))!=-1){
System.out.println(new String(cs,0,len));//你好欸嘿www===
}
fis.close();
}
}
字符输出流 Writer类
- 写入字符流的抽象类。子类必须实现的方法仅有
write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
- 是所有字符输出流的最顶层的父类
void close() 关闭此流,但要先刷新它。
abstract void flush() 刷新该流的缓冲。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分。
- 因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要
flush 方法了。
类 FileWriter
- class FileWriter extends OutputStreamWriter extends Writer
- 文件字符输出流
- 把内存中字符数据写入到文件中
- 使用步骤:
- 创建FileWriter对象,构造方法中绑定要写入数据的目的地
- 使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
- 使用FileWriter中的方法flush,把内存缓冲区中的数据刷新到文件中
- 释放资源(会先把内存缓冲区中的数据刷新到文件中)
构造方法
FileWriter(File file)根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。
- boolean append:续写开关,true不会创建新的文件覆盖原文件,可以续写
- 换行:写换行符号
- Windows:\r\n
- Linux:/n
- mac:/r
public class Demo {
public static void main(String[] args) throws IOException {
FileWriter fw=new FileWriter("D:\\document\\code\\xuexi\\java\\aaa\\a.txt");
fw.write("abc");
//如果没有调用刷新或关闭方法,数据是不会刷新到文件中的
fw.flush();
fw.close();
}
}