[TOC]
# 1. 数组
数组是一种有序、可索引、支持随机访问的数据结构,适用于存储同一类型下固定数量的数据。在Java中,数组的大小是固定的,创建后长度不可变。数组的应用方法包括创建数组、访问元素、遍历数组、操作数组等。在项目中,数组可以用来存储数据集合,作为属性或方法的参数与返回值,在算法和逻辑中充当重要角色。掌握数组的特性和使用方法是Java编程中非常重要的基础知识。
## 1.1. 基本要素
| 要素 | 说明 |
| ----------- | ------------------------------------------------------------ |
| 技术边界 | 数组的大小是固定的,创建后长度不可变。 |
| 特性 | 有序、可索引、支持随机访问、基本类型或引用类型。 |
| 使用场景 | 需要在同一类型下存储固定数量的数据时使用数组。 |
| 应用方法 | 创建数组:type[] arrayName = new type[length]; <br>访问元素:arrayName[index]<br>遍历数组:for或foreach循环 |
| 与项目结构的关系 | 数组可以用来存储项目中的数据集合,作为属性或方法的参数与返回值,在算法和逻辑中充当重要角色。 |
| 实施关键流程 | 1. 声明数组变量并指定类型与长度<br>2. 创建数组<br>3. 访问元素或修改元素值<br>4. 遍历数组元素<br>5. 操作数组(翻转、排序、查找等) |
## 1.2. 基本数组操作
包含创建、访问、修改、获取、遍历、排序和查找方法。
| 方法名称 | 描述 |
| --- | --- |
| `int[] arr = new int[length] | 创建一个指定长度的 int 类型数组。 |
| `int[] arr = {value1, value2, ..., valueN} | 创建一个包含指定元素的 int 类型数组。 |
| `int value = arr[index]| 访问数组中的指定元素。 |
| `arr[index] = value | 修改数组中的指定元素。 |
| `int length = arr.length| 获取数组的长度。 |
| `for (int i = 0; i < arr.length; i++) {...}| 遍历数组中的所有元素。 |
| `Arrays.sort(arr)| 对数组进行排序。 |
| `int index = Arrays.binarySearch(arr, key)| 在一个已排序的数组中查找指定元素的位置。 |
## 1.3. 高级静态方法
以下方法都是`Arrays`类的静态方法,因此需要使用`Arrays.`前缀来调用。
* 在使用`Arrays.copyOf()`方法时,需要注意新数组的长度不能超过原数组的长度,否则会抛出`ArrayIndexOutOfBoundsException`异常。
* 在使用`Arrays.binarySearch()`方法时,需要注意数组必须是已排序的,否则可能会得到错误的结果。
| 方法名称 | 描述 |
| --- | --- |
| `Arrays.toString(int[] arr)| 将一个数组转换成字符串,并以字符串形式返回。 |
| `Arrays.copyOf(int[] original, int newLength)| 将一个数组复制到一个新的数组中,并返回新数组的引用。 |
| `Arrays.fill(int[] a, int val)| 将一个数组中的所有元素都设置为指定的值。 |
| `Arrays.binarySearch(int[] a, int key)| 在一个已排序的数组中查找指定元素的位置。 |
# I\O技术
## 技术边界
> Java I/O 的技术边界包括文件系统、网络、标准输入输出流等。Java I/O 可以读取或写入文件、套接字、管道、标准输入/输出流等数据源。
Java I/O操作中涉及到的Stream在使用完毕后需要正确关闭,否则会造成资源泄露。
## 特性
InputStream和OutputStream分别代表输入流和输出流的抽象基类。字节流和字符流提供的接口不同,字符流用来处理字符,字节流则可以处理任何数据。
> Java I/O 具有以下特性:
* Java I/O 可以读取或写入不同类型的数据,包括文本、二进制数据等。
* Java I/O 支持字节流和字符流两种不同类型的 I/O 操作。
* Java I/O 支持同步和异步操作。
* Java I/O 支持过滤器流,可以对输入或输出流进行过滤或处理。
* Java I/O 可以通过缓冲流提高数据读取或写入的性能。
## 使用场景
项目中需要读取文件、控制台输入、网络操作、写日志等场景会使用到I/O。
> Java I/O 适用于需要读取或写入数据的场景,例如:
* 读取或写入文件、网络数据等。
* 读取或写入用户输入的数据。
* 与其他程序进行交互,例如读取或写入标准输入输出流。
* 对数据进行过滤或处理,例如压缩或加密数据。
## 应用方法
* File文件:FileInputStream、FileOutputStream、FileReader、FileWriter等。
* 控制台:System.in、System.out。
* 网络:Socket、ServerSocket等。
> Java I/O 的应用方法包括:
* 创建输入或输出流,用于读取或写入数据。
* 读取或写入数据,可以通过字节流或字符流进行操作。
* 使用过滤器流对输入或输出流进行过滤或处理。
* 关闭输入或输出流,释放资源。
以下是一个简单的 Java I/O 示例:
```
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
// 创建一个文件输出流
FileOutputStream fos = new FileOutputStream("output.txt");
// 写入数据
fos.write("Hello, world!".getBytes());
// 关闭输出流
fos.close();
// 创建一个文件输入流
FileInputStream fis = new FileInputStream("output.txt");
// 创建一个字节数组,用于存储读取到的数据
byte[] buffer = new byte[1024];
// 读取数据到字节数组中,返回读取的字节数
int len = fis.read(buffer);
// 将字节数组中的数据转换成字符串并输出
System.out.println(new String(buffer, 0, len));
// 关闭输入流
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
## 与项目中的结构关系
I/O涉及到的Stream在业务逻辑和数据层面均起着重要作用,通过I/O读写的文件、数据库、网络数据等都与项目的结构和功能息息相关。
> Java I/O 在项目中通常用于与文件、网络等数据源进行交互,读取或写入数据。在项目中,Java I/O 可以作为属性或方法的参数与返回值,用于进行数据读取或写入等操作。
## 实施关键流程
**以文件读写为例:**
1. 创建File对象
2. 创建文件输入/输出流
3. 进行读写操作
4. 关闭流
5. 处理异常
> Java I/O 的实施关键流程包括:
1. 创建输入或输出流对象,用于读取或写入数据。
2. 读取或写入数据,可以通过字节流或字符流进行操作。
3. 使用过滤器流对输入或输出流进行过滤或处理。
4. 关闭输入或输出流,释放资源。
需要注意的是,在使用 Java I/O 进行数据读取或写入时,需要合理使用缓冲流等技术手段,以提高数据读取或写入的性能。同时也需要注意输入或输出流的关闭,避免资源泄漏。
## 字节流操作
### FileInputStream
* `FileInputStream(String name)`:创建一个文件输入流,以指定的名称打开文件进行读取。
* `FileInputStream(File file)`:创建一个文件输入流,以指定的File对象表示的文件进行读取。
* `int read()`:读取一个字节的数据并返回,如果已到达文件末尾,则返回 -1。
* `int read(byte[] b)`:从输入流中读取一定数量的字节,并将其存储到缓冲区数组 b 中。
* `int read(byte[] b, int off, int len)`:从输入流中读取最多 len 个字节的数据,并将其存储到偏移量为 off 的缓冲区数组 b 中。
* `long skip(long n)`:从输入流中跳过并丢弃 n 个字节的数据,并返回实际跳过的字节数。
* `int available()`:返回可以从输入流中读取的估计剩余字节数。
* `void close()`:关闭输入流并释放与之关联的所有系统资源。
### FileOutputStream
* `FileOutputStream(String name)`:创建一个文件输出流,以指定的名称打开文件进行写入。
* `FileOutputStream(File file)`:创建一个文件输出流,以指定的File对象表示的文件进行写入。
* `void write(int b)`:将指定的字节写入输出流。
* `void write(byte[] b)`:将指定的字节数组写入输出流。
* `void write(byte[] b, int off, int len)`:将指定的字节数组的一部分写入输出流。
* `void flush()`:刷新输出流并强制写出任何缓冲的输出字节。
* `void close()`:关闭输出流并释放与之关联的所有系统资源。
## 字符流操作
### FileReader
* `FileReader(String fileName)`:创建一个文件输入流,以指定的名称打开文件进行读取。
* `FileReader(File file)`:创建一个文件输入流,以指定的File对象表示的文件进行读取。
* `int read()`:读取一个字符的数据并返回,如果已到达文件末尾,则返回 -1。
* `int read(char[] cbuf)`:从输入流中读取一定数量的字符,并将其存储到缓冲区数组 cbuf 中。
* `int read(char[] cbuf, int off, intlen)`:从输入流中读取最多 len 个字符的数据,并将其存储到偏移量为 off 的缓冲区数组 cbuf 中。
* `long skip(long n)`:从输入流中跳过并丢弃 n 个字符的数据,并返回实际跳过的字符数。
* `void close()`:关闭输入流并释放与之关联的所有系统资源。
### FileWriter
* `FileWriter(String fileName)`:创建一个文件输出流,以指定的名称打开文件进行写入。
* `FileWriter(File file)`:创建一个文件输出流,以指定的File对象表示的文件进行写入。
* `void write(int c)`:将指定的字符写入输出流。
* `void write(char[] cbuf)`:将指定的字符数组写入输出流。
* `void write(char[] cbuf, int off, int len)`:将指定的字符数组的一部分写入输出流。
* `void write(String str)`:将指定的字符串写入输出流。
* `void write(String str, int off, int len)`:将指定字符串的一部分写入输出流。
* `void flush()`:刷新输出流并强制写出任何缓冲的输出字符。
* `voidclose()`:关闭输出流并释放与之关联的所有系统资源。
## 缓冲流操作
### BufferedInputStream
* `BufferedInputStream(InputStream in)`:创建一个带有缓冲区的输入流,用于提高数据读取的性能。
* `int read()`:从输入流中读取一个字节的数据,并返回读取的字节数据。
* `int read(byte[] b, int off, int len)`:从输入流中读取最多 len 个字节的数据,并将其存储到偏移量为 off 的缓冲区数组 b 中。
* `void close()`:关闭输入流并释放与之关联的所有系统资源。
### BufferedOutputStream
* `BufferedOutputStream(OutputStream out)`:创建一个带有缓冲区的输出流,用于提高数据写入的性能。
* `void write(int b)`:将指定的字节写入输出流。
* `void write(byte[] b, int off, int len)`:将指定的字节数组的一部分写入输出流。
* `void flush()`:刷新输出流并强制写出任何缓冲的输出字节。
* `void close()`:关闭输出流并释放与之关联的所有系统资源。
### BufferedReader
* `BufferedReader(Reader in)`:创建一个带有缓冲区的输入流,用于提高数据读取的性能。
* `String readLine()`:读取一行文本数据并返回,如果已到达文件末尾,则返回 null。
* `void close()`:关闭输入流并释放与之关联的所有系统资源。
### BufferedWriter
* `BufferedWriter(Writer out)`:创建一个带有缓冲区的输出流,用于提高数据写入的性能。
* `void write(char[] cbuf, int off, int len)`:将指定的字符数组的一部分写入输出流。
* `void write(String str, int off, int len)`:将指定字符串的一部分写入输出流。
* `void newLine()`:写入一个行分隔符,并强制将缓冲区中的数据写入输出流。
* `void flush()`:刷新输出流并强制写出任何缓冲的输出字符。
* `void close()`:关闭输出流并释放与之关联的所有系统资源。
# 3. 字符串
## 3.1. 基本要素
| 要素 | 说明 |
| ----------- | ------------------------------------------------------------ |
| 技术边界 | 字符串的大小一旦确定就不可变。 |
| 特性 | 字符串是不可变的字符序列,可以看作字符数组,底层由char数组实现。字符串对象一旦创建,其值就不可改变。 |
| 使用场景 | 需要操作和存储字符序列数据时使用字符串。 |
| 应用方法 | 创建字符串:String str = "hello"; <br>访问字符:str.charAt(0)<br>字符串长度:str.length() <br>遍历字符串:for或foreach循环 |
| 与项目结构的关系 | 字符串可以用来存储项目中的字符串常量或动态拼接得到的字符串,作为属性或方法的参数与返回值,在业务逻辑和算法中发挥重要作用。 |
| 实施关键流程 | 1. 声明字符串变量<br>2. 使用字符串常量或构造方法创建字符串<br>3. 访问字符串中的字符<br>4. 获取字符串长度<br>5. 遍历字符串元素<br>6. 字符串操作(拼接、提取子串、分割、替换等) |
## 3.2. 字符串操作
### 3.2.1. 创建字符串
| 操作 | 方法 |
| --- | --- |
| 使用字符串字面量创建字符串对象 | `String str = "Hello world!"; |
| 创建一个空字符串对象 | `String str = new String(); |
| 使用字符数组 value 创建字符串对象 | `String str = new String(char[] value); |
| 使用字符数组 value 的一部分创建字符串对象 | `String str = new String(char[] value, int offset, int count); |
| 使用字节数组 bytes 创建字符串对象,按照默认字符集解码 | `String str = new String(byte[] bytes); |
| 使用字节数组 bytes 的一部分创建字符串对象,按照默认字符集解码 | `String str = new String(byte[] bytes, int offset, int length); |
| 使用字节数组 bytes 的一部分创建字符串对象,按照指定的字符集解码 | `String str = new String(byte[] bytes, int offset, int length, Charset charset); |
### 3.2.2. 操作字符串数据
| 操作 | 方法 |
| --- | --- |
| 返回字符串的长度 | `int length()` |
| 返回指定位置 index 处的字符 | `char charAt(int index) |
| 返回字符 ch 在字符串中第一次出现的位置 | `int |
| 返回字符 ch 在字符串中从指定的位置 fromIndex 开始第一次出现的位置 | `int indexOf(int ch, int fromIndex) |
| 返回字符串 str 在字符串中第一次出现的位置 | `int indexOf(String str) |
| 返回字符串 str 在字符串中从指定的位置 fromIndex 开始第一次出现的位置 | `int indexOf(String str, int fromIndex) |
| 返回字符 ch 在字符串中最后一次出现的位置 | `int lastIndexOf(int ch) |
| 返回字符 ch 在字符串中从指定的位置 fromIndex 开始最后一次出现的位置 | `int lastIndexOf(int ch, int fromIndex) |
| 返回字符串 str 在字符串中最后一次出现的位置 | `int lastIndexOf(String str) |
| 返回字符串 str 在字符串中从指定的位置 fromIndex 开始最后一次出现的位置 | `int lastIndexOf(String str, int fromIndex) |
| 测试字符串是否以指定的前缀开头 | `boolean startsWith(String prefix) |
| 测试字符串是否以指定的后缀结尾 | `boolean endsWith(String suffix) |
| 返回从指定位置 beginIndex 到字符串末尾的子字符串 | `String substring(int beginIndex) |
| 返回从指定位置beginIndex 到指定位置 endIndex 的子字符串(不包括 endIndex 位置的字符) | `String substring(int beginIndex, int endIndex) |
| 返回将字符串中所有旧字符 oldChar 替换为新字符 newChar 后的新字符串 | `String replace(char oldChar, char newChar) |
| 返回将字符串中所有目标序列 target 替换为替换序列 replacement 后的新字符串 | `String replace(CharSequence target, CharSequence replacement) |
| 返回去除字符串首尾空格后的新字符串 | `String trim() |
| 返回将字符串中所有字符转换为小写字母后的新字符串 | `String toLowerCase() |
| 返回将字符串中所有字符转换为大写字母后的新字符串 | `String toUpperCase() |
| 将指定对象 obj 转换为字符串,如果 obj 是字符串类型,直接返回 obj,否则返回 obj.toString() 的值 | `String valueOf(Object obj) |
### 3.2.3. 操作字符串数组
| 操作 | 方法 |
| --- | --- |
| 将字符串按照正则表达式 regex 分割为字符串数组 | `String[] split(String regex) |
| 将字符串按照正则表达式 regex 分割为字符串数组,最多分割 limit 次 | `String[] split(String regex, int limit) |
| 使用指定的分隔符 delimiter 连接字符串数组 elements 中的元素,返回连接后的新字符串 | `String join(CharSequence delimiter, CharSequence... elements) |
### 3.2.4. 操作字符串比较
| 操作 | 方法 |
| --- | --- |
| 比较字符串与指定对象 obj 是否相等 | `boolean equals(Object obj) |
| 比较字符串与另一个字符串 anotherString 是否相等(忽略大小写) | `boolean equalsIgnoreCase(String anotherString) |
| 按照字典序比较字符串与另一个字符串 anotherString,返回比较结果 | `int compareTo(String anotherString) |
| 按照字典序比较字符串与另一个字符串 str,忽略大小写,返回比较结果 | `int compareToIgnoreCase(String str) |
| 比较字符串与指定字符序列 cs 是否相等 | `boolean contentEquals(CharSequence cs) |
### 3.2.5. 操作字符串格式化
| 操作 | 方法 |
| --- | --- |
| 使用指定的格式字符串 format 和参数 args 格式化字符串 | `String format(String format, Object... args) |
| 使用指定的本地化对象 l、格式字符串 format 和参数 args 格式化字符串 | `String format(Locale l, String format, Object... args) |
| 使用指定的格式字符串 format 和参数 args 格式化字符串并打印到指定输出流 out 中 | `PrintStream |
# 4. 异常类
## 4.1. 基本要素
| 要素 | 说明 |
| ----------- | ------------------------------------------------------------ |
| 技术边界 | 异常会打断程序正常执行流程,如果不处理会导致`程序终止`。 |
| 特性 | `Throwable`是所有异常的祖先。异常分为两种:错误(Error)和异常(Exception)。异常又分为运行时异常和非运行时异常。|
| 使用场景 | 程序中可能出现的异常情况。`比如:`空指针访问、数组下标越界、文件找不到等。|
| 应用方法 |`使用try-catch-finally`语句进行异常处理。<br> `使用throw关键字` 抛出异常。自定义异常类需要继承Exception或RuntimeException。|
| 与项目结构的关系 | 异常处理机制在项目中起到很重要的作用,可以保证程序在出现异常情况下仍能正常运行,避免因为异常而中断,影响用户体验。 |
| 实施关键流程 | 1. 识别可能出现的异常情况。<br>2. 使用try-catch语句进行异常捕获与处理。<br>3. 在catch块中处理异常。<br>4. finally块用于执行无论是否出现异常都需要执行的代码。<br>5. 使用throw抛出自定义异常。<br>6. 自定义异常类继承Exception或RuntimeException。 |
### 下面结合代码示例详细说明异常处理的实施关键流程:
#### 1. 识别可能出现的异常情况:
```
// 打开文件可能产生FileNotFoundException
File file = new File("text.txt");
```
#### 2. 使用try-catch语句进行异常捕获:
```
try {
FileInputStream fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
// 处理异常
}
```
#### 3. 在catch块中处理异常:
```
catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
```
#### 4. finally块:
```
finally {
// 关闭流等操作
}
```
#### 5. 使用throw抛出自定义异常:
```
throw new MyException("自定义异常信息");
```
#### 6. 自定义异常类:
```
public class MyException extends Exception {
public MyException(String msg) {
super(msg);
}
}
```
## 4.2. 异常类列表方法
### Throwable 类方法
*****
| 方法 | 描述 |
| --- | --- |
| getMessage() | 返回异常的详细信息字符串。 |
| getCause() | 返回引发当前异常的原因。 |
| printStackTrace() | 输出异常堆栈跟踪信息。 |
| getStackTrace() | 返回一个包含堆栈跟踪信息的数组。 |
| fillInStackTrace() | 填充当前异常的堆栈跟踪信息。 |
| toString() | 返回包含异常类名和详细信息的字符串。 |
| addSuppressed(Throwable exception) | 将指定的异常添加到当前异常的抑制列表中。 |
| getSuppressed() | 返回当前异常的抑制列表。 |
### Exception 类方法
*****
| 方法 | 描述 |
| --- | --- |
| printStackTrace(PrintStream s) | 将异常堆栈跟踪信息输出到指定的输出流中。 |
| printStackTrace(PrintWriter s) | 将异常堆栈跟踪信息输出到指定的输出流中。 |
| setStackTrace(StackTraceElement\[\] stackTrace) | 设置当前异常的堆栈跟踪信息。 |
| initCause(Throwable cause) | 初始化当前异常的原因。 |
| fillInStackTrace() | 填充当前异常的堆栈跟踪信息。 |
| getCause() | 返回引发当前异常的原因。 |
### RuntimeException 类方法
*****
| 方法 | 描述 |
| --- | --- |
| RuntimeException(String message) | 使用指定的详细信息构造新的运行时异常。 |
| RuntimeException(String message, Throwable cause) | 使用指定的详细信息和原因构造新的运行时异常。 |
| RuntimeException(Throwable cause) | 使用指定的原因构造新的运行时异常。 |
| NullPointerException | 表示应用程序试图使用 null 值的对象引用时抛出的异常。 |
| ClassCastException | 表示在类型转换期间发生的异常。 |
| IllegalArgumentException | 表示向方法传递了一个不合法或不正确的参数时抛出的异常。 |
| ArithmeticException | 表示算术运算期间发生的异常。 |
| IndexOutOfBoundsException | 表示数组或字符串索引超出范围时抛出的异常。 |
### ArrayIndexOutOfBoundsException
*****
| 方法 | 描述 |
| --- | --- |
| ArrayIndexOutOfBoundsException() | 构造一个新的 ArrayIndexOutOfBoundsException,没有详细信息。 |
| ArrayIndexOutOfBoundsException(int index) | 构造一个新的 ArrayIndexOutOfBoundsException,其中包含指定索引的详细信息。 |
| ArrayIndexOutOfBoundsException(String s) | 构造一个新的 ArrayIndexOutOfBoundsException,其中包含指定的详细信息。 |
| StringIndexOutOfBoundsException | 表示字符串索引超出范围时抛出的异常。 |
| NullPointerException | 表示应用程序试图使用 null 值的对象引用时抛出的异常。 |
| NumberFormatException | 表示应用程序试图将字符串转换为数字时抛出的异常。 |
| IllegalStateException | 表示应用程序试图在不适当的时间调用方法时抛出的异常。 |
| InterruptedException | 表示线程被中断时抛出的异常。 |
| UnsupportedOperationException | 表示不支持请求的操作时抛出的异常。 |
| IOException | 表示发生输入或输出错误时抛出的异常。 |
| FileNotFoundException | 表示尝试打开指定文件时未找到该文件时抛出的异常。 |
# 5. 文件管理
## 4.1. 技术描述
| 技术 | 描述 |
| --- | --- |
| Java I/O 流 | 通过 Java I/O 流来读取和写入文件。Java 提供了多种 I/O 流,包括字节流和字符流,可以根据需要选择合适的流类型。 |
| NIO(New I/O) | 一种基于缓冲区、通道和选择器的 I/O 模型,提供了非阻塞式的高效文件读写方式,适用于高并发和大文件读写场景。 |
| java.nio.file 包 | Java SE 7 引入了 java.nio.file 包,提供了一套全新的文件系统 API,可以更方便、更高效地操作文件和目录,包括文件复制、移动、删除、创建等操作。 |
| Java 文件操作类 | Java 提供了多个文件操作类,如 File、FileInputStream、FileOutputStream、BufferedReader、BufferedWriter 等,可以使用这些类来操作文件和目录,例如创建、读取、写入、删除等操作。 |
| Apache Commons IO | 是一个流行的开源 Java 库,提供了多个文件和流操作的工具类,包括文件复制、移动、删除、比较、查找等操作,可帮助简化文件操作的编码工作。 |
| 使用场景 | 文件读写、文件拷贝、文件压缩、文件解压、文件加密、文件解密、文件上传、文件下载、文件备份、文件同步等。 |
| 应用方法 | 通过 Java I/O 流或 NIO 操作文件,或使用 java.nio.file 包中提供的 API 操作文件,或使用 Apache Commons IO 提供的工具类操作文件。 |
| 与项目中的结构关系 | 文件管理是许多项目中必不可少的一部分,例如 Web 项目中的文件上传和下载,后台管理系统中的文件备份和同步等。文件管理的实现通常与项目中的其他模块和组件相互关联,需要与数据库、界面、业务逻辑等模块进行交互。 |
| 实施关键流程 | <br>1\. 确定文件管理的需求和范围;<br>2. 选择适合的文件操作技术和工具;<br>3. 设计文件管理的数据结构和存储方式;<br>4. 实现文件上传、下载、备份、同步等功能;<br>5. 进行文件的权限控制和安全保护;<br>6. 进行文件的性能优化和异常处理;<br>7. 进行测试和调试;<br>8. 部署和上线文件管理系统。<br>以上是实施文件管理的关键流程,其中需要特别注意文件的安全性和性能优化。 |
## 4.2. 基本要素
| 要素 | 说明 |
| ----------- | ------------------------------------------------------------ |
| 技术边界 | Java对文件操作也有一定的限制,比如磁盘空间、文件数量等。 |
| 特性 | Java使用File类代表文件与目录,File类的对象可以是文件或目录。 File类只能操作文件属性,需要使用IO流读取与写入文件内容。|
| 使用场景 | 需要对文件进行创建、删除、重命名、修改时间查询等操作时使用文件管理。|
| 应用方法 |File类的常用方法:createNewFile():创建文件delete():删除文件renameTo():重命名文件isFile():判断是否为文件lastModified():获取最后修改时间length():获取文件大小listFiles():列出目录的内容等方法。 |
| 与项目结构的关系 | 文件在项目中起着重要作用,配置文件、资源文件、日志文件、缓存文件等都与项目的功能相关。文件管理用于操作这些文件,关系到项目的正确运行与健壮性。|
| 实施关键流程 | 1. 创建File对象指定文件路径。2. 使用File类方法判断文件/文件夹、创建、删除、重命名等。3. 列出文件夹内容或过滤某类型文件。4. 获取文件大小、最后修改时间等信息。5. 使用IO流读取与写入文件内容。6. 处理异常情况。 |
### 下面结合代码示例详细说明文件管理的实施关键流程:
#### 1. 创建File对象:
```
File file = new File("text.txt");
```
#### 2. 文件操作:
```
// 创建文件
file.createNewFile();
// 删除文件
file.delete();
// 重命名
file.renameTo(new File("text_new.txt"));
```
#### 3. 列出文件夹内容:
```
File folder = new File("folder");
File[] files = folder.listFiles();
```
#### 4. 获取文件信息:
```
// 文件大小
file.length();
// 最后修改时间
file.lastModified();
```
#### 5. 读取与写入文件:
```
// 读取
FileInputStream fis = new FileInputStream(file);
// 写入
FileOutputStream fos = new FileOutputStream(file);
```
#### 6. 处理异常:
```
try {
// 文件操作代码
} catch (IOException e) {
e.printStackTrace();
}
```
## 4.3 文件管理列表方法
### 文件基础操作
| 方法 | 描述 |
| --- | --- |
| exists() | 判断文件是否存在。 |
| canRead() | 判断文件是否可读。 |
| canWrite() | 判断文件是否可写。 |
| isFile() | 判断是否为文件。 |
| isDirectory() | 判断是否为目录。 |
| createNewFile() | 创建新文件。 |
| delete() | 删除文件或目录。 |
| mkdir() | 创建新目录。 |
| list() | 返回目录中的文件和目录的名称数组。 |
| listFiles() | 返回目录中的文件和目录的 File 对象数组。 |
| length() | 返回文件的长度(字节数)。 |
| lastModified() | 返回文件的最后修改时间。 |
### 字节流操作
| 方法 | 描述 |
| --- | --- |
| FileInputStream 类方法 | |
| read() | 从输入流中读取一个字节。 |
| read(byte\[\] b) | 从输入流中读取一定数量的字节到缓冲区。 |
| read(byte\[\] b, int off, int len) | 从输入流中读取指定数量的字节到缓冲区的指定位置。 |
| skip(long n) | 跳过输入流中的指定字节数。 |
| close() | 关闭输入流。 |
| FileOutputStream 类方法 | |
| write(int b) | 将一个字节写入输出流。 |
| write(byte\[\] b) | 将字节数组写入输出流。 |
| write(byte\[\] b, int off, int len) | 将字节数组的一部分写入输出流。 |
| flush() | 刷新输出流。 |
| close() | 关闭输出流。 |
### 缓冲流操作
| 方法 | 描述 |
| --- | --- |
| BufferedInputStream 类方法 | |
| read() | 从缓冲输入流中读取一个字节。 |
| read(byte\[\] b) | 从缓冲输入流中读取一定数量的字节到缓冲区。 |
| read(byte\[\] b, int off, int len) | 从缓冲输入流中读取指定数量的字节到缓冲区的指定位置。 |
| skip(long n) | 跳过缓冲输入流中的指定字节数。 |
| mark(int readlimit) | 在当前缓冲输入流位置设置标记。 |
| reset() | 将缓冲输入流位置重置为最近的标记。 |
| available() | 返回缓冲输入流中可用的字节数。 |
| close() | 关闭缓冲输入流。 |
| BufferedOutputStream 类方法 | |
| write(int b) | 将一个字节写入缓冲输出流。 |
| write(byte\[\] b) | 将字节数组写入缓冲输出流。 |
| write(byte\[\] b, int off, int len) | 将字节数组的一部分写入缓冲输出流。 |
| flush() | 刷新缓冲输出流。 |
| close() | 关闭缓冲输出流。 |
### 字符流操作
| 方法 | 描述 |
| --- | --- |
| FileReader 类方法 | |
| read() | 从输入流中读取一个字符。 |
| read(char\[\] cbuf) | 从输入流中读取一定数量的字符到字符数组。 |
| read(char\[\] cbuf, int off, int len) | 从输入流中读取指定数量的字符到字符数组的指定位置。 |
| skip(long n) | 跳过输入流中的指定字符数。 |
| close() | 关闭输入流。 |
| FileWriter 类方法 | write(int c) |
| write(char\[\] cbuf) | 将字符数组写入输出流。 |
| write(char\[\] cbuf, int off, int len) | 将字符数组的一部分写入输出流。 |
| write(String str) | 将字符串写入输出流。 |
| write(String str, int off, int len) | 将字符串的一部分写入输出流。 |
| flush() | 刷新输出流。 |
| close() | 关闭输出流。 |
### Java NIO 操作
| 方法 | 描述 |
| --- | --- |
| java.nio.file 包 | |
| Files 类方法 | |
| readAllBytes(Path path) | 读取文件的所有字节。 |
| readAllLines(Path path) | 读取文件的所有行。 |
| write(Path path, byte\[\] bytes, OpenOption... options) | 将字节数组写入文件。 |
| write(Path path, Iterable lines, Charset cs, OpenOption... options) | 将行写入文件。 |
| copy(Path source,Path target,CopyOption... options) | 将文件从源路径复制到目标路径。 |
| move(Path source, Path target, CopyOption... options) | 将文件从源路径移动到目标路径。 |
| delete(Path path, DeleteOption... options) | 删除指定路径的文件或目录。 |
| createDirectories(Path dir, FileAttribute... attrs) | 创建多层目录。 |
| createFile(Path path, FileAttribute... attrs) | 创建新文件。 |
| getAttribute(Path path, String attribute, LinkOption... options) | 获取指定文件属性。 |
| setAttribute(Path path,String attribute, Object value,LinkOption... options) | 设置指定文件属性。 |
| newInputStream(Path path,OpenOption... options) | 返回一个输入流以读取文件。 |
| newOutputStream(Path path, OpenOption... options) | 返回一个输出流以写入文件。 |
| newBufferedReader(Path path,Charset cs) | 返回一个缓冲字符输入流以读取文件。 |
| newBufferedWriter(Path path, Charset cs, OpenOption... options) | 返回一个缓冲字符输出流以写入文件。 |
- 系统设计
- 需求分析
- 概要设计
- 详细设计
- 逻辑模型设计
- 物理模型设计
- 产品设计
- 数据驱动产品设计
- 首页
- 逻辑理解
- 微服务架构的关系数据库优化
- Java基础架构
- 编程范式
- 面向对象编程【模拟现实】
- 泛型编程【参数化】
- 函数式编程
- 响应式编程【异步流】
- 并发编程【多线程】
- 面向切面编程【代码复用解耦】
- 声明式编程【注解和配置】
- 函数响应式编程
- 语法基础
- 包、接口、类、对象和切面案例代码
- Springboot按以下步骤面向切面设计程序
- 关键词
- 内部类、匿名类
- 数组、字符串、I/O
- 常用API
- 并发包
- XML
- Maven 包管理
- Pom.xml
- 技术框架
- SpringBoot
- 项目文件目录
- Vue
- Vue项目文件目录
- 远程组件
- 敏捷开发前端应用
- Pinia Store
- Vite
- Composition API
- uniapp
- 本地方法JNI
- 脚本机制
- 编译器API
- 注释
- 源码级注释
- Javadoc
- 安全
- Swing和图形化编程
- 国际化
- 精实或精益
- 精实软件数据库设计
- 精实的原理与方法
- 项目
- 零售软件
- 扩展
- 1001_docker 示例
- 1002_Docker 常用命令
- 1003_微服务
- 1004_微服务数据模型范式
- 1005_数据模型
- 1006_springCloud
- AI 流程图生成
- Wordpress_6
- Woocommerce_7
- WooCommerce常用的API和帮助函数
- WooCommerce的钩子和过滤器
- REST API
- 数据库API
- 模板系统
- 数据模型
- 1.Woo主题开发流程
- Filter
- Hook
- 可视编辑区域的函数工具
- 渲染字段函数
- 类库和框架
- TDD 通过测试来驱动开发
- 编程范式对WordPress开发
- WordPress和WooCommerce的核心代码类库组成
- 数据库修改
- 1.WP主题开发流程与时间规划
- moho
- Note 1
- 基础命令