IO
io代表input(输入)和output(输出)
计算机中,从硬盘,光盘等外部储存设备向内存读入数据叫做输入,反之叫做输出
理解:以内存为中心,把内存当作大脑,
把书上面的知识读到大脑中来,叫做读的操作,也就是输入
把大脑里的知识写在纸上,这叫做写的操作,也就是输出
从别人的大脑获取来的知识也叫做输入,也就是从另外一片内存中获取数据也叫做读
io流的分类
按流的方向分为:输入流(input)和输出流(output)
按照读取数据的方法分可以分为字节流和字符流
字节流即一次只读取一个字节,但是无论什么数据格式例如图片、音频、视频都可以读取,因为它一次只能读取一个字节,所以经常需要开一个byte数组充当它的缓冲区
字符流一次读取一个字符,无论是英文字符还是中文字符都可以一次读取,不过它只能读取.text格式的文件
操作流程
1.确定源,先找到需要进行输入输出的目标文件
2.打开流,打开需要的输入输出流
3.操作,对目标文件进行输入输出操作
4.关闭流,关闭输入输出流,有异常需要捕获,先打开的流后关闭,后打开的流先关闭
关于异常的补充:有时在写比较长的代码时,某个地方需要return但是又不希望后面的
代码无法执行,这时可以抛出一个运行时异常取代return。在方法体中throw的运行时异常
在方法头中无需throws
实例
(FileInputStream和FileOutputStream)
package com.mytest.IO;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class PictureCopy {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos =null;
try {
try {
fis = new FileInputStream("picture.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
fos = new FileOutputStream("picture-secret.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
byte[] buffer = new byte[20];
int len = 0;
while (true) {
try {
if (!((len = fis.read(buffer)) != -1)) break;
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < len; i++) {
buffer[i] = (byte) (buffer[i] * 5);
}
try {
fos.write(buffer, 0, len);
} catch (IOException e) {
e.printStackTrace();
}
}
} finally {
if (fos!=null) {
try {
fos.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
补充:
ObjectOutStream在打开流的时候会把目标文件清空,以便于往文件里写入其他对象。
所以当ObjectInputStream和ObjectOutStream操作同一文件时,先开ObjectInputStream完成操作,
再开ObjectOutStream,防止空文件异常和空指针异常。