Java IO 流

File

File 为文件和目录路径名的抽象表示方式。
一个 File 对象可以代表一个文件或目录的抽象。
建立 File 对象不会对文件系统产生影响。

File 为 文件与程序之间的联系,是一个抽象的概念,File 对象不能不能代表一个真正的文件。

File 不能按其字面意思理解为文件,File 为文件与程序之间的抽象关系,能够建立 File 对象不能说明文件真正的存在,故在使用 File 对象的使用需要对 File 对象关联的文件判断是否存在操作。

File 的基本操作

1
2
3
4
5
getName():获得文件的名字、路径名
getPath():路径名
getAbsoluteFile():绝对路径名
getParentFile():父路径,没有为 null
file 的绝对路径和相对路径

创建文件和删除文件

1
2
createNewFile():
createTempFile():创建临时文件,调用 deleteOnExit 会在程序退出后删除。

文件夹

1
2
mkdir():新建文件夹,父路径不存在创建失败,文件夹存在不创建
mkdirs():新建文件夹链,父路径不存在创建父目录

IO 流原理

程序与文件、数组、网络连接数据库之间进行进行数据交换。

IO 流的操作以程序为中心,什么是以程序为中心?

就是如果要读度文件数据的话,对于文件来说为输出流,而对于程序来说为输入流,那么就以输入流来命名该文件流。

分类

按流向分类

  1. 输入流
  2. 输出流

按处理的数据分类:

  1. 字节流:二进制,可以处理一切文件
  2. 字符流:文本文件 ,只能处理纯文本

按功能分类:

  1. 节点流:离源头近,包裹源头
  2. 处理流:增强功能,提高效率

字符流与字节流

两种流均为节点流,节点流为直接和源文件相连的流。

InputStream(输入字节流)、OutputStream(输出字节流)

字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

字节流

字节流可以处理一切格式的文件

字节流常用 API

1
2
3
4
5
#FileInputStream
read(byte[] b)、read(byte[] b,int off,int len)、close()

#FileOutoutStream
writer(byte[] b)、write(byte[],int off,int len)、flush()、close()

// 读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
File file = new File(allPath, "a");
FileInputStream inputStream = null;
if (file.exists()) {
try {
inputStream = new FileInputStream(file);
// 缓存数组
byte[] array = new byte[10];
int len = 0;//实际读取的大小
while ((len = inputStream.read(array)) != -1) {
String info = new String(array, 0, len);
System.out.println(info);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {

}
}
}
}

// 写出文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
File file = new File(allPath, "a");
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file, true);
String inrfo = "wojwoo我们";
byte[] data = inrfo.getBytes();
outputStream.write(data);
outputStream.flush();//强制刷新,使在数组中的数据强制写出
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

字符流常用API

1
2
3
4
5
#FileReader
read(char[] b)、read(char[] b,int off,int len)、close()

#FileWriter
writer(char[] b)、write(char[],int off,int len)、flush()、close

流的基本操作:

  1. 建立联系。 File 为程序与文件之间的联系,即 建立 File 对象。
  2. 选择合适的流。
  3. 操作:流的读取,关键:缓存数组。
  4. 关闭流。

字符流

只可处理纯文本文件,如 .txt、 .html 。

Reader、Writer、FileReader、FileWriter

纯文本的读取、纯文本的写出

数组为 char[]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
File src = new File(allPath, "a");
Reader reader = null;
if (src.exists()) {
try {
reader = new FileReader(src);
char[] buffer = new char[512];
int len = 0;
while ((len = reader.read(buffer)) != -1) {
String str = new String(buffer, 0, len);
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("file not exist");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

处理流

字节流

处理流

增强功能,提高性能。

节点流和处理流的关系:

  1. 节点流:可以直接从数据源读取或写出数据。

  2. 处理流:不直接连接到数据源或目的地,是处理流的流,通过对其他流的处理提高程序的性能。

  3. 节点流处于 IO 操作的第一线,所有的操作必须通过它们,处理流可以对其他流进行处理。

  4. 处理流在节点流之上。

字节流的处理流

BufferredInputStream、BufferendOutoutStream

为字节流添加处理流

new BufferredInputStream(new FileInputStream(xx,xx));

new BufferendOutoutStream(new FileOutputStream(xx,xx));

字符流的处理流

BufferendReader: readLine()

BufferendWrinter: newLine()

转换流

将字节流转换为字符流,可以指定编码格式将字节流转换为字符流,处理乱码(编码器、解码集)。

以程序为中心:

解码:二进制 –(解码字符集)–> 字符

编码:字符 –(编码字符集)–> 二进制

乱码原因:

  1. 编码与解码字符集不同。
  2. 字节数目不完整。

字节流转换为字符流:

  1. 输入流:InputStreamReader 解码(读取二进制文件,显示为人类可识别的字符)
  2. 输出流:OutputStreamWriter 编码 (将人类识别的字符转换为字节,写入文件)

编码要求:使用字符流用指定的解码格式读取文本文件。

1
2
3
4
5
// 初步实现如下,但是不能指定解码格式
BufferendReader reader = new BufferendReader(new FileReader(xxx));

//现在就是转换流出场的时候了,可以使用转换流以指定的解码方式将字节流转换为字符流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(""),"UTF-8"));