Day20
01IO流
1. IO按流向分为输入流和输出流
2. 按操作类型分为字符流(reader, writer)和字节流(stream)
3. 字节流的抽象父类:
* InputStream
* OutputStream
4. 字符流的抽象父类:(操作的是纯文本文件, 用记事本打开, 并且能看的懂得文件, 用word打开不都行)
* Reader
* Writer
5. * IO程序书写
* 使用前,导入IO包中的类
* 使用时,进行IO异常处理
* 使用后,释放资源
6. 文件的结束标志是-1
02InputStream和outputstream
1. int read() // 每次向下读取一个字符, 文件的默认结尾是-1
2. read( ) 为什么每次读取一个字节, 返回值却是一个int类型的;
read()读的是字节byte是二进制形式的, 当遇到11111111时会认为是遇到了-1, 结束读取,
为了防止这种情况发生, 将byte前边补3个8位的0凑足4个字节, 变成int类型, 11111111就会变成255了
保证整个数据被读完, 读到的-1就是int类型的-1
int read(byte[] b); 将字节流读入一个指定大小的byte数组中, 返回值是 读入字节数组的字节数
int available( ) //一次性获得写入文件中的所有字节数
构造方法
1,FileOutputStream(File file) 创建对象的时候 如果没有个文件,会创建一个, 如果有的话, 会清空这个文件
2.FileOutputStream(File file, boolean append) 会向已经存在的文件里追加写入的内容 续写!!
3. void write( int i) //每次写入一个字符, 这里的int在写入的时候, 系统会自动去掉前三个8位
4. void write(int i , boolean append) //true的时候回向文件中追加添加元素
5.
获取文件大小的方法
File类的Length( )方法
FileInputStream类的available()方法
File的length()方法更好用, 不需要关流
03拷贝图片
1. 定义输入流和输出流对象
FileInputStream fis = new FileInputStream("G:\\a.jpg");
FileOutputStream fos = new FileOutputStream("G:\\copy.jpg");
2. 挨个字节读写copy (效率太低, 不推荐)
int i;
while((i = fis.read()) != -1){ //挨个字节读取写入内存
fos.write(i); //挨个字节输出
}
3. 关闭输入流,输出流!
fis.close();
fos.close();
方法二:
2. 当文件过大时, 有可能会造成内存溢出
byte[] arr = new byte[fis.availiable()]; //创建一个和文件大小样的字节数组
fis.read(arr); //将文件读出, 并缓冲到一个字节组数(内存)中
fos.write(arr); //将字节数组中的内容读出写入到输出流
方法三: 标准格式
3. 定义一个小数组, 每次读取短数组大小的byte流
byte[] b = new byte[1024 * 8]; //字节数组的长度一般定义为1024的倍数
int len; //len表示每次读取到的字节数
while ((len = fis.read(b)) != -1){ //当读取到的字节数等于-1时表示文件读完了
fos.write(b, 0, len); //write(byte[] b, offset, length) 表示每次输出从字节数组中偏移位置开始的byte长度的字节
}
04BufferedInputStream BufferedOutputStream
1. 构造方法: BufferedInputStream(InputStream inputstream)
相当于把inputstream包装进buffer字节缓冲中(缓冲区在内存中), 一次性从硬盘中读取一个字节数组的长度到缓存去中, 比挨个字符读取速度更快
2. BufferedInputStream bis = new BufferedInoutStream(new FileInputStream("G:\\xxx.mp3"));
BufferedOutputStream bos = new BufferedOutputStrean(new FileOutputStream("G:\\copy.mp2"));
int i;
while ((i = bis.read()) != -1){ //在缓存区流中存在一个byte[]数组, 8192大小, 每次从输入流中读取一个字节数组的长度, 表面是读1个, 但是一次读就是读8192个大小
bos.write(i); //再将bufferedInputStream中的字符挨个写入BufferedOutStream中, 操作发生在内存中,效率高
}
3. 定义小数组和缓冲区哪个更快一点?
如果小数组的长度和缓冲区长度相等时, 即都是8192(1024 * 8)时, 小数组要稍快一些,定义小数组操作的是一个数组, 而定义缓冲区操作的是两个数组,
小数组在内存中不涉及取和存的操作, 而buffer缓冲区 需要存取, 所以小数组略快一些
浪费了一定的时间
05flush和close的区别
1.flush有刷新功能, 刷新之后还可以继续往里写, 需要实时刷新的, 需要要flush()
2.close也有刷新功能, 刷新之后就不能再继续往里写了, 流就关闭了
07图片加密
用的亦或思想 一个数亦或两次相同的数还是他本身
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\secrit.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("G:\\secrit2.jpg"));
int i;
while ((i = bis.read()) != -1){
bos.write(i ^ 123); //每一位都亦或一个数, 想要看到这个图片, 就将这个图片作为输入源在来一次
}
bis.close();
bos.close();
|