一、Reader
- 用于读取字符流的抽象类。
- 子类必须实现的方法只有 read(char[], int, int) 和 close()。
- 但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能
- 直接已知子类:
- BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
public abstract class Reader implements Readable, Closeable
{
/**
*读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
*作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
*/
public int read()
throws IOException{}
//将字符读入数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞
public int read(char[] cbuf)
throws IOException{}
//将字符读入数组的某一部分。在某个输入可用、发生 I/O 错误或者到达流的末尾前,此方法一直阻塞
public abstract int read(char[] cbuf,
int off,
int len)
throws IOException;
//跳过字符。在某个字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞
public long skip(long n)
throws IOException{}
/**
*关闭该流并释放与之关联的所有资源。
*在关闭该流后,再调用 read()、ready()、mark()、reset() 或 skip() 将抛出 IOException。
*关闭以前关闭的流无效。
*/
public abstract void close()
throws IOException;
}
二、InputStreamReader
- InputStreamReader 是字节流通向字符流的桥梁:
- 它使用指定的 charset 读取字节并将其解码为字符。
- 它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
- 每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。
- 要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
- 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader
public class InputStreamReader extends Reader
{
//创建一个使用默认字符集的 InputStreamReader
public InputStreamReader(InputStream in){}
//创建使用指定字符集的 InputStreamReader
public InputStreamReader(InputStream in,
String charsetName)
throws UnsupportedEncodingException{}
//返回此流使用的字符编码的名称。
public String getEncoding(){}
//其余方法均继承自Reader和Object
}
三、FileReader
- 用来读取字符文件的便捷类。
- 此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
- 要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
- FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream。
public class FileReader extends InputStreamReader
{
//在给定从中读取数据的 File 的情况下创建一个新 FileReader
public FileReader(File file)
throws FileNotFoundException{}
//在给定从中读取数据的文件名的情况下创建一个新 FileReader。
public FileReader(String fileName)
throws FileNotFoundException{}
//其余方法均继承自InputStreamReader
}
示例:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 需求:复制文件
*/
public class ReaderTest {
public static void main(String[] args) {
String resName = "E:/f/code/a.java";
String desName = "E:/a.java";
copy(resName,desName);
}
public static void copy(String resName,String desName)
{
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader(resName);
fw = new FileWriter(desName);
char[] buf = new char[1024];
int num = 0;
while((num=fr.read(buf))!=-1)
{
fw.write(buf);
fw.flush();
}
System.out.println("复制成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(fr != null)
{
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fw != null)
{
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}