1. 输入转换流 InputStreamReader
InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
每个调用InputStreamReader的read()方法之一可能会导致从底层字节输入流读取一个或多个字节。 为了使字节有效地转换为字符,可以从底层流读取比满足当前读取操作所需的更多字节。
构造方法:
InputStreamReader(InputStream in)
创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
创建一个使用给定字符集的InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec)
创建一个使用给定字符集解码器的InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
创建一个使用命名字符集的InputStreamReader。
方法:
void close()
关闭流并释放与之相关联的任何系统资源。
String getEncoding()
返回此流使用的字符编码的名称。
int read()
读一个字符
int read(char[] cbuf, int offset, int length)
将字符读入数组的一部分。
boolean ready()
告诉这个流是否准备好被读取。
2. 输出转换流OutputStreamWriter
OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
构造方法 :
OutputStreamWriter(OutputStream out)
创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs)
创建一个使用给定字符集的OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
创建一个使用给定字符集编码器的OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)
创建一个使用命名字符集的OutputStreamWriter。
方法:
void close()
关闭流,先刷新。
void flush()
刷新流。
String getEncoding()
返回此流使用的字符编码的名称。
void write(char[] cbuf, int off, int len)
写入字符数组的一部分。
void write(int c)
写一个字符
void write(String str, int off, int len)
写一个字符串的一部分。
复制文件案例1:
public class CodeCompilerDemo {
public static void main(String[] args) throws IOException {
byte[] bys = "hello".getBytes();
for(byte b:bys){
System.out.println((char)b);
}
InputStreamReader isr = new InputStreamReader(new FileInputStream("b.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"));
int i;
while((i=isr.read())!=-1){
osw.write(i);
}
isr.close();
osw.close();
}
}
复制文件案例2:
public class CodeCompilerDemo1 {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("b.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"));
char[] c= new char[1024];
int len = 0;
while((len = isr.read(c))!=-1){
osw.write(c, 0, len);
}
isr.close();
osw.close();
}
}
3.便利字符输入流FileReader
阅读字符文件的便利课。 该类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。 要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。
FileReader是用于读取字符流。 要读取原始字节流,请考虑使用FileInputStream 。
构造方法 :
FileReader(File file)
创建一个新的 FileReader ,给出 File读取。
FileReader(FileDescriptor fd)
创建一个新的 FileReader ,给定 FileDescriptor读取。
FileReader(String fileName)
创建一个新的 FileReader ,给定要读取的文件的名称。
4. 便利字符输出流FileWriter
方便课写字符文件。 该类的构造函数假定默认字符编码和默认字节缓冲区大小是可以接受的。 要自己指定这些值,请在FileOutputStream上构造一个OutputStreamWriter。
文件是否可用或可能被创建取决于底层平台。 特别是某些平台允许一次只能打开一个文件来写入一个FileWriter (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
构造方法:
FileWriter(File file)
给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append)
给一个File对象构造一个FileWriter对象。
FileWriter(FileDescriptor fd)
构造与文件描述符关联的FileWriter对象。
FileWriter(String fileName)
构造一个给定文件名的FileWriter对象。
FileWriter(String fileName, boolean append)
构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。
复制文件案例1:
public class FileReaderWriterDemo {
public static void main(String[] args) throws IOException {
FileReader fd = new FileReader(new File("a.txt"));
FileWriter fw = new FileWriter(new File("b.txt"),true);
int c;
while((c= fd.read())!=-1){
fw.write(c);
}
fd.close();
fw.close();
}
}
复制文件案例2:
public class FileReaderWriterDemo {
public static void main(String[] args) throws IOException {
FileReader fd = new FileReader(new File("a.txt"));
FileWriter fw = new FileWriter(new File("b.txt"),true);
char[] c= new char[1024];
int len;
while((len = fd.read(c))!=-1){
fw.write(c,0,len);
}
fd.close();
fw.close();
}
}
5. 字符缓冲输入流BufferedReader
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
构造方法 :
BufferedReader(Reader in)
创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建使用指定大小的输入缓冲区的缓冲字符输入流
方法:
void close()
关闭流并释放与之相关联的任何系统资源。
Stream lines()
返回一个 Stream ,其元素是从这个 BufferedReader读取的行。
void mark(int readAheadLimit)
标记流中的当前位置。
boolean markSupported()
告诉这个流是否支持mark()操作。
int read()
读一个字符
int read(char[] cbuf, int off, int len)
将字符读入数组的一部分。
String readLine()
读一行文字。
boolean ready()
告诉这个流是否准备好被读取。
void reset()
将流重置为最近的标记。
long skip(long n)
跳过字符
6.字符缓冲输出流BufferedWriter
将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。
构造方法 :
BufferedWriter(Writer out)
创建使用默认大小的输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。
方法:
void close()
关闭流,先刷新。
void flush()
刷新流。
void newLine()
写一行行分隔符。
void write(char[] cbuf, int off, int len)
写入字符数组的一部分。
void write(int c)
写一个字符
void write(String s, int off, int len)
写一个字符串的一部分。
7. IO流的结构
案例1缓冲字符流的3种方法复制文件:
public class BufferedWriterReaderDemo {
public static void main(String[] args) throws IOException {
//copy1();
//copy2();
copy3();
}
private static void copy1() throws IOException {
//读一个写一个
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
int c = 0;
while((c=br.read())!=-1){
bw.write(c);
}
br.close();
bw.close();
}
private static void copy2() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
char[] c= new char[1024];
int len;
while((len=br.read(c))!=-1){
bw.write(c,