1、什么是字符流
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以ava提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
1.1字符输入流
- public void close():关闭此流并释放与此流相关联的任何系统资源
- public int read():从输入流读取一个字符。
- public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组cbuf中。
1.2FileReader类
java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
import java.io.*;
public class ReaderTest006 {
public static void main(String[] args) throws IOException {
//定义File对象
File f1=new File("D:/a.txt");
//字符输入流Reader
Reader in=new FileReader(f1);
int read=in.read();//所有的中文字符按照一个字符处理,每次读取一个字符,把该字符转换对应的汉字
System.out.println((char)read);
int n1=in.read();
System.out.println((char)n1);
}
}
每次只能读写一个字符
怎么让他读写多个字符呢?
import java.io.*;
import java.util.Arrays;
public class ReaderTest006 {
public static void main(String[] args) throws IOException {
//定义File对象
File f1=new File("D:/a.txt");
//字符输入流Reader
Reader in=new FileReader(f1);
//使用缓冲区读取多个字符
char[] buffer=new char[10];
int n=in.read(buffer);//每次最多读取buffer数组长个字符,把读取到的字符存入buffer数组中,返回的是实际读取的字符数
System.out.println(n);
System.out.println(Arrays.toString(buffer));
char[] buffer1=new char[10];
int n1=in.read(buffer1);//每次最多读取buffer数组长个字符,把读取到的字符存入buffer数组中,返回的是实际读取到的字符数
System.out.println(n1);
System.out.println(Arrays.toString(buffer1));
}
}
结果如下
通过数组把读取的字符长度扩大
2、字符输出流
java.io.writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。
- void write(int )写入单个字符
- 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 en) 写入字符串的某一部分,off字符串的开始索引len写的字符个数
- void flush()刷新该流的缓冲。
- void close()关闭此流,但要先刷新它
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterTest07 {
public static void main(String[] args) throws IOException {
File f2=new File("D:/b.txt");
if (!f2.exists()){
f2.createNewFile();
}
//定义一个字符输出流,向f2文件写入内容
Writer out=new FileWriter(f2);
out.write(97);
out.write((int)'中');
char[] ch={'河','南','南','阳','农','业'};
//out.write(ch);
out.write(ch,0,2);
out.write("移动2103班");
out.write("abcdef",0,3);
out.flush();//字符输出流有缓冲区的概念,需要刷新缓冲区才更新到硬盘
out.close();
}
}
结果为