java中的I/O流操作是一个重点,但是关于流的类非常之多,看的人头晕眼花,在加上什么时候输入,什么时候输出,完了,彻底崩溃了。
其实当遇到比较复杂的问题的时候,最重要的是理清思路,像剥茧抽丝一样,进行归纳总结就会发现事情并不像想象的那么复杂
从整体来看,流无非就是输入与输出
打开API文档
输入有两个类:InputStream
Reader
共同点:任何自InputStream或Reader派生而来的类都含有名为read()的基本方法
区别:InputStream是读取字节流, Reader是读取字符流
InputStream的read()方法是用于读取单个字节或字节数组
Reader的read()方法是用于读取单个字符或字符数组
输出有两个类:OutputStream
Writer
共同点:任何自OutputStream或Writer派生而来的类都含有名为write()的基本方法
区别:OutputStream是写字节流, Writer是写字符流
OutputStream的write()方法是用于读取单个字节或字节数组
Writer的write()方法是用于读取单个字符或字符数组
另一个让人困惑的就是,什么是读?什么是写?
简单的说
读就是从内存中把数据读出来
写就是把数据写进内存中去
这么简单,但为什么“流”类库让你迷惑呢?
因为创建单一的结果流,却需要创建多个对象。
下面举几个常用的I/O流的例子
文本文件的复制
方法一
FileReader fr =newFileReader("a.txt");//要复制的文本文件
BufferedReader br =newBufferedReader(fr);//用读字符流缓冲区套住
FileWriter fw =newFileWriter("b.txt");//副本文件
BufferedWriter bw =newBufferedWriter(fw);//用写字符流缓冲区套住
while(true) {
String temp = br.readLine();
if(temp ==null) {
break;
}
bw.write(temp);
bw.newLine();
}
bw.close();
fw.close();
br.close();
fr.close();
方法二
BufferedReader br =newBufferedReader(
newInputStreamReader(newFileInputStream("a.txt")));
PrintWriter pw =newPrintWriter(newFileOutputStream("b.txt"));
while(true) {
String temp = br.readLine();
if(temp ==null) {
break;
}
pw.println(temp);
}
pw.close();
br.close();
方法三InputStream in =newFileInputStream("a.txt");
OutputStream out =newFileOutputStream("b.txt");
byte[] bytes =newbyte[1024];
while(true) {
intlen = in.read(bytes);
if(len == -1){
break;
}
out.write(bytes,0, len);
}
这种方法不但可以复制文本文件还可以复制分文本的其他文件
因为非文本文件是通过字节流传输的