IO,即(input,output)输入和输出
那什么是流呢?
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
IO流的分类:
1、根据处理的数据类型不同可以分为:字符流和字节流
2、根据数据的流向不同可以分为:输入流和输出流
字符流的使用情况:
当读写的数据都是字符数据时,就要使用字符流。比如说文本文件(.txt)
字节流的使用情况:
读取到的数据不需要经过编码或者解码的情况下使用字节流。比如说图片数据、视频数据
所以我们在程序开发中绝大部分情况都是用字节流的。
字符流 = 字节流 + 编码(解码)
字符流和字节流的区别:
1、读写单位的不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
2、处理对象不同:字节流能处理所有类型的数据(如文本、图片、视频),而字符流只能处理字符类型的数据。
总结:只要不是纯文本的数据,都用字节流。
对了,我们所说的输入和输出都是以内存为参照物的。
如图:
下面以纯文本文件为例,测试用FileReader(文件字符输入流)读取文件中的文本内容并输出出来:
@Test
public void testFileReader1() throws IOException {
FileReader fileReader = null;
try {
fileReader = new FileReader("io.txt");
int ch = -1;
//读取文件中的字符数据赋值给ch,当ch的值为-1时说明文件已读取完毕
while ((ch = fileReader.read()) != -1){
System.out.println(ch);
System.out.println((char) ch);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fileReader != null){
fileReader.close();
}
}
}
字节流和字符流类似,将FileReader替换为FileInputStream即可,这里因为图片没法打印出来,我们选择将其复制到另一个文件中:
@Test
public void testInputOutputStream(){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream("IMG_2843.JPG");
//将上面路径中的图片复制到下面的路径
fileOutputStream = new FileOutputStream("yy.JPG");
byte[] buffer = new byte[1024];
int length = -1;
while ((length = fileInputStream.read(buffer)) != -1){
fileOutputStream.write(buffer,0,length);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fileOutputStream != null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}