java进阶-第十一讲 IO
1 什么IO
IO:
Input:输入。
Output:输出。
计算机中,什么是输入?什么是输出?
计算机中:
输入的概念是往内存中读入硬盘上的数据,这叫读 read
输出的概念是从内存中往硬盘上写数据,这叫做写 write
怎么理解:
我们人就相当于一台电脑,
读:读书,是不是将书上(硬盘)的内容读入到大脑(内存)中,这叫做输入
写:写文章,是不是将大脑中(内存)的知识写到纸上(硬盘),这叫做输出

2 流的分类
流按照方向分为两种:输入流、输出流,
输入流指的是:往内存中存入数据,叫做输入,也叫作读,Inputxxx
输出流指的是:从内存中往外取数据,叫做输出,也叫作写,Outputxxx
按照读取数据的类型来分,分为:字节流和字符流两种
什么是字节流:每次读取一个字节,8bit -- 1Byte
什么是字符流:每次读取一个字符。比如"a曹操",读取的时候一次读取一个字符
先读取'a',然后读取'曹',汉字在windows中存储是两个字节,'a'在windows中占1个字节
使用字符流读取的时候,他会帮你包装好,一次读到的就是一个字符。
区别:
字节流可以读取任何形式的数据:包括文本、音频、图像、视频等等
字符流只能读取纯文本形式的数据,也就是txt格式的数据。
字节流有哪些:
以后你们只要看到以Stream结尾的都是字节流,比如InputStream,OutputStream
FileInputStream/FileOutputStream
BufferedInputStream/BufferedOutputStream
字符流有哪些:
以后你们只要看到以Reader或者是Writer结尾的都是字符流。
Reader/Writer
InputStreamReader/OutputStreamWriter
问:如果要读取图片,用什么流?字节流
“a中国我爱你”
如果用字节流读的话,每次只能读一个字节,1Byte。
第一次读 ‘a’
第二次读 只能读中字的一半
如果用字符流,第一次读 'a' 第二次直接读'中'
windows中,一个汉字占2个字节,一个英文字符栈1个字节
3 InputStream
InputStream: 输入流,字节输入流,往内存中读入数据
InputStream是一个抽象类,无法创建对象,所以,我们要使用它的子类。
这也是多态的应用,它的子类用得最多的是FileInputStream
往内存中读,要有哪些先决条件?
1.先要有输入源。有了输入源才能往内存中读入数据。
2.FileInputStream的输入源是什么东西?File文件,所以先要有文件
InputStream is = new FileInputStream(String或者File);
String类型的参数表示:文件的路径
File类型的参数表示:一个文件对象
3.FileInputStream就是一个输入的管道,通过这个管道中的read方法将硬盘上的数据
读入到内存中
流的步骤:
1.确定源
2.打开流
3.操作
4.关闭流
流一般情况下都是配套使用,也就是Input搭配一个Output
操作的步骤和上面一致
先打开的流后关闭
输出流一定要刷新,即调用flush()方法
有异常要捕获。

package com.tj.IO;
import java.io.*;
public class IOTest02 {
public static void main(String[] args) {
File srcFile = new File("/IdeaProjects/Study/src/com/tj/IO/IOTest01.java");
File destFile = new File("/IdeaProjects/Study/src/com/tj/IO/IOTestcpy01.txt");
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(destFile);
byte[] flush = new byte[4];
while (fis.read(flush) != -1) {
fos.write(flush);
fos.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != fos) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != fis) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}