1.什么是IO
I:Input
O:Output
通过IO可以完成硬盘文件的读和写。
IO流又叫输入输出流 ,输入和输出均是以内存作为参照物。
2. I/O流的分类?
2.1 输入流,输出流
以内存作为参照物,
往内存中去,叫做输入,或者叫做读。
从内存中出来,叫做输出,或者叫做写。
2.2 字节流,字符流
字节流
按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。这种流是万能的,什么类型的文件都可以读取。包括:文本文件,图片,声音文件,视频文件。
example:
假设文件file1.txt,采用字节流的话是这样读的:
a中国bo张三fe:
第一次读: 一个字节,正好读"a"。
第二次读:一个字节,正好读到"中"字符的一半。
第三次读: 一个字节,正好读到"中字符的另外一半。
字符流
按照字符的方式读取数据, 一次读取一个字符,这种流是为了方便读取普通文本文件而存在的,这种流不能读取:图片、声音、视频等文件。只能读取纯文本文件,连word文件都无法读取。
example:
假设文件file1.txt,采用字符流的话是这样读的:
a中国bo张三fe:
第一次读:'a’字符('a’字符在windows系统中占用1个字节)
第二次读:'中’字符('中’字符在windows系统中占用2个字节)
3. I/O流所使用的具体抽象类
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
java.io.Reader 字符输入流
java.io.Writer 字符输出流
所有的流都实现了:java.io.Colseable接口,都是可关闭的,都有close()方法. 流毕竟是一个管道,这个是内存和硬盘之间的通道,养成一个好习惯,用完流将其关闭。
所有的输出流都实现了:java.io.Flushable接口,都是可刷新的,都有flush()方法。养成一个好习惯,输出流在最终输出之后,一定要记得flush()刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据强行输出完(清空管道!)刷新的作用就是清空管道。如果没有flush()可能会导致数据丢失.
注意:在java中只要"类名"以Stream结尾的都是字节流。以"Reader/Writer"结尾的都是字符流 。
4.Java.io 包下常用的流(16个)
文件专属
java.io.FileinputStream (用得最多)
java.io.FileOutputStream (用得最多)
java.io.FileReader
java.io.FileWriter
转换流:(将字节流转换成字符流)
java.io.InputStreamReader
java.io.outputStreamWriter
缓冲流专属:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
数据流专属:
java.io.DataInpoutStream
java.io.DataOutputStream
标准输出流:
java.io.PrintWriter
java.io.PrintStream
对象专属流:(掌握)
java.io.ObjectInputStream
java.io.ObjectOutputStream
5.FileInputStream详解
文件字节输入流,万能的,任何类型的文件都可以采用这个流来读
以字节的方式,完成输入的操作,完成读的操作(硬盘 —> 内存)
样例1:读取操作
比如我现在要读取这样内容的一个文本文件
可以采用InputStream中的read()方法,它每次会读取一个字节。
英文会读取一个字母,汉字读取半个字符或三分之一个字符。
(因为GBK的一个汉字占两个字节,UTF-8的汉字占3个)
读到文件末尾时read()方法会返回-1
FileInputStream fis = new FileInputStream("C:\\Users\\86185\\Desktop\\temp.txt");
// 开始读
int a = fis.read(); // a对应的10进制数值
int b = fis.read(); // b对应的10进制数值
int c = fis.read(); // c对应的10进制数值
int d = fis.read(); // d对应的10进制数值
int e = fis.read(); // e对应的10进制数值
int none = fis.read(); // 读到末尾没有值了
// 如果读不到数据 则返回负一
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println