package nodstream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class TestFileCopy {
/**
* 测试文件拷贝
*
* \转义字符 :使得紧跟在它之后的字符就按本意处理,不做任何特殊用途
*/
public static void main(String[] args) throws Exception{
//读取源文件的输入流
FileInputStream fis = new FileInputStream("f:\\corejava\\1.png");
//写备份文件的输出流
FileOutputStream fos = new FileOutputStream("copy1.png");
//边读边写
byte[] b = new byte[100];
while(true){
int n = fis.read(b);
if(n==-1) break;
fos.write(b,0,n); // 防着最后一次读到的数据(不一定完全装满数组b)
}
fis.close();
fos.close();
}
}
IO流
一.流
概念:是对象,用来在内存和外部的存储设备之间交换数据的通道。
分类
1)方向: 输入流 输出流 【判定标准,以当前程序为参照物】
2)单位:
字节流 -- 以字节为单位传递数据 , 可以传递任意类型的数据
字符流 -- 以字符为单位传递数据 , 只可以读写文本文件
3)功能:
节点流 -- 实际负责数据传递的流对象
过滤流 -- 负责为其他流对象添加辅助功能的流对象
二.字节流
字节流父类:OutputStream(字节输出流) | InputStream(字节输入流)
-
字节节点流 【重点】
1)FileOutputStream : 文件字节输出流2)FileInputStream :文件字节输入流
- 字节过滤流
1)DataInputStream | DataOutputStream
I. 提供了直接读写8种基本数据类型的功能
II. 提供了直接读写String的方法(writeUTF readUTF )
- BufferedInputStream | BufferedOutputStream
I. 提供了缓存功能的字节过滤流,以空间换时间,减少访问硬盘的次数,提高数据
传输速度。缓存功能对于输入流效果不明显
II. 缓冲器输出:
A. 关闭流时,会自动flush
B. 数据将缓冲区填满,会自动flush
C. 手动输出: 需要调用流对象的flush()
3)ObjectInputStream | ObjectOutputStream
I. 提供了直接读写对象 以及 8种基本数据类型数据 的功能
提供了缓冲功能 --- 可以用它替换上面两种过滤流
II. 对象只有能够序列化,才能放在流里传递
实现类Serializable接口的对象,就是可序列化的对象
注意:Serializable接口是一个“标记接口”
III. 不需要参与序列化的属性,可以用关键字transient修饰
IV. 对象以及对象的所有属性都必须是可序列化的,才能通过流传递
V. 读取对象的输入流以抛出EOFException的形式提示用户文件读取完毕
4)PrintStream --- System.out
三.字符编码
- ASCII编码 --- 美国
- GB2312 --- 中国,国标
- GBK ---- 国标的扩展
- BIG5 ---- 中文繁体,台湾
- ISO8859_1 --- 西欧,希腊,阿拉伯,泰语,希伯来
- UTF-8 ---- 国际统一编码,是可变长的unicode
注意:如果编解码方式不统一,则可能导致乱码
四.字符流
父类 : Reader | Writer
-
节点流:
FileWriter- write(int c) --- 向流里写一个字符
2)write( char[] c) --- 向流里写一个字符数组
3)write(String str) --- 向流里写一个String
FileReader
1)read() --- 读取一个字符,返回字符的int形式,-1结束
2)read(char[] c) ---一次读取多个字符,存入数组返回,返回值为读到的个数,
-1结束
- write(int c) --- 向流里写一个字符
-
过滤流
BufferdReader | PrintWriter --- 带缓冲功能的字符流
1)PrintWriter提供了大量的println方法,输出方便
2)BufferedReader 提供了readLine(),一次读取一行文字,直到读到行结束符为止。
这是一个阻塞方法。InputStreamReader | OutputStreamWriter ---- “桥转换器”
1)负责将一个字节流转换成字符流
2)可以在构建过程中,指定编码方式(唯一一个可以指定编码的流)
通常和FileInputStream配合,用来读取指定了编码的文本文件
五.流总结
流程序的编程步骤:
1. 创建节点流对象 (优选FileInputStream,FileOutputStream)
2. 封装过滤流 (优选“桥转换器”,带缓冲的字符过滤流)
3. 读写数据 ( println 和 readLine )
4. 关闭流对象
六.File类 (辅助类)
- 概念:一个File类的对象代表了文件系统里的一个文件或者目录,使用File类不能改变文件内容,只能设置一些属性。