上一篇:异常
File类
1904 2018-04-07 2020-06-25
前言:Java提供的File类不仅支持文件管理,还支持其他语言所不支持的目录管理。
一、构造方法
File类有几个构造方法,我们一个个看。
1、 File(String pathname)
构造方法代码如下
private static final FileSystem fs = DefaultFileSystem.getFileSystem();
public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
// 修正路径字符,使之符合当前系统的标准,如windows中的分隔符为\,会替代字符串中的/
this.path = fs.normalize(pathname);
// 获取抽象路径的前缀,为FileSystem类所用
this.prefixLength = fs.prefixLength(this.path);
}
class DefaultFileSystem {
/**
* Return the FileSystem object for Windows platform.
*/
public static FileSystem getFileSystem() {
return new WinNTFileSystem();
}
}
2、父目录+子文件
- File(String parent, String child)
- File(File parent, String child)
public File(String parent, String child) {
if (child == null) {
throw new NullPointerException();
}
if (parent != null) {
if (parent.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(),
fs.normalize(child));
} else {
this.path = fs.resolve(fs.normalize(parent),
fs.normalize(child));
}
} else {
this.path = fs.normalize(child);
}
this.prefixLength = fs.prefixLength(this.path);
}
public File(File parent, String child) {
if (child == null) {
throw new NullPointerException();
}
if (parent != null) {
if (parent.path.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(),
fs.normalize(child));
} else {
this.path = fs.resolve(parent.path,
fs.normalize(child));
}
} else {
this.path = fs.normalize(child);
}
this.prefixLength = fs.prefixLength(this.path);
}
3、File(URI uri)
public File(URI uri) {
// Check our many preconditions
if (!uri.isAbsolute())
throw new IllegalArgumentException("URI is not absolute");
if (uri.isOpaque())
throw new IllegalArgumentException("URI is not hierarchical");
String scheme = uri.getScheme();
if ((scheme == null) || !scheme.equalsIgnoreCase("file"))
throw new IllegalArgumentException("URI scheme is not \"file\"");
if (uri.getAuthority() != null)
throw new IllegalArgumentException("URI has an authority component");
if (uri.getFragment() != null)
throw new IllegalArgumentException("URI has a fragment component");
if (uri.getQuery() != null)
throw new IllegalArgumentException("URI has a query component");
String p = uri.getPath();
if (p.equals(""))
throw new IllegalArgumentException("URI path component is empty");
// Okay, now initialize
p = fs.fromURIPath(p);
if (File.separatorChar != '/')
p = p.replace('/', File.separatorChar);
this.path = fs.normalize(p);
this.prefixLength = fs.prefixLength(this.path);
}
二、构造方法的使用
代码如下
public static void main(String[] args) throws IOException, URISyntaxException {
File file = new File("html/file.txt");// 在相对路径下
printFile(file);
System.out.println("是否成功创建文件:" + file.createNewFile());
// 文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
// 是否成功创建文件:false
File file1 = new File("\\html\\file.txt");//在根目录下,需要注意两者之间的区别
printFile(file1);
// 文件:file.txt , 是否存在:false ,绝对路径:D:\html\file.txt
File file2 = new File("html", "file.txt");
printFile(file2);
File file3 = new File(new File("html"), "file.txt");
printFile(file3);
// 文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
// 文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
File file4 = new File("html/file.txt");
File file5 = new File("/html/file.txt");
System.out.println(file4.toURI());
System.out.println(file5.toURI());
File file44 = new File(file4.toURI());
File file55 = new File(file5.toURI());
printFile(file44);
printFile(file55);
// 输出结果
// file:/D:/IDEA_WORKSPACE/xiaokui/html/file.txt
// file:/D:/html/file.txt
// 文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
// 文件:file.txt , 是否存在:false ,绝对路径:D:\html\file.txt
}
private static void printFile(File file) {
System.out.println("文件:" + file.getName() + " , 是否存在:" + file.exists() + " ,绝对路径:" + file.getAbsolutePath());
}
三、常用方法
1、创建文件
如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false。不能创建文件夹。
public boolean createNewFile() throws IOException {
SecurityManager security = System.getSecurityManager();
if (security != null) security.checkWrite(path);
if (isInvalid()) {
throw new IOException("Invalid file path");
}
return fs.createFileExclusively(path);
}
2、创建文件夹
- 创建此抽象路径名指定的目录。
- 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
public boolean mkdir() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(path);
}
if (isInvalid()) {
return false;
}
return fs.createDirectory(this);
}
public boolean mkdirs() {
if (exists()) {
return false;
}
if (mkdir()) {
return true;
}
File canonFile = null;
try {
canonFile = getCanonicalFile();
} catch (IOException e) {
return false;
}
File parent = canonFile.getParentFile();
return (parent != null && (parent.mkdirs() || parent.exists()) &&
canonFile.mkdir());
}
3、删除文件或文件夹
- 删除此抽象路径名表示的文件或目录。
- 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
public boolean delete() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkDelete(path);
}
if (isInvalid()) {
return false;
}
return fs.delete(this);
}
public void deleteOnExit() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkDelete(path);
}
if (isInvalid()) {
return;
}
DeleteOnExitHook.add(path);
}
4、遍历文件夹
- 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
- 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
public String[] list() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
if (isInvalid()) {
return null;
}
return fs.list(this);
}
public File[] listFiles() {
String[] ss = list();
if (ss == null) return null;
int n = ss.length;
File[] fs = new File[n];
for (int i = 0; i < n; i++) {
fs[i] = new File(ss[i], this);
}
return fs;
}
5、查看文件大小
此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在或为文件夹,则返回 0L
public long length() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
if (isInvalid()) {
return 0L;
}
return fs.getLength(this);
}
四、实用方法
1、创建临时文件
- 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
- 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
public static File createTempFile(String prefix, String suffix)
throws IOException
{
return createTempFile(prefix, suffix, null);
}
public static File createTempFile(String prefix, String suffix,
File directory)
throws IOException
{
if (prefix.length() < 3)
throw new IllegalArgumentException("Prefix string too short");
if (suffix == null)
suffix = ".tmp";
File tmpdir = (directory != null) ? directory
: TempDirectory.location();
SecurityManager sm = System.getSecurityManager();
File f;
do {
f = TempDirectory.generateFile(prefix, suffix, tmpdir);
if (sm != null) {
try {
sm.checkWrite(f.getPath());
} catch (SecurityException se) {
// don't reveal temporary directory location
if (directory == null)
throw new SecurityException("Unable to create temporary file");
throw se;
}
}
} while ((fs.getBooleanAttributes(f) & FileSystem.BA_EXISTS) != 0);
if (!fs.createFileExclusively(f.getPath()))
throw new IOException("Unable to create temporary file");
return f;
}
测试代码如下
private static void testTemp() throws IOException {
File file = File.createTempFile("test2", ".txt", null);
printFile(file);
file.deleteOnExit();// 相对应的,退出时删除文件(一般针对临时文件)
printFile(file);
// 文件:test28224588838175085107.txt , 是否存在:true ,绝对路径:C:\Users\MAIBEN~1\AppData\Local\Temp\test28224588838175085107.txt
// 文件:test28224588838175085107.txt , 是否存在:true ,绝对路径:C:\Users\MAIBEN~1\AppData\Local\Temp\test28224588838175085107.txt
}
private static void printFile(File file) {
System.out.println("文件:" + file.getName() + " , 是否存在:" + file.exists() + " ,绝对路径:" + file.getAbsolutePath());
}
2、重命名(移动)
重新命名此抽象路径名表示的文件。
public boolean renameTo(File dest) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(path);
security.checkWrite(dest.path);
}
if (dest == null) {
throw new NullPointerException();
}
if (this.isInvalid() || dest.isInvalid()) {
return false;
}
return fs.rename(this, dest);
}
测试代码如下
private static void rename() throws IOException {
// 同目录下重命名
File file = new File("html/file.txt");
file.createNewFile();
File file1 = new File("html/file-copy.txt");
renameFile(file, file1);
// 不同目录下重命名,等同于移动
File file2 = new File("html/html/file-copy-copy.txt");
renameFile(file1, file2);
file2.deleteOnExit();
}
private static void renameFile(File file, File file1) {
printFile(file);
printFile(file1);
System.out.println("重命名成功?" + file.renameTo(file1));
printFile(file);
printFile(file1);
}
输出结果如下
文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
文件:file-copy.txt , 是否存在:false ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file-copy.txt
重命名成功?true
文件:file.txt , 是否存在:false ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
文件:file-copy.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file-copy.txt
文件:file-copy.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file-copy.txt
文件:file-copy-copy.txt , 是否存在:false ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\html\file-copy-copy.txt
重命名成功?true
文件:file-copy.txt , 是否存在:false ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file-copy.txt
文件:file-copy-copy.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\html\file-copy-copy.txt
3、分区信息
- 分区的大小,以字节为单位;如果此抽象路径名没有指定分区,则返回 0L。
- 返回此抽象路径名指定的分区中未分配的字节数。
public long getTotalSpace() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("getFileSystemAttributes"));
sm.checkRead(path);
}
if (isInvalid()) {
return 0L;
}
return fs.getSpace(this, FileSystem.SPACE_TOTAL);
}
public long getFreeSpace() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("getFileSystemAttributes"));
sm.checkRead(path);
}
if (isInvalid()) {
return 0L;
}
return fs.getSpace(this, FileSystem.SPACE_FREE);
}
System.out.println(file2.getTotalSpace() / 1024 / 1024 / 1024);// 自动转型为int
System.out.println(file2.getFreeSpace() / 1024f / 1024 / 1024);// 转型为float
总访问次数: 258次, 一般般帅 创建于 2018-04-07, 最后更新于 2020-06-25
欢迎关注微信公众号,第一时间掌握最新动态!