分类:
基于传输的格式:
1.字节流: InputStream
OutputStream
2.字符流:Writer
Reader
基于传输的方式
1.File
2.Socket
I/O解决的问题:
人与机器,机器与机器的交互。
影响I/O性能的关键
1.数据传输的格式
2.数据传输的方式
基于字节流
输入或输出流需要实现InputStream
或OutputStream
关键操作 read()
write()
类图
这里只想说明两点,一个是操作数据的方式是可以组合使用的,如这样组合使用
OutputStream out = new BufferedOutputStream(new ObjectOutputStream(new FileOutputStream("fileName"));
还有一点是流最终写到什么地方必须要指定,要么是写到磁盘要么是写到网络中,其实从上面的类图中我们发现,写网络实际上也是写文件,只不过写网络还有一步需要处理就是底层操作系统再将数据传送到其它地方而不是本地磁盘。
基于字符流
磁盘或者网络传输,最小的存储单元都是字节,而不是字符,所以 I/O 操作的都是字节而不是字符,因为处理的大多数数据都为字符,为了操作方便,存在了字符流。字节到字符的转换必定需要编码转换,中文乱码比较多(英文就不存在这个问题)。
两者转换的桥梁
读的过程
从字节到字符,通过InputStreamReader类。
InputStreamReader 构造方法
InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
创建使用给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
InputStream 到 Reader 的过程要指定编码字符集,否则将采用操作系统默认字符集,很可能会出现乱码问题。FileReader是InputStreamReader的子类。
try {
StringBuffer str = new StringBuffer();
char[] buf = new char[1024];
FileReader f = new FileReader("file");
while(f.read(buf)>0){
str.append(buf);
}
str.toString();
} catch (IOException e) {}
指定编码格式,就需要InputStreamReader了。
StringgBuilder sb = new StringBuilder();
//指定编码为”GBK“
in = new InputStreamReader(new FileInputStream(file), "GBK");
char[] buf = new char[1024];
while (in.read(buf) > 0) {
sb.append(buf);
}
System.out.println(sb);
写的过程
与写的过程类似,通过 OutputStreamWriter 类完成,字符到字节的编码过程,由 StreamEncoder 完成编码过程。
Code
//默认编码写入
Writer out = new FileWriter("1.txt");
out.write(s);
//"utf-8"编码写
out = new OutputStreamWriter(new FileOutputStream("1.txt"), "UTF-8");
out.write(s);