Java文件系统操作与外部设备编程指南
立即解锁
发布时间: 2025-08-18 02:37:43 阅读量: 3 订阅数: 11 

# Java 文件系统操作与外部设备编程指南
## 1. 临时文件操作
在 Java 中,我们可以使用 `java.io.File` 对象的 `createTempFile()` 和 `deleteOnExit()` 方法来处理临时文件。`createTempFile()` 方法会创建一个具有唯一名称的文件,以防止在服务器上多个用户同时运行同一程序时产生冲突;`deleteOnExit()` 方法则会安排在程序退出时删除指定的文件。
以下是一个示例代码:
```java
import java.io.*;
/**
* Work with temporary files in Java.
*/
public class TempFiles {
public static void main(String[] argv) throws IOException {
// 1. Make an existing file temporary
// Construct a File object for the backup created by editing
// this source file. The file probably already exists.
// My editor creates backups by putting ~ at the end of the name.
File bkup = new File("Rename.java~");
// Arrange to have it deleted when the program ends.
bkup.deleteOnExit();
// 2. Create a new temporary file.
// Make a file object for foo.tmp, in the default temp directory
File tmp = File.createTempFile("foo", "tmp");
// Report on the filename that it made up for us.
System.out.println("Your temp file is " + tmp.getCanonicalPath());
// Arrange for it to be deleted at exit.
tmp.deleteOnExit();
// Now do something with the temporary file, without having to
// worry about deleting it later.
writeDataInTemp(tmp.getCanonicalPath());
}
public static void writeDataInTemp(String tempnam) {
// This version is dummy. Use your imagination.
}
}
```
需要注意的是,如果 Java 虚拟机异常终止,文件可能不会被删除,并且一旦设置了 `deleteOnExit()`,在程序退出前没有办法撤销该设置,除非采取一些极端措施,如关闭计算机。
## 2. 更改文件属性
若要更改文件除名称之外的属性,可以使用 `setReadOnly()` 或 `setLastModified()` 方法。
- `setReadOnly()`:将指定文件或目录设置为只读。如果操作成功,返回 `true`,否则返回 `false`。需要注意的是,没有对应的 `setReadWrite()` 方法,因此使用该方法时要谨慎。
- `setLastModified()`:允许更改文件的修改时间。该方法接受一个自 1970 年 1 月 1 日以来的毫秒数作为参数。可以通过 `getLastModified()` 方法获取文件的原始修改时间,也可以通过 `Date` 类的 `getTime()` 方法获取指定日期的毫秒数。操作成功返回 `true`,否则返回 `false`。
以下是一个测试 `setReadOnly()` 方法的示例代码:
```java
import java.io.*;
public class ReadOnly {
public static void main(String[] a) throws IOException {
File f = new File("f");
if (!f.createNewFile()) {
System.out.println("Can't create new file.");
return;
}
if (!f.canWrite()) {
System.out.println("Can't write new file!");
return;
}
if (!f.setReadOnly()) {
System.out.println("Grrr! Can't set file read-only.");
return;
}
if (f.canWrite()) {
System.out.println("Most immutable, captain!");
System.out.println("But it still says canWrite() after setReadOnly");
return;
} else {
System.out.println("Logical, captain!");
System.out.println
("canWrite() correctly returns false after setReadOnly");
}
}
}
```
运行该程序后,我们可以发现 `File` 对象的不可变性仅指其包含的路径名,而不是其只读属性。
## 3. 列出目录内容
若需要列出目录中的文件系统条目,可以使用 `java.io.File` 对象的 `list()` 或 `listFiles()` 方法。
- `list()`:返回一个包含目录中所有文件和目录名称的字符串数组。
- `listFiles()`:返回一个包含目录中所有文件和目录的 `File` 对象数组。
以下是一个简单的目录列表程序示例:
```java
/** Simple directory lister.
*/
public class Ls {
public static void main(String argh_my_aching_fingers[]) {
String[] dir = new java.io.File(".").list(); // Get list of names
java.util.Arrays.sort(dir); // Sort it (see Recipe 7.8)
for (int i=0; i<dir.length; i++)
System.out.println(dir[i]); // Print the list
}
}
```
此外,还可以使用 `list(FilenameFilter ff)` 方法进行更灵活的文件列表筛选。`FilenameFilter` 是一个只有一个方法 `boolean accept(File inDir, String fileName)` 的接口,通过实现该接口可以自定义筛选规则。
以下是一个筛选 Java 相关文件的示例代码:
```java
import java.io.*;
/**
* FNFilter - Ls directory lister modified to use FilenameFilter
*/
public class FNFilter {
public static void main(String argh_my_aching_fingers[]) {
// Generate the selective list, with a one-use File object.
String[] dir = new java.io.File(".").list(new OnlyJava());
java.util.Arrays.sort(dir); // Sort it (Data Structuring chapter))
for (int i=0; i<dir.length; i++)
System.out.println(dir[i]); // Print the list
}
}
/** This class implements the FilenameFilter interface.
* The Accept method only returns true for .java , .jar and .class files.
*/
class OnlyJava implements FilenameFilter {
public boolean accept(File dir, String s) {
if (s.endsWith(".java") || s.endsWith(".class") || s.endsWith(".jar"))
return true;
// others: projects, ... ?
return false;
}
}
```
## 4. 获取目录根
若想了解顶级目录,如 Windows 上的 `C:\` 和 `D:\`,可以使用 `File.listRoots()` 静态方法。该方法会返回一个包含可用文件系统根的 `File` 对象数组。
以下是一个列出目录根的示例代码:
```java
import java.io.*;
public class ListRoots {
public static void main(String argh_my_aching_fingers[]) {
File[] drives = File.listRoots(); // Get list of names
for (int i=0; i<drives.length; i++)
System.out.println(drives[i]); // Print the list
}
}
```
在 Windows 上运行该程序,可能会列出软盘驱动器、硬盘驱动器和 CD-ROM 驱动器;在 Unix 上,只会列出 `/`。需要注意的是,`File.listRoots()` 方法不会列出所谓的 UNC 文件名。
## 5. 创建新目录
若需要创建目录,可以使用 `java.io.File` 的 `mkdir()` 或 `mkdirs()` 方法。
- `mkdir()`:仅创建一个目录。
- `mkdirs()`:创建所需的任何父目录。
以下是示例代码:
```java
new File("/home/ian/bin").mkdir();
new File("/home/ian/src").mkdir();
new File("/home/ian/once/twice/again").mkdirs();
```
这两个方法在操作成功时返回 `true`,失败时返回 `false`。需要注意的是,`mkdir()` 的拼写是全小写,这是底层操作系统调用和命令的名称。
## 6. 文件查找程序
以下是一个实现了 Windows 查找文件对话框或 Unix `find` 命令部分功能的程序:
```java
import com.darwinsys.util.*;
import java.io.*;
import java.io.*;
/**
* Find - find files by name, size, or other criteria. Non-GUI version.
*/
public class Find {
/** Main program */
public static void main(String[] args) {
Find finder = new Find();
GetOpt argHandler = new GetOpt("n:s:");
int c;
while ((c = argHandler.getopt(args)) != GetOpt.DONE) {
switch(c) {
case 'n': finder.filter.setNameFilter(argHandler.optarg()); break;
case 's': finder.filter.setSizeFilter(argHandler.optarg()); break;
default:
System.out.println("Got: " + c);
usage();
```
0
0
复制全文
相关推荐









