IO流
什么是IO流
-
I
- input 输入流
- 读取
-
O
- output 输出流
- 写入
-
文件操作为例
- 从内存中保存的数据到硬盘 ----output 输出流
- 从硬盘中读取数据到内存 ----input 输入流
【注意】 - 完整文件的传输要比散文件的要高得多!!!
-
IO流基类
InputStream
输入流基类
read -
OutputStream
输出流基类
write
IO流分类
字节流和字符流
一、字节I/O流的操作
- InputStream类型
- InputStream的作用表示那些从不同数据源产生输入的类,即其派生类多是不同数据源对应的流对象。
- OutputStream类型
与InputStream相对应,OutputStream的作用表示将数据写入不同的数据源。 - FileInputStream
文件操作输入字节流 - FileOutputStream
文件操作输出字节流
二、基于字符的I/O操作
- Reader类型
- 继承自Reader类的,字符型数据来源常用类,如下:
InputStreamReader:字节与字符适配器,子类包含- —FileReader(以字符形式读取文件)
CharArrayReader:读取字符数组
StringReader:数据源是字符串
BufferedReader:读取字符输入流,并进行缓存,常用法:BufferedReader in = new BufferedReader(new FileReader(“foo.in”)); 表示采用缓存的方式从文件读取数FileReader
文件操作输入字符流
FileWriter
文件操作输出字符流
- 继承自Reader类的,字符型数据来源常用类,如下:
- Writer类型
继承自Writer类的,字符型数据来源常用类,如下:
OutputStreamReader:字节与字符适配器,子类包含FileWriter(以字符形式写文件)
CharArrayWriter:写字符数组
StringWriter:内部有StringBuffer,用于缓存构造字符串
BufferedWriter:字符输出流,常用法:PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(“foo.out”))); 表示将数据格式化并用缓存的方式写入文件
文件读取使用缓冲和非缓冲差距
- 内存的运作速度看做是火箭
- 硬盘就是一个自行车
- 使用缓冲之后,从硬盘中一口气读取8KB数据存储在内存中,供程序使用,但这对于内存来说还是慢的很。
- 固态硬盘,4KB对齐。固态硬盘中每一个扇区都是4KB。缓冲这里是要求CPU读取两个4KB数据,对于CPU而言没有太多压力。
文件操作输入字节流
- Constructor 构造方法
- FileInputStream(File file);
这里是根据提供的File类对象创建对应的文件操作输入字节流。 - FileInputStream(String pathName);
这里是根据提供的String类型文件路径,创建对应的文件操作输入字节流。 - 这两种都会抛出异常:
FileNotFoundException 文件未找到异常。
- FileInputStream(File file);
- Method 成员方法 :
- int read();
从文件中读取一个字节数据返回到方法外。
虽然返回值是一个int类型,但是在整个int类型当中存储的数据是一个byte类型,有且只有低8位数据有效 - int read(byte[] buf);
读取文件的内容是存储在byte类型数组中,返回值是读取到的字节个数 - int read(byte[] buf, int offset, int count);
读取文件的内容是存储在byte类型数组中,要求从byte数组offset位置开始,到count长度结束,返回值是读取到的字节个数
- int read();
- 以上三个方法如果读取到文件末尾,返回值都是 -1 EOF End Of File而且以上方法都要异常抛出IOException IO异常
文件操作输出字节流
-
Constructor 构造方法
FileOutputStream(File file);
根据File类对象创建对应的文件输出字节流对象
FileOutputStream(String pathName);
根据String类型文件路径创建对应的文件输出字节流对象 -
以上两个构造方法,创建的FileOutputStream是删除写/清空写操作,会将原文件中的内容全部删除之后,写入数据。
-
leOutputStream(File file, boolean append);
根据File类对象创建对应的文件输出字节流对象。创建对象时给予append参数为true,表示追加写。 -
FileOutputStream(String pathName, boolean append);
根据String类型文件路径创建对应的文件输出字节流对象,创建对象时给予append参数为true,表示追加写。 -
FileOutputStream构造方法是拥有创建文件的内容,如果文件存在,不创建,文件不存在且路径正确,创建对应文件。否则抛出异常FileNotFoundException
Method 成员方法
void write(int b); -
写入一个字节数据到当前文件中,参数是int类型,但是有且只会操作对应的低八位数据
void write(byte[] buf); -
写入字节数组中的内容到文件中
void write(byte[] buf, int offset, int length); -
写入字节数组中的内容到文件中,从指定的offset开始,到指定长度length
-
以上方法会抛出异常:IOException
字符流特征
-
如果是字符内容操作,效率还可以!!!
-
如果是非字符操作,凶多吉少!!!
-
字符流操作文件
个人建议,该文件可以使用notepad 记事本打开无乱码,可以使用字符流操作。
视频文件,图片文件,特定格式的文件,都无法使用字符操作。
文件操作输入/输出字符流
- 与字节基本一致
除了Method 成员方法中的int read();
读取文件中的一个字符数据,通过返回值返回,返回值类型是int类型,但是在int类型中有且只有(低16位)数据有效。