# 存储&读写数据的方案 | Eabor
Have a good day!
Author: EaborH
Keywords: Hexo Theme Redefine

## I'm on my way...

# 存储&读写数据的方案

EaborH
2025-03-28 2025-03-28 Created 2025-03-28 16:21:56 2025-03-28 16:21:56 Updated

- 文件操作

- File和IO流

# 存储数据的方案

File是java.io.包下的类，File类的对象，用于代表当前操作系统的文件（可以是文件、或文件夹）
注意： File类只能对文件本身进行操作不能读写文件里面存储的数据

## File、IO流

IO流用于读写数据的（可以读写文件，或网络中的数据…）

### File

File类的对象可以代表文件/文件夹，并可以调用其提供的方法对象文件进行操作。

创建File类的对象

构造器 | 说明
--- | ---
`public File(String pathname)` | 根据文件路径创建文件对象
`public File(String parent, String child)` | 根据父路径和子路径名字创建文件对象
`public File(File parent, String child)` | 根据父路径对应文件对象和子路径名字创建文件对象
注意： |

- File对象既可以代表文件、也可以代表文件夹。
- File封装的对象仅仅是一个路径名，这个路径可以是存在的，也允许是不存在的。

File类提供的遍历文件夹的功能

方法名称 | 说明
--- | ---
`public String[] list()` | 获取当前目录下所有的”一级文件名称”到一个字符串数组中去返回。
`public File[] listFiles()` | 获取当前目录下所有的”一级文件对象”到一个文件对象数组中去返回（重点）
使用listFiles方法时的注意事项： |

- 当主调是文件，或者路径不存在时，返回null
- 当主调是空文件夹时，返回一个长度为0的数组
- 当主调是一个有内容的文件夹时，将里面所有一级文件和文件夹的路径放在File数组中返回
- 当主调是一个文件夹，且里面有隐藏文件时，将里面所有文件和文件夹的路径放在File数组中返回，包含隐藏文件
- 当主调是一个文件夹，但是没有权限访问该文件夹时，返回null

### 字符集

ASCII字符集

- ASCll(American Standard Code for Information Interchange):美国信息交换标准代码，包括了英文、符号等。
- 标准ASCII使用1个字节存储一个字符，首位是0，因此，总共可表示128个字符，对美国佬来说完全够用。

GBK（汉字内码扩展规范，国标）

- 汉字编码字符集，包含了2万多个汉字等字符，GBK中一个中文字符编码成两个字节的形式存储
- 注意：GBK兼容了ASCII字符集

Unicode字符集(统一码，也叫万国码)

- Unicode是国际组织制定的，可以容纳世界上所有文字、符号的字符集。
- UTF-32，4个字节表示一个字符

UTF-8

- 是Unicode字符集的一种编码方案，采取可变长编码方案，共分四个长度区：1个字节，2个字节，3个字节，4个字节
- 英文字符、数字等只占1个字节（兼容标准ASCI编码），汉字字符占用3个字节。

对字符的编码

String提供了如下方法 | 说明
--- | ---
`byte[] getBytes()` | 使用平台的默认字符集将该String编码为一系列字节，将结果存储到新的字节数组中
`byte[] getBytes(String charsetName)` | 使用指定的字符集将该String编码为一系列字节，将结果存储到新的字节数组中
对字符的解码 |

String提供了如下方法 | 说明
--- | ---
`String(byte[] bytes)` | 通过使用平台的默认字符集解码指定的字节数组来构造新的String
`String(byte[] bytes, String charsetName)` | 通过指定的字符集解码指定的字节数组来构造新的String

### IO流

FileInputStream（文件字节输入流）
作用：以内存为基准，可以把磁盘文件中的数据以字节的形式读入到内存中去

构造器 | 说明
--- | ---
`public FileInputStream(File file)` | 创建字节输入流管道与源文件接通
`public FileInputStream(String pathname)` | 创建字节输入流管道与源文件接通

方法名称 | 说明
--- | ---
`public int read()` | 每次读取一个字节返回，如果发现没有数据可读会返回-1.
`public int read(byte[] buffer)` | 每次用一个字节数组去读取数据，返回字节数组读取了多少个字节，如果发现没有数据可读会返回-1.

FileOutputStream文件字节输出流
作用：以内存为基准，把内存中的数据以字节的形式写出到文件中去。

构造器 | 说明
--- | ---
`public FileOutputStream(File file)` | 创建字节输出流管道与源文件对象接通
`public FileOutputStream(String filepath)` | 创建字节输出流管道与源文件路径接通
`public FileOutputStream(File file, boolean append)` | 创建字节输出流管道与源文件对象接通，可追加数据
`public FileOutputStream(String filepath, boolean append)` | 创建字节输出流管道与源文件路径接通，可追加数据

方法名称 | 说明
--- | ---
`public void write(int a)` | 写一个字节出去
`public void write(byte[] buffer)` | 写一个字节数组出去
`public void write(byte[] buffer , int pos , int len)` | 写一个字节数组的一部分出去
`public void close() throws IOException` | 关闭流

资源释放
`try-with-resource`

FileReader文件字符输入流
作用：以内存为基准，可以把文件中的数据以字符的形式读入到内存中去。

构造器 | 说明
--- | ---
`public FileReader(File file)` | 创建字符输入流管道与源文件接通
`public FileReader(String pathname)` | 创建字符输入流管道与源文件接通

方法名称 | 说明
--- | ---
`public int read()` | 每次读取一个字符返回，如果发现没有数据可读会返回-1.
`public int read(char[] buffer)` | 每次用一个字符数组去读取数据，返回字符数组读取了多少个字符，如果发现没有数据可读会返回-1.

FileWriter文件字符输出流
作用：以内存为基准，把内存中的数据以字符的形式写出到文件中去。

构造器 | 说明
--- | ---
`public FileWriter(File file)` | 创建字节输出流管道与源文件对象接通
`public FileWriter(String filepath)` | 创建字节输出流管道与源文件路径接通
`public FileWriter(File file, boolean append)` | 创建字节输出流管道与源文件对象接通，可追加数据
public FileWriter(String filepath, boolean append) | 创建字节输出流管道与源文件路径接通，可追加数据

方法名称 | 说明
--- | ---
`void write(int c)` | 写一个字符
`void write(String str)` | 写一个字符串
`void write(String str, int off int len)` | 写一个字符串的一部分
`void write(char[] cbuf)` | 写入一个字符数组
`void write(char[] cbuf, int off, int len)` | 写入字符数组的一部分

### 缓冲流

BufferedInputStream缓冲字节输入流
作用：可以提高字节输入流读取数据的性能
原理：缓冲字节输入流自带了8KB缓冲池；缓冲字节输出流也自带了8KB缓冲池。

构造器 | 说明
--- | ---
`public BufferedInputStream(InputStream is)` | 把低级的字节输入流包装成一个高级的缓冲字节输入流，从而提高读数据的性能
`public BufferedOutputStream(OutputStream os)` | 把低级的字节输出流包装成一个高级的缓冲字节输出流，从而提高写数据的性能

BufferedReader缓冲字符输入流
作用：自带8K（8192）的字符缓冲池，可以提高字符输入流读取字符数据的性能

构造器 | 说明
--- | ---
`public BufferedReader(Reader)` | 把低级的字符输入流包装成字符缓冲输入流管道，从而提高字符输入流读字符数据的性能
字符缓冲输入流新增的功能：按照行读取字符 |

方法 | 说明
--- | ---
`public String readLine()` | 读取一行数据返回，如果没有数据可读了，会返回null

BufferedWriter缓冲字符输出流
作用：自带8K的字符缓冲池，可以提高字符输出流写字符数据的性能。

构造器 | 说明
--- | ---
`public BufferedWriter(Writer r)` | 把低级的字符输出流包装成一个高级的缓冲字符输出流管道，从而提高字符输出流写数据的性能

字符缓冲输出流新增的功能：换行

方法 | 说明
--- | ---
`public void newLine()` | 换行

### 其他流

字符输入转换流 `InputStreamReader`

InputStreamReader（字符输入转换流）

- 解决不同编码时，字符流读取文本内容乱码的问题。
- 解决思路：先获取文件的原始字节流，再将其按真实的字符集编码转成字符输入流，这样字符输入流中的字符就不乱码了。

构造器 | 说明
--- | ---
`public InputStreamReader(InputStream is)` | 把原始的字节输入流，按照代码默认编码转成字符输入流（与直接用FileReader的效果一样）
`public InputStreamReader(InputStream is ,String charset)` | 把原始的字节输入流，按照指定字符集编码转成字符输入流（重点）

打印流
PrintStream/PrintWriter（打印流）
作用： 打印流可以实现更方便、更高效的打印数据出去，能实现打印啥出去就是啥出去。

PrintStream提供的打印数据的方案

构造器 | 说明
--- | ---
`public Printstream(OutputStream/File/String)` | 打印流直接通向字节输出流/文件/文件路径
`public PrintStream(String fileName, Charset charset)` | 可以指定写出去的字符编码
public PrintStream(OutputStream out, boolean autoFlush) | 可以指定实现自动刷新
public PrintStream(OutputStream out, boolean autoFlush, String encoding) | 可以指定实现自动刷新，并可指定字符的编码

方法 | 说明
--- | ---
`public void println(Xxx xx)` | 打印任意类型的数据出去
`public void write(int/byte[]/byte[]一部分)` | 可以支持写字节数据出去

### IO框架

什么是框架？
框架（Framework）是一个预先写好的代码库或一组工具，旨在简化和加速开发过程
框架的形式：一般是把类、接口等编译成class形式，再压缩成一个jar结尾的文件发行出去。

- Title: 存储&读写数据的方案
- Author: EaborH
- Created at : 2025-03-28 00:00:00
- Updated at : 2025-03-28 16:21:56
- Link: https://eabor.xyz/2025/03/28/存储&读写数据的方案/
- License: This work is licensed under CC BY-NC-SA 4.0.

- #File和IO流

JAVA网络编程 Prev posts
面向对象加强 Next posts