JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
Java学习日志(十九)
字符流
字节流读取中文时,由于一次只能读写一个字节,一次不能把整个中文字符读全(UTF-8:1个中文=3个字节,GBK:1个中文=2个字节),会出现乱码,所以我们需要使用字符流。
字节流与字符流的区别:
- 字节流:一次读写一个字节
- 字符流:一次读写一个字符
Reader
java.io.Reader:字符输入流
此抽象类是表示所有字符输入流的超类
里边定义了所有字符输入流共性的成员方法:
public void close()
:关闭此流并释放与此流相关联的任何系统资源。public int read()
: 一次读取一个字符,并返回;读取到文件结尾返回-1public int read(char[] cbuf)
: 一个读取多个字符,存储到数组中,返回的是每次读取的有效字符个数
FileReader
java.io.FileReader extends InputStreamReader extends Reader:文件字符输入流
作用:把硬盘文件中的数据,以字符的方式读取到内存中
构造方法:
FileReader(File file)
FileReader(String fileName)
参数:读取文件的数据源
构造方法的作用:
- 创建FileReader对象
- 把FileReader对象指向读取文件的第一个字符
底层原理:
java程序-->JVM-->OS-->OS读取数据的方法-->读取文件
使用步骤:
- 创建字符输入流FileReader对象,构造方法中绑定要读取的数据源
- 使用FileReader对象中的方法read,读取文件
- 释放资源
示例一:public int read()
: 一次读取一个字符,并返回;读取到文件结尾返回-1
public class Demo01 {
public static void main(String[] args) throws IOException {
//1.创建字符输入流FileReader对象,构造方法中绑定要读取的数据源
FileReader fr = new FileReader("day10\\2.txt");//你好
//2.使用FileReader对象中的方法read,读取文件
//public int read() : 一次读取一个字符,并返回;读取到文件结尾返回-1
int len = 0;
while((len = fr.read())!=-1){
System.out.println((char)len);
}
//3.释放资源
fr.close();
}
}
示例二:public int read(char[] cbuf)
: 一个读取多个字符,存储到数组中,返回的是每次读取的有效字符个数
public class Demo01 {
public static void main(String[] args) throws IOException {
//1.创建字符输入流FileReader对象,构造方法中绑定要读取的数据源
FileReader fr = new FileReader("day10\\2.txt");//你好
//2.使用FileReader对象中的方法read,读取文件
//public int read() : 一次读取一个字符,并返回;读取到文件结尾返回-1
/*int len = 0;
while((len = fr.read())!=-1){
System.out.println((char)len);
}*/
//public int read(char[] cbuf) : 一个读取多个字符,存储到数组中,返回的是每次读取的有效字符个数
char[] chars = new char[1024];
int len = 0;
while((len = fr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
//3.释放资源
fr.close();
}
}
Writer
java.io.Writer:字符输出流
此抽象类是表示所有字符输出流的超类
里边定义了所有字符输出流共性的成员方法:
public abstract void close()
:关闭此输出流并释放与此流相关联的任何系统资源。public abstract void flush()
:刷新此输出流并强制任何缓冲的输出字符被写出。public void write(int c)
:写出一个字符。public void write(char[] cbuf)
:将 b.length字符从指定的字符数组写出此输出流。public abstract void write(char[] b, int off, int len)
:从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。public void write(String str)
:写出一个字符串。public void write(String str, int off, int len)
写一个字符串的一部分。
FileWriter
java.io.FileWriter extends OutputStream extends Writer:字符输出流
作用:把内存中的数据,以字符的方式写入到文件
构造方法:
FileWriter(File file)
FileWriter(String fileName)
参数:写入数据的目的地
构造方法的作用:
- 会根据构造方法传递的文件/文件的路径,创建一个空文件
- 创建FileWriter对象
- 把FileWriter对象指向创建的文件
写入数据的底层原理:
java-->JVM-->OS--OS写数据的方法-->把数据写入到文件中
字符输出流的使用步骤:
- 创建字符输出流FileWriter对象,构造方法中绑定要写入的目的地
- 使用FileWriter对象中的方法write,把数据写入到内存缓冲区中(转换 字符–>字节)
- 使用FileWriter对象中的方法flash,把内存缓冲区中的数据刷新到文件中
- 释放资源
示例: public void write(int c)
:写出一个字符
public class Demo03 {
public static void main(String[] args) throws IOException {
//1.创建字符输出流FileWriter对象,构造方法中绑定要写入的目的地
FileWriter fw = new FileWriter("day10\\3.txt");
//2.使用FileWriter对象中的方法write,把数据写入到内存缓冲区中(转换 字符-->字节)
fw.write(97);
//3.使用FileWriter对象中的方法flush,把内存缓冲区中的数据刷新到文件中
//fw.flush();
//4.释放资源(流关闭前,会自动的先调用flush方法,刷新数据)
fw.close();
}
}
关闭与刷新
close方法和flush方法区别:
- flush方法:刷新缓冲区,流对象可以继续使用。
- close方法:关闭流,释放系统资源,关闭前会刷新缓冲区。流已经关闭就不能再使用
public class Demo04 {
public static void main(String[] args) throws IOException {
//创建字符输出流
FileWriter fw = new FileWriter("day10\\4.txt");
//调用write,把数据写入内存缓冲区
fw.write(65);
//调用flush,把内存缓冲区中的数据刷新到文件中
fw.flush();
//flush之后流可以继续使用
fw.write(66);
//调用close方法
fw.close();
//close之后流被释放,不能继续使用
//fw.write(67);//java.io.IOException: Stream closed
}
}
字符输出流中其他写数据的方法
public void write(char[] cbuf)
:将 b.length字符从指定的字符数组写出此输出流。public abstract void write(char[] b, int off, int len)
:从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。public void write(String str)
:写出一个字符串。public void write(String str, int off, int len)
: 写一个字符串的一部分。
public class Demo05 {
public static void main(String[] args) throws IOException {
//创建字符输出流
FileWriter fw = new FileWriter("day10\\5.txt");
//调用write方法,把数据写入内存缓冲区
//public void write(char[] cbuf)
char[] chars = {'a','b','1','#','中'};
fw.write(chars);//ab1#中
//public abstract void write(char[] b, int off, int len)
fw.write(chars,2,2);//1#
//public void write(String str) :写出一个字符串。
fw.write("你好");//你好
//public void write(String str, int off, int len)
fw.write("123456",2,3);//345
//释放资源
fw.close();
}
}
追加写和换行
追加写:使用两个参数的构造方法
FileWriter(File file, boolean append)
FileWriter(String fileName, boolean append)
参数:
File file,String fileName:写入数据的目的地
boolean append:追加写开关
- true:不会覆盖原文件,追加写
- false:创建新文件,覆盖原文件
换行:使用换行符号
windows:\r\n
linux:/n
mac:/r
示例:追加写和换行
public class Demo01 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("day10\\6.txt",true);
for (int i = 0; i < 10; i++) {
fw.write("hello"+i+"\r\n");
}
//释放资源
fw.close();
}
}