字符流定义及基本用法
如果希望在程序中操作字符。为此JDK提供了Reader和Writer。其中Reader是字符输入流,用于从某个源设备读取字符,Writer是字符流出流,用于向某个目标设备写入字符。Reader和Writer作为字符流的顶级父类,也有许多子类。
字符流操作文件
如果想从文件中直接读取字符便可以使用字符输入流FileReader,通过此流可以从关联的文件 中读取一个或者一组字符。
import java.io.FileReader;
import java.io.IOException;
public class IOTest01 {
private static FileReader fr;
public static void main(String[] args) {
// System.out.println(fr.toString().length());
try {
/* 创建一个FileReader对象用来读取文件中的字符 */
fr = new FileReader("src/In.txt");
int len; //定义一个变量用于记录读取的字符。
/* 循环判断是否读到文件的末尾 */
while ((len = fr.read()) != -1){
System.out.print((char)len);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fr != null){ //如果fr不为空就关闭
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如果要向文件中写入字符就需要使用FileWriter类。
import java.io.FileWriter;
import java.io.IOException;
public class IOTest02 {
public static void main(String[] args) throws IOException {
/* 创建一个FileWriter对象用于向文件中写入数据 */
FileWriter fw = new FileWriter("src/Out.txt");
String str = "周林";
fw.write("\r\n"); //将输出语句换行
fw.write(str); //将字符数据写入到文本文件中
if(fw != null){
fw.close(); //关闭
}
}
}
字符流提供了带缓冲区的包装流,分别是BufferedReader和BufferedWriter。并且分别对输入/输出流进行包装。
public class IOTest03 {
public static void main(String[] args) throws IOException {
/* 创建一个缓冲对象对FileReader进行包装 */
BufferedReader br = new BufferedReader(new FileReader("src/In.txt"));
/* 创建一个缓冲对象对FileWriter进行包装 */
BufferedWriter bw = new BufferedWriter(new FileWriter("src/O.txt"));
String src;
long startTime = System.currentTimeMillis();
/* readLine():每次读取一行文本,判断是否到文件末尾 */
while ((src = br.readLine()) != null ){
bw.write(src);
bw.newLine(); //写入一个换行符,该方法会根据不同的操作系统生成相应的换行符。
}
long endTime = System.currentTimeMillis();
System.out.println((endTime - startTime)+"毫秒");
if(bw != null){
bw.close(); //关闭
}
if(bw != null){
bw.close(); //关闭
}
}
}
LineNumberReader
Java程序在编译或运行期间经常会出现一些错误,在错误在通常会报告出错的行号,为了方便查找错误,需要在代码中加入行号。JDK提供了一个可以跟踪行号的输入流——LineNumberReader,它是BufferedReader的直接子类。
案例:为文件加上行号。
public class IOTest04 {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("src/In.txt");
FileWriter fileWriter = new FileWriter("src/O.txt");
/* 包装 */
LineNumberReader lnr = new LineNumberReader(fileReader);
lnr.setLineNumber(0); //设置读取文件的起始行号
String len = null;
while( (len = lnr.readLine() ) != null){
/* 将行号写入到文件中 */
fileWriter.write(lnr.getLineNumber()+":"+len);
fileWriter.write("\r\n"); //写入换行
}
lnr.close();
fileWriter.close();
}
}
转换流
JKD中提供了两个类可以将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。
注意:在使用转换流时,只能针对操作文本文件的字节流进行转换,如果字节流操作的是一张图片,此时转换为字符流就会造成数据丢失。
public class IOTest05 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src/In.txt");
InputStreamReader isr = new InputStreamReader(fis); //将字节输入流转换成字符输入流
BufferedReader br = new BufferedReader(isr); //对字符流对象进行包装
FileOutputStream fos = new FileOutputStream("src/Out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos); //将字符输出流转换成字符输出流
BufferedWriter bw = new BufferedWriter(osw); //对字符流对象进行包装
String len = null;
while( (len = br.readLine() ) != null) {
bw.write(len);
bw.write("\r\n");
}
br.close();
bw.close();
}
}