Java文件处理全解析
立即解锁
发布时间: 2025-08-17 02:29:08 阅读量: 3 订阅数: 12 


Java网络编程与文件处理入门
### Java文件处理全解析
#### 1. 文件逻辑结构
在Java中,文件本身并没有预设的结构,程序员需要自行对文件施加所需的逻辑结构。文件中的“记录”并非由Java或操作系统决定的物理单元,而是由程序员设置和维护的逻辑单元。
例如,若要创建一个存储客户账户详细信息的文件,每个逻辑记录可能包含以下内容:
- 账户号码
- 客户姓名
- 账户余额
程序员有责任确保文件中的每个逻辑记录恰好包含这三个字段,并且它们按照指定的顺序出现。
#### 2. 文件方法
`File`类拥有大量方法,以下是一些最重要的方法:
| 方法 | 描述 |
| --- | --- |
| `boolean canRead()` | 如果文件可读则返回`true`,否则返回`false` |
| `boolean canWrite()` | 如果文件可写则返回`true`,否则返回`false` |
| `boolean delete()` | 删除文件,成功返回`true`,失败返回`false` |
| `boolean exists()` | 如果文件存在则返回`true`,否则返回`false` |
| `String getName()` | 返回文件的名称 |
| `boolean isDirectory()` | 如果对象是目录/文件夹则返回`true`,否则返回`false` |
| `boolean isFile()` | 如果对象是文件则返回`true`,否则返回`false` |
| `long length()` | 返回文件的字节长度 |
| `String[] list()` | 如果对象是目录,返回包含目录内文件名的数组 |
| `File[] listFiles()` | 与`list()`方法类似,但返回`File`对象的数组 |
| `boolean mkdir()` | 创建以当前`File`对象命名的目录,返回值表示成功或失败 |
以下是一个示例代码,展示了如何使用这些方法:
```java
import java.io.*;
import java.util.*;
public class FileMethods {
public static void main(String[] args) throws IOException {
String filename;
Scanner input = new Scanner(System.in);
System.out.print("Enter name of file/directory ");
System.out.print("or press <Enter> to quit: ");
filename = input.nextLine();
while (!filename.equals("")) {
File fileDir = new File(filename);
if (!fileDir.exists()) {
System.out.println(filename + " does not exist!");
break;
}
System.out.print(filename + " is a ");
if (fileDir.isFile()) {
System.out.println("file.");
} else {
System.out.println("directory.");
}
System.out.print("It is ");
if (!fileDir.canRead()) {
System.out.print("not ");
}
System.out.println("readable.");
System.out.print("It is ");
if (!fileDir.canWrite()) {
System.out.print("not ");
}
System.out.println("writeable.");
if (fileDir.isDirectory()) {
System.out.println("Contents:");
String[] fileList = fileDir.list();
for (int i = 0; i < fileList.length; i++) {
System.out.println(" " + fileList[i]);
}
} else {
System.out.print("Size of file: ");
System.out.println(fileDir.length() + " bytes.");
}
System.out.print("\n\nEnter name of next file/directory ");
System.out.print("or press <Enter> to quit: ");
filename = input.nextLine();
}
input.close();
}
}
```
该程序会提示用户输入文件或目录的名称,然后输出该文件或目录的相关属性,如是否存在、是否可读可写、是文件还是目录等。如果是目录,还会列出目录内的文件列表;如果是文件,则会显示文件的大小。
#### 3. 输入输出重定向
默认情况下,标准输入流`System.in`与键盘关联,标准输出流`System.out`与VDU(视频显示单元)关联。如果希望输入来自其他源(如文本文件)或输出到其他地方(而非VDU屏幕),可以进行输入/输出重定向。
在调试需要用户输入多个数据项的程序时,重定向非常有用。可以使用文本编辑器或文字处理器创建一个文本文件,将所需的数据项逐行存储在文件中,然后将输入重定向到该文本文件,避免每次运行程序时都重新输入数据,节省时间并减少错误。
使用`<`指定新的输入源,使用`>`指定新的输出目标。示例如下:
- `java ReadData < payroll.txt`:程序`ReadData(.class)`正常执行,但当遇到文件输入语句(如`Scanner`方法`next`、`nextLine`、`nextInt`等)时,将从文件`payroll.txt`中获取下一个可用的数据项。
- `java WriteData > results.txt`:程序`WriteData(.class)`将所有`print`和`println`语句的输出定向到文件`results.txt`。
也可以在同一个程序中同时进行输入和输出重定向,例如:
```plaintext
java ProcessData < readings.txt > results.txt
```
对于程序`ProcessData(.class)`,所有文件输入语句将从文件`readings.txt`中读取数据,而所有`print`和`println`语句将把输出发送到文件`results.txt`。
#### 4. 命令行参数
在命令窗口中输入`java`命令时,可以在程序名称之外提供额外的值,这些值称为命令行参数,程序可以使用这些值。这些值以字符串数组的形式传递给`main`方法。
假设一个名为`Copy.class`的Java程序用于将一个文件的内容复制到另一个文件。可以让用户通过命令行参数指定两个文件的名称,而不是在程序中提示用户输入:
```plaintext
java Copy source.dat dest.dat
```
以下是`Copy`类的代码:
```java
import java.io.*;
import java.util.*;
public class Copy {
public static void main(String[] arg) throws IOException {
if (arg.length < 2) {
System.out.println("You must supply TWO file names.");
System.out.println("Syntax:");
System.out.println(" java Copy <source> <destination>");
return;
}
Scanner source = new Scanner(new File(arg[0]));
PrintWriter destination = new PrintWriter(new File(arg[1]));
String input;
while (source.hasNext()) {
input = source.nextLine();
destination.println(input);
}
source.close();
destination.close();
}
}
```
该程序首先检查是否提供了两个文件名,如果没有,则输出错误信息并退出。然后,它从源文件中逐行读取数据,并将其写入目标文件。
#### 5. 随机访问文件
串行访问文件处理简单,在小规模应用或大规模应用的临时存储中广泛使用,但存在两个明显的缺点:
- 无法直接访问特定记录,要访问某个特定记录,必须物理地读取前面的所有记录,对于包含数
0
0
复制全文
相关推荐










