IO基础(字符流)
IO基础(字符流)
文章目录
一、字符流
字符流类都是以Reader/Writer结尾
二、常用的字符流类的继承关系
三、字符流 FileReader 和 FileWriter
FileReader:
如果要从文件中读取内容,可以直接使用 FileReader 子类。
FileReader 是用于读取字符流。 要读取原始字节流,考虑使用 FileInputStream 。
构造方法:
FileReader(File file) 创建一个新的 FileReader ,给出 File 读取。
FileReader(String fileName) 创建一个新的 FileReader ,给定要读取的文件的名称
FileWriter
如果是向文件中写入内容,应该使用 FileWriter 子类 FileWriter 是用于写入字符流。
要编写原始字节流,考虑使用 FileOutputStream
构造方法:
FileWriter(File file) 给一个File对象构造一个FileWriter对象。
FileWriter(String fileName) 构造一个给定文件名的FileWriter对象
代码如下:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test03 {
public static void main(String[] args) throws IOException {
//创建输入流对象
FileReader fr = new FileReader("E:\\bit\\bitSrc.java");
//创建输出流对象
FileWriter fw = new FileWriter("E:\\bit\\bitCopy.java");
//读写数据
int ch;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
//释放资源
fw.close();
fr.close();
}
}
四、字符缓冲流 BufferedReader 和 BufferedWriter
为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。 BufferedReader 用于加快读取字符的速度, BufferedWriter 用于加快写入的速度。
BufferedReader 和 BufferedWriter 类各拥有 8192个 字符的缓冲区。当 BufferedReader在 读取文 本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中 进行读取。如果缓冲区数据不足,才会再从文件中读取,使用 BufferedWriter 时,写入的数据并不会 先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
字符缓冲流特有功能
BufferedWriter:
●void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
BufferedReader:
●public String readLine():读一行文字。 结果包含行的内容的字符串, 不包括任何行终止字符,如果流
的结尾已经到达,则为null
构造方法:
BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入 流。
BufferedReader(Reader in, int sz) 创建使用指定大小的输入缓冲区的缓冲字符输入 流。
BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区
测试代码如下:
import java.io.*;
public class FileWrite {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("C:\\my_java\\aaa.txt");
BufferedReader bReader = new BufferedReader(reader);
FileWriter writer = new FileWriter("C:\\my_java\\abc.txt");
BufferedWriter bWriter = new BufferedWriter(writer);
String content; //readLine一行一行的读取
while ((content = bReader.readLine()) != null) {
//\r\n换行
bWriter.write(content + "\r\n");
}
reader.close();
bReader.close();
bWriter.close();
writer.close();
}
}
五、 字符字节转换流(InputStreamReader/OutputStreamWriter)
1、InputStreamReader 是Reader的子类,将输入的字节流转换成字符流。
InputStreamReader 是从字节流到字符流的桥:它读取字节,并使用指定的 charset 将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
InputStreamReader构造方法:
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in,Charset cs) 创建一个使用给定字符集的 InputStreamReader
测试代码如下:
import java.io.*;
public class TestDemo {
public static void main(String[] args) throws IOException {
// 创建字节流对象 System.in 代表从控制台输入
InputStream in = System.in;
// 创建字符流对象
BufferedWriter bw = null;
BufferedReader br = null;
try {
// 实例化字符流对象 通过 InputStreamReader 将字节输入流转化成字符输入流
br = new BufferedReader(new InputStreamReader(in));
//br = new BufferedReader(new InputStreamReader(in,"GBK"));
bw = new BufferedWriter(new FileWriter("a.txt"));
// 定义读取数据的行
String line = null;
// 读取数据
while ((line = br.readLine()) != null) {
// 如果输入的是"exit"就退出
if ("exit".equals(line)) {
break;
}// 将数据写入文件
bw.write(line);
// 写入新的一行
bw.newLine();
// 刷新数据缓冲
bw.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (bw != null)
bw.close();
if (br != null) br.close();
}
}
}
2、OutputStreamWriter 是Writer的子类,将输出的字符流转换成字节流
OutputStreamWriter 是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节 charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
OutputStreamWriter构造方法:
OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out,Charset cs) 创建一个使用给定字符集的 OutputStreamWriter
测试代码如下:
import java.io.*;
public class TestDemo1 {
public static void main(String[] args) throws IOException { // 定义字节输出流的对象System.out
OutputStream out = System.out;
// 定义字符流的对象
BufferedReader br = null;
BufferedWriter bw = null;
//通过OutputStreamWriter将字符转流换为字节流对象
bw = new BufferedWriter(new OutputStreamWriter(out));
//bw = new BufferedWriter(new OutputStreamWriter(out,"GBK"));
br = new BufferedReader(new FileReader("a.txt"));
// 定义读取行的字符串
String line = null;
// 读取数据
while ((line = br.readLine()) != null) {
// 输出到控制台
bw.write(line);
// 新的一行
bw.newLine();
// 刷新缓冲
bw.flush();
}
}
}