一.IO
1.基本概念
I/O 这里的I和O指的是输入与输出
- 输入:Input 用来读取数据的
- 输出:Output 用来写出数据的
2.流的概念
java将输入与输出比喻为"流",英文:**Stream**.
是连接程序与另一端的"管道",用于获取或发送数据到另一端.
3.超类
- **java.io.InputStream**是所有字节输入流的超类,里面定义了所有字节输入流都必须具备的读取字节的方法
- int read()
读取一个字节,以int形式返回,该int值的”低八位”有效,若返回值为-1则表示EOF
- int read(byte[] data)
尝试最多读取给定数组的length个字节并存入该数组,返回值为实际读取到的字节量。
- **java.io.OutputStream**是所有字节输出流的超类,里面定义了所有字节输出流都必须具备的写出字节的方法
- void write(int d)
写出一个字节,写的是给定的int的”低八位”
- void write(byte[] data)
将给定的字节数组中的所有字节全部写出
- void write(byte[] data,int offset,int len)
将给定的字节数组中从offset处开始的连续len个字节写出
二。文件流
概念
文件流是用来链接我们的程序与文件之间的"管道",用来读写文件数据的流。
效率很低,因为单字节读写。
可以采取使用块读写的方式来复制文件,减少硬盘的实际读写的次数,从而提高效率。
文件流分为
- 文件输入流java.io.FileInputStream:读取文件数据的流
- 文件输出流java.io.FileOutputStream:写入文件数据的流
- 文件流是继承自InputStream和OutputStream
1.文件输出流FileOutputStream
**java.io.FileOutputStream**使用文件输出流向文件中写入数据
-FileOutputStream(String path)
创建文件输出流对指定的path路径表示的文件进行写操作,如果该文件不存在则将其创建出来
-FileOutputStream(File file)
创建文件输出流对指定的file对象表示的文件进行写操作,如果该文件不存在则将其创建出来
2. 文件输入流FileInputStream
**java.io.FileInputStream**使用文件输入流向从文件中**读取**数据
-FileInputStream(String path)
基于给定的路径对应的文件创建文件输入流
-FileInputStream(File file)
基于给定的File对象所表示的文件创建文件输入流
3.块读写
- 块读:一次性读取一组字节的方式
InputStream中定义了块读的方法
int read(byte[] data)
一次性读取给定字节数组总长度的字节量并存入到该数组中。
返回值为实际读取到的字节数。如果返回值为-1表示本次没有读取到任何字节已经是流的末尾了
- 块写:一次性写出一组字节的方式
OutputStream中定义了块写的方法
void write(byte[] data)
一次性将给定数组中所有字节写出
void write(byte[] data,int offset,int len)
一次性将data数组中从下标offset处开始的连续len个字节一次性写出
注意:块读复制后的文件比原文件大一些。这是文件不一定是数组的容量倍数,这会导致最后一次读取时是读不够数组的字节数的,那么最后一次数组中就不是所有数据都是新数据了。此时如果在写出时将数组所有内容写出就会出现文件最后多出很多旧的数据。
解决办法
使用OutputStream的另一个块写操作
void write(byte[] data,int offset,int len)
将给定数组data从offset处开始的连续len个字节一次性写出
4.写出文本数据
文件中只能保存2进制信息,因此我们要想写出文本数据,需要先将字符串转换为2进制。
byte[] getBytes(Charset cs)
将当前字符串按照指定的字符集转换为一组字节
例如:
String str= "abc";
byte[] data = str.getBytes(StandardCharsets.UTF_8);//将字符串按照UTF-8编码转换为一组字节
5.读取文本数据
先将文件中的字节读取出来,然后再将这些字节按照对应的字符集转换为字符串即可
String(byte[] data,Charset cs)
将data数组中的所有字节按照指定的字符集转换为字符串
将data数组中所有字节按照UTF-8编码还原为字符串
String str = new String(data, StandardCharsets.UTF_8);