JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
字节流读取中文时,由于一次只能读写一个字节,一次不能把整个中文字符读全(UTF-8:1个中文=3个字节,GBK:1个中文=2个字节),会出现乱码,所以我们需要使用字符流。
字节流与字符流的区别:
java.io.Reader:字符输入流
此抽象类是表示所有字符输入流的超类
里边定义了所有字符输入流共性的成员方法:
public void close()
:关闭此流并释放与此流相关联的任何系统资源。public int read()
: 一次读取一个字符,并返回;读取到文件结尾返回-1public int read(char[] cbuf)
: 一个读取多个字符,存储到数组中,返回的是每次读取的有效字符个数java.io.FileReader extends InputStreamReader extends Reader:文件字符输入流
作用:把硬盘文件中的数据,以字符的方式读取到内存中
构造方法:
FileReader(File file)
FileReader(String fileName)
构造方法的作用:
底层原理:
java程序-->JVM-->OS-->OS读取数据的方法-->读取文件
使用步骤:
示例一: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();
}
}
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)
写一个字符串的一部分。java.io.FileWriter extends OutputStream extends Writer:字符输出流
作用:把内存中的数据,以字符的方式写入到文件
构造方法:
FileWriter(File file)
FileWriter(String fileName)
构造方法的作用:
写入数据的底层原理:
java-->JVM-->OS--OS写数据的方法-->把数据写入到文件中
字符输出流的使用步骤:
示例: 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方法区别:
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)
换行:使用换行符号
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();
}
}