20 (IO字节流,文件拷贝)
1 IO流
2 FileInputStream
重要方法read(),每次读取一个字节,返回值为int。
当没有字节的时候,会返回-1,所以文件的结束标记是-1,那么会出现一个新的问题,read()为什么返回int值呢?
而不是返回byte呢?是这样的,如果是byte,万一文件中存储了-1,程序会错误的以为文件已经结束了,所以它返回的时候前面补上24个0。
3 FileOutputStream
FileOutputStream在创建对象的时候会清空文件内的内容,再写进去。
追加:可以在构造时设置追加为true
4 拷贝图片
问题:当拷贝大文件时,效率很低
开发推荐:标准格式
5 BufferedInputStream和BufferedOutputStream
他们是对InputStream和OutputStream的包装,使得他们更加强大,运用缓冲区大小8192,提高效率,每次读取8192到缓冲区。缓冲区积累8192,使得效率很高。
flush和close,一个是刷新之后还可以用流,一个是刷新之后关闭流。
6 字节流读取中文的问题
一个中文等于两个字节。所以会出现读取半个字节的问题。
写中文可以写,但是需要将字符串.getBytes()转换为字符数组来写。
7 异常处理模板
jdk1.6版本
package com.haidai.IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("xxx.txt");
fos = new FileOutputStream("yyy.txt");
int len;
while ((len = fis.read()) != -1) {
fos.write(len);
}
} finally {
if (fis != null || fos != null) {
fis.close();
fos.close();
}
}
}
}
jdk1.7版本(自动关闭流)
package com.haidai.IO;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
try (
FileInputStream fis = new FileInputStream("xxx.txt");
FileOutputStream fos = new FileOutputStream("yyy.txt");
) {
int len;
while ((len = fis.read()) != -1) {
fos.write(len);
}
}
}
}
8 图片加密
异或的特点。