Java文件操作与流处理全解析
立即解锁
发布时间: 2025-08-21 00:56:29 阅读量: 2 订阅数: 12 


Java编程艺术:从初学者到大师的进阶指南
### Java文件操作与流处理全解析
#### 1. 使用File类
File类代表文件或路径的名称,用于操作文件元数据信息,如文件名、目录列表、文件长度、文件是否为目录或普通文件、文件是否可读、可写等。在进行I/O操作时,并非必须使用File对象来创建文件,因为所有文件终端类构造函数既可以接受String类型的参数,也可以接受File类型的参数。但有时需要用到File类提供的功能,所以理解其操作很重要。
以下是一个创建File对象并调用其部分方法的示例代码:
```java
import java.io.*;
public class FileClassTesterApp {
public static void main(String[] args){
File file = null;
try{
file = new File(args[0]);
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
System.out.println(file.isDirectory());
}catch(Exception ignored){ }
}
}
```
这个程序会获取命令行输入的文本字符串,并创建一个同名的File对象。需要注意的是,虽然创建了File对象,但实际文件并未被创建。可以通过调用`createNewFile()`方法使用File对象创建文件,但这样创建的文件为空。
另外,还可以结合`JFileChooser` Swing组件来打开或创建新的File对象,示例代码如下:
```java
import javax.swing.*;
import java.io.*;
public class JFileChooserTestApp {
public static void main(String[] args){
int chooser_action;
File file;
JFileChooser file_chooser = new JFileChooser();
chooser_action = file_chooser.showOpenDialog(new JFrame());
if(chooser_action == JFileChooser.APPROVE_OPTION){
file = file_chooser.getSelectedFile();
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.length());
System.exit(0);
}else{
System.exit(0);
}
}
}
```
该程序运行时会弹出`JFileChooser`对话框,允许用户选择现有文件或创建新文件。选择文件后,会输出文件的相关信息。
#### 2. 使用输入输出流进行顺序字节流文件I/O
`InputStreams`和`OutputStreams`用于执行顺序字节导向的I/O操作。由于`InputStream`和`OutputStream`类是抽象类,因此必须使用它们的一个或多个子类,单独或组合使用,来执行文件I/O操作。使用这些流进行文件I/O操作时,数据是按顺序读写的,不能像使用`RandomAccessFile`类那样在文件中随意移动。
##### 2.1 输出流(OutputStreams)
以下几种输出流类可用于将字节流、基本类型、对象和文本写入磁盘:
- **FileOutputStream**:可用于向文件执行顺序字节输出。除了五个重载构造函数外,它还提供了三个重载版本的`write()`方法,可用于将单个字节、字节数组或字节数组的一部分写入文件。完成数据写入后,应调用`close()`方法关闭文件。示例代码如下:
```java
import java.io.*;
public class FOS_TesterApp {
public static void main(String[] args){
FileOutputStream fos;
File file;
try{
fos = new FileOutputStream("Test.txt", true);
if(args.length != 0){
fos.write(args[0].getBytes());
}else{
fos.write(("Ohhhh do you love Java like I love Java?").getBytes());
}
fos.close();
file = new File("test.txt");
System.out.println("The length of the file Text.txt in bytes is: " + file.length());
}catch(Exception ignored){ }
}
}
```
该程序会将命令行输入的文本(最多到第一个空格)写入磁盘。如果命令行未输入文本,则写入指定的短语。若多次运行该程序且不删除文件,新文本将追加到文件末尾。若要覆盖文件,可在构造函数中传入`false`或使用`FileOutputStream(String name)`版本的构造函数。
- **BufferedOutputStream**:使用`FileOutputStream`进行文件输出时,每次调用`write()`方法都会进行磁盘写入。在需要大量磁盘写入的情况下,可使用`BufferedOutputStream`类提高程序的I/O效率。该类将数据写入存储在内部内存数组(缓冲区)中,当缓冲区填满或调用`flush()`方法时,数据才会实际写入磁盘。示例代码如下:
```java
import java.io.*;
public class BOS_TesterApp {
public static void main(String[] args){
FileOutputStream fos;
BufferedOutputStream bos;
File file;
try{
file = new File("test.txt");
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
while(file.length() == 0){
if(args.length != 0){
bos.write(args[0].getBytes());
}else{
bos.write(("Ohhhh do you love Java like I love Java?").getBytes());
}
System.out.println("The length of the file Text.txt in bytes is: " + file.length());
}
fos.close();
}catch(Exception ignored){ }
}
}
```
该程序会不断向`BufferedOutputStream`缓冲区写入数据,直到缓冲区填满并将内容一次性写入磁盘。`BufferedOutputStream`对象的默认缓冲区大小为512字节,可通过构造函数设置内部缓冲区大小。
- **DataOutputStream**:用于将字节流以及基本类型的字节值写入文件。若与`FileOutputStream`对象配合使用,它不提供缓冲功能,每次写入都会立即写入磁盘。若需要写入缓冲功能,可与`BufferedOutputStream`对象结合使用。示例代码如下:
```java
import java.io.*;
public class DOS_TesterApp {
public static void main(String[] args){
FileOutputStream fos;
BufferedOutputStream bos;
DataOutputStream dos;
```
0
0
复制全文
相关推荐










