概述
字节流提供了大量的访问相关类型输入/输出操作的功能,但是不能直接处理Unicode字符。字节流类由两个抽象字符流类Reader和Writer类派生出了多个具体子类,子类必须实现的方法只有read()/writer()和close()。但是,多数子类将覆盖此处定义的一些方法,以提高更高的效率或扩展其他功能。
文件字符输入/输出流
- FileReader继承Reader类,创建一个可以读取文件内容的Reader类。构造函数如下:
1.public FileReader(String fileName),参数为要读取的文件名
2.public FileReader(File file),参数为要读取的文件
3.public FileReader(FileDescriptor fd),参数为文件的绝对路径 - FileWriter继承Writer类,创建一个可以读取文件内容的Writer类。构造函数如下:
1.public FileWriter(String fileName),参数为要读取的文件名
2.public FileWriter(String fileName, boolean append),参数为文件名,append如果为true,则输出附加至文件尾
3.public FileWriter(File file),参数为要读取的文件 - 示例:
public class TestFile{
public static void main(String[] args){
FileReader fileReader = null;
FileWriter fileWriter = null;
try {
fileReader = new FileReader("E:/Java/a.txt");
fileWriter = new FileWriter("E:/Java/b.txt");
int temp = 0;
while(temp != -1){
temp = fileReader.read();
fileWriter.write(temp);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fileReader.close();
fileWriter.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
字符输入/输出流
- 若想对输入流InputStream和输出流OutputStream进行字符处理,可以使用字符输入输出流为其加上处理字符的功能。
- InputStreamReader是字节流通向字符流的桥梁,使用指定的charset类的对象读取字节并将其解码为字符,其使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。每次调用InputStreamReader中的一个read()方法都会导致从基础输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从基础流读取更多的字节,使其超过满足当前读取操作所需的字节。为了达到最高效率,需要考虑在BufferedReader内包装InputStreamReader。
- OutputStreamWriter是字符流通向字节流的桥梁。使用指定的charset将要向其写入的字符编码为字节,其使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。每次调用write()方法都会针对给定的字符(或字符集)调用编码转换器。在写入基础输出流之前,得到的这些字节会在缓冲区累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。
- 注意,传递到此write()方法的字符是未缓冲的。为了达到最高效率,可考虑将OutputStreamWriter包装到BufferedWriter中以避免频繁调用转换器。
- 示例:
public class TestCharStream {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:/Java/a.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:/Java/b.txt"));
osw.write(isr.read());
isr.close();
osw.close();
}
}
字符缓冲流
- BufferedReader/BufferedWriter原理方式基本与字节缓冲流相似,从而提供字符、数组和行的高效读取和写入。
- 示例:
public class TestDemo {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String s = bufferedReader.readLine();
System.out.println(s);
}
}