时隔多久,我又回来写博客了,最近忙于两个课设,五周,搞得头发都不知道掉了多少根了,还没成为程序员就开始掉了,等我成为一名程序员的时候岂不是要秃头了,IT界的人会不会帮我当成大佬了,哈哈哈哈,希望我以后也可以成为一名IT界的大佬,虽然有点不现实,但是梦想还是要有的,万一不经意间就实现了也说不定,加油~
字符流
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件
字符输入流[Reader]
java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入 流的基本共性功能方法
public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read() : 从输入流读取一个字符。
public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
FileReader类
java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。 idea中UTF-8
2. 字节缓冲区:一个字节数组,用来临时存储字节数据。
构造方法:
FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。
读取字符数据:
1. 读取字符: read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取
1 package demosummary.file.filereader;
2
3 import java.io.FileReader;
4
5 public class FileReader_02 {
6 public static void main(String[] args) throws Exception{
7 //使用文件名创建流对象
8 FileReader fr = new FileReader(".\\src\\demosummary\\file\\a.txt");
9 //定义变量,保存数据
10 int a;
11 //循环读取
12 while ((a = fr.read())!= -1) {
13 System.out.println((char) a);
14 }
15 //释放资源
16 fr.close();
17 }
18 /**
19 * 输出结果
20 * 黑
21 * 马
22 * 程
23 * 序
24 * 员
25 */
26 }
2. 使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数, 读取到末尾时,返回 -1
1 package demosummary.file.filereader;
2
3 import java.io.FileReader;
4
5 public class FileReader_03 {
6 public static void main(String[] args) throws Exception{
7 //创建流对象
8 FileReader fr = new FileReader(".//src//demosummary//file//a.txt");
9 //定义变量
10 int len;
11 //定义字符数组,作为装字符的容器
12 char[] l = new char[2];
13 //循环读取
14 while ((len = fr.read(l)) != -1) {
15 System.out.println(new String(l, 0, len));
16 }
17 fr.close();
18 }
19 /**
20 * 输出结果
21 * 黑马
22 * 程序
23 * 员
24 */
25 }
字符输出流[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() 关闭此流,但要先刷新它。
FileWriter类
java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区
构造方法
FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称
基本写出数据
写出字符: write(int b) 方法,每次可以写出一个字符数据
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_04 {
6 public static void main(String[] args) throws Exception{
7 //创建流对象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//b.txt");
9 //写入数据
10 fw.write(97);
11 fw.write('b');
12 fw.write('C');
13 fw.write(30000);
14 fw.write(40000);
15
16 //刷新缓冲
17 fw.flush();
18 //释放资源
19 fw.close();
20 }
21 /**
22 * 输出结果
23 * abC田鱀
24 */
25 }
注意:
1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。
2. 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。
关闭和刷新
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据 的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了。
flush :刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_05 {
6 public static void main(String[] args) throws Exception{
7 //创建流对象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//c.txt");
9
10 //写入数据并刷新
11 fw.write("刷");
12 fw.flush();
13 fw.write("新");
14 fw.flush();
15
16 //写入数据,并关闭
17 fw.write("关");
18 fw.close();
19 fw.write("闭");//报错(流已关闭): Stream closed
20 fw.close();
21
22 //释放资源
23 fw.close();
24 }
25 /**
26 * 输出结果
27 * 刷新关
28 */
29 }
注意:即便是flush方法写出了数据,操作的后还是要调用close方法,释放系统资源。
写出其他数据
1. 写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数 组中的数据,用法类似FileOutputStream
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_06 {
6 public static void main(String[] args) throws Exception{
7 //创建流对象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//d.txt");
9
10 char[] chars = "黑马程序员".toCharArray();
11
12 fw.write(chars);//黑马程序员
13
14 fw.write(chars,2,2);//程序
15 //释放资源
16 fw.close();
17 }
18 /**
19 * 输出结果
20 * 黑马程序员
21 * 程序
22 */
23 }
2. 写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的 数据,更为方便
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_07 {
6 public static void main(String[] args) throws Exception{
7 //创建流对象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//e.txt");
9
10 String string = "传智播客";
11
12 fw.write(string);//传智播客
13
14 fw.write(string,2,2);//播客
15 //释放资源
16 fw.close();
17 }
18 /**
19 * 输出结果
20 * 传智播客播客
21 */
22 }
3. 续写和换行:操作类似于FileOutputStream
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_08 {
6 public static void main(String[] args) throws Exception{
7 //创建流对象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//f.txt");
9
10 //写入字符串
11 fw.write("黑马");
12 //写入换行
13 fw.write("\r\n");
14 //写入字符串
15 fw.write("程序员");
16 //释放资源
17 fw.close();
18 }
19 /**
20 * 输出结果
21 * 黑马
22 * 程序员
23 */
24 }
注意:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流