Java文件操作(File类的使用)
阿超 发表于 2009-08-21 15:33 | 来源: | 阅读 415 次
文件和目录路径名的抽象表示形式。
- 用户界面和操作系统使用与系统相关的路径名字符串来命名文件和目录。此类呈现分层路径名的一个抽象的、与系统无关的视图。抽象路径名有两个组件:
- 一个可选的与系统有关的前缀字符串,比如盘符,"/" 表示 UNIX 中的根目录,"\\\\" 表示 Microsoft Windows UNC 路径名,以及零个或更多字符串名称的序列。
除了最后一个,抽象路径名中的每个名称代表一个目录;最后一个名称既可以代表目录,也可以代表文件。空的抽象路径名没有前缀和名称序列。
路径名字符串与抽象路径名之间的转换与系统有关。将抽象路径名转换为路径名字符串时,每个名称与下一个名称之间由单个默认分隔符字符 隔开。默认名称分隔符由系统属性 file.separator 定义,也可以从此类的公共静态字段 separator 和 separatorChar 中得到。将路径名字符串转换为抽象路径名时,可以使用默认名称分隔符或者受基础系统支持的其他任何名称分隔符来分隔其中的名称。
无论是抽象路径名还是字符串路径名,都可以是绝对 路径名或相对 路径名。绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。
前缀的概念用于处理 UNIX 平台的根目录,以及 Microsoft Windows 平台上的盘符、根目录和 UNC 路径名,如下所示:
- 对于 UNIX 平台,绝对路径名的前缀始终是 "/"。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 "/" 并且没有名称序列。
- 对于 Microsoft Windows 平台,包含盘符的路径名的前缀由驱动器名和一个 ":" 组成:如果路径名是绝对路径名,后面可能跟着 "\\"。UNC 路径名的前缀是 "\\\\";主机名和共享名是名称序列中的前两个名称。没有指定驱动器的相对路径名无前缀。
File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
构造方法
- File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
- File(String pathname) 通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
- File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
- File(URI uri) 通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
下面举例说明:
(请预先建立文件WriteFile.txt,程序运行后将会在同目录下生成backup目录,里面为copy的文件,包放在biz.1cn.stream里面)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class UpdateFile {
public static void main(String[] args) throws IOException {
// 待复制的文件名
String fileName = "WriteFile.txt";
// 子目录名
String childDir = "backup";
new UpdateFile().update(fileName, childDir);
}
public void update(String fileName, String childDir) throws IOException {
File f1, f2, child;
// 在fileName和childDir当前目录中分别创建文件对象
f1 = new File(fileName);
child = new File(childDir);
if (fexists()) {
if (!child.exists())
child.mkdir();
// 在子目录childDir中创建文件对象
f2 = new File(child, fileName);
if (!fexists() || fexists()
&& (flastModified() > flastModified()))
copy(f1, f2);
getInfo(f1);
getInfo(child);
} else
System.out.println(fgetName() + " file not found!");
}
/**
* 复制文件f1至f2
*
* @param f1
* 源文件
* @param f2
* 目标文件
* @throws IOException
*/
public void copy(File f1, File f2) throws IOException {
// 创建文件输入输出流对象
FileInputStream is = new FileInputStream(f1);
FileOutputStream os = new FileOutputStream(f2);
// 设定读取的字节数
int count, n = 512;
byte buffer[] = new byte[n];
// 读取输入流
count = is.read(buffer, 0, n);
while (count != -1) {
os.write(buffer, 0, count);
count = is.read(buffer, 0, n);
}
// 关闭输入输出流
is.close();
os.close();
}
/**
* 取得文件或文件夹信息:路径、修改时间
*
* @param file
* @throws IOException
*/
public static void getInfo(File file) throws IOException {
// 初始化时间格式
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
if (file.isFile())
// 返回抽象路径名的绝对路径、文件长度、最后修改时间
System.out.println("\t"
+ file.getAbsolutePath() + "\t"
+ sdf.format(new Date(file.lastModified())));
else {
System.out.println("\t" + file.getAbsolutePath());
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++)
getInfo(files[i]);
}
}
}

