Java文件类– java.io.File

时间:2020-02-23 14:36:33  来源:igfitidea点击:

Java File类是Java IO操作的中心。

Java文件类

  • Java File类是java.io包的一部分。

  • Java File类是文件和目录路径名的抽象表示。

  • 操作系统使用与系统有关的路径名来表示文件和目录,但是java File类提供了抽象的,与系统无关的路径名视图。
    路径名到抽象路径名或者从抽象路径名的转换本质上取决于系统。

  • 抽象路径名的父类可以通过调用File类的getParent()方法来获取。

Java文件构造函数

我们可以使用以下构造函数创建File类的实例。

  • File(File(parent,String,child)):使用此构造函数,我们可以从指定的父抽象路径名和子路径名字符串创建File类的实例。

  • File(String pathname):使用此构造函数,我们可以通过将指定的字符串路径名转换为抽象路径名来创建File类的实例。

  • File(String parent,String child):使用此文件构造函数,我们可以从指定的父级和子级路径名创建File类的实例。

  • File(URI uri):我们可以通过将指定的URI转换为抽象路径名来创建File类的实例。

让我们看一下下面的程序,展示创建java.io.File实例的不同方法。

package com.theitroad.examples;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * Java File Constructor Example
 * 
 * @author hyman
 *
 */
public class FileConstructor {

	public static void main(String[] args) {
		//First
		File file = new File("D:/hyman/data/file.txt");
		
		//Second
		File parent = new File("D:/hyman/");
		File file2 = new File(parent, "data2/file2.txt");
		
		//Third
		File file3 = new File("D:/hyman/", "data3/file3.txt");
		
		System.out.println("First : "+file.getAbsolutePath());
		System.out.println("Second : "+file2.getAbsolutePath());
		System.out.println("Third : "+file3.getAbsolutePath());
		
		//Forth
		URI uri;
		try {
			uri = new URI("file:///D:/hyman/data4/file4.txt");
			File file4 = new File(uri);
			System.out.println("Forth : "+file4.getAbsolutePath());
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
	}
}

上面程序的输出是:

First : D:\hyman\data\file.txt
Second : D:\hyman\data2\file2.txt
Third : D:\hyman\data3\file3.txt
Forth : D:\hyman\data4\file4.txt

Java文件方法

让我们看一下File类的以下方法。

  • canExecute():此方法测试应用程序是否可以执行此抽象路径名表示的文件,并返回true或者false。

  • canRead():此方法测试应用程序是否可以读取此抽象路径名表示的文件并返回true或者false。

  • canWrite():此方法测试应用程序是否可以修改此抽象路径名表示的文件并返回true或者false。

  • compareTO(File pathname):此方法按字典顺序比较两个抽象路径名,并返回整数值。

  • createNewFile():仅当不存在具有该抽象路径名的文件且该文件名返回true或者false时,此方法才会自动创建一个新的空文件。

  • createTempFile(String prefix,String suffix):这是一个静态方法,它使用指定的前缀和后缀字符串在默认的临时文件目录中创建一个空文件,以生成文件名并返回文件对象。

  • createTempFile(String prefix,String suffix,File directory):这是一个静态方法,它使用指定的前缀和后缀字符串在指定目录中创建一个空文件,以生成文件名并返回文件对象。

  • delete():此方法删除此抽象路径名表示的文件或者目录,并返回true或者false。

  • deleteOnExit():该方法要求在虚拟机终止且此方法为void方法时,删除由该抽象路径名表示的文件或者目录。

  • exists():此方法检查此抽象路径名表示的文件或者目录是否存在,并根据其返回true或者false。

  • getAbsoluteFile():此方法返回此抽象路径名的绝对形式。

  • getAbsolutePath():此方法返回此抽象路径名的绝对路径名字符串。

  • getCanonicalFile():此方法返回此抽象路径名的规范形式。

  • getCanonicalPath():此方法返回此抽象路径名的规范路径名字符串。

  • getName():此方法返回此抽象路径名表示的文件或者目录的名称。

  • isDirectory():此方法检查此抽象路径名表示的文件是否为目录,并以此为基础返回true或者false。

  • isFile():此方法检查此抽象路径名表示的文件是否为普通文件,并以此为基础返回true或者false。

  • isHidden():此方法检查此抽象路径名表示的文件是否为隐藏文件,并以此为基础返回true或者false。

  • list():此方法返回一个字符串数组,其中包含此抽象路径名表示的目录中文件或者目录的命名。

  • listFiles():此方法返回一个抽象路径名数组,该数组表示此抽象路径名表示的目录中的文件。

  • mkdir():此方法创建此抽象路径名命名的目录,并返回true或者false。

  • renameTo(File dest):此方法重命名此抽象路径名表示的文件,并返回true或者false。

  • setReadable(boolean可读):此方法设置所有者对该抽象路径名的读取权限,并返回true或者false。

  • setReadable(boolean可读,boolean ownerOnly):此方法设置此抽象路径名的所有者或者所有人的读取许可权,并返回true或者false。

  • setReadOnly():此方法标记此抽象路径名所命名的文件或者目录,以便仅允许读操作,并且返回true或者false。

  • setWritable(boolean writable):此方法为此抽象路径名设置所有者的写许可权,并返回true或者false。

现在来看一些Java文件处理操作。

建立新档案

Java File类提供了一种createNewFile()方法,当且仅当不存在具有该抽象路径名的文件时,该方法才会自动创建由该抽象路径名命名的新的空文件。

如果创建了新文件,则此方法返回" true",如果文件已存在,则返回" false",并且在无法创建文件时抛出" java.io.IOException"。

让我们看一下下面的程序来创建一个新文件。

package com.theitroad.examples;

import java.io.File;
import java.io.IOException;

/**
 * Java Create File Program
 * 
 * @author hyman
 *
 */
public class FileCreateExample {

	public static void main(String[] args) {
		//initialize File constructor
		File file = new File("D:/data/file.txt");
		try {
			boolean createFile = file.createNewFile();
			if (createFile) {
				System.out.println("New File is created.");
			}else {
				System.out.println("File already exists.");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

查看这篇文章,以获取有关使用Java创建新文件的更多信息。

创建临时文件

Java File类提供了静态的createTempFile()方法来创建临时文件,该方法具有两个变体-createTempFile(String prefix,String suffix)和createTempFile(String prefix,String suffix,File directory)。

package com.theitroad.examples;

import java.io.File;
import java.io.IOException;

/**
 * Java Create Temporary File Program
 * 
 * @author hyman
 *
 */
public class CreateTempFileExample {

	public static void main(String[] args) {

		try {
			File tempFile = File.createTempFile("tempFile", ".tmp");
			System.out.println("Temp File Path : "+tempFile.getAbsolutePath());
			
			File directory = new File("D:/data");
			File tempFile1 = File.createTempFile("tempFile", ".tmp", directory);
			System.out.println("Temp File Path : "+tempFile1.getAbsolutePath());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

上面程序的输出如下:

Temp File Path : C:\Users\hyman\AppData\Local\Temp\tempFile4343440774354944188.tmp
Temp File Path : D:\data\tempFile908226099795027557.tmp

检查文件权限

Java File类提供了几种检查文件权限的方法(执行/读取/写入)– canExecute(),canRead()和canWrite()。

package com.theitroad.examples;

import java.io.File;

/**
 * Java Check File Permission Program
 * 
 * @author hyman
 *
 */
public class FilePermissionExample {

	public static void main(String[] args) {
		
		//initialize File constructor
		File file = new File("D:/data/file.txt");
		System.out.println("File is readable? "+file.canRead());
      System.out.println("File is writable? "+file.canWrite());
      System.out.println("File is executable? "+file.canExecute());
	}

}

检查此帖子以获取有关Java文件权限的更多信息。

检查文件是否已经存在?

Java File类提供了exists()方法,用于检查文件或者目录是否存在。

如果文件或者目录存在,则此方法返回true,否则返回false。

package com.theitroad.examples;

import java.io.File;

/**
 * Java Check for File Exists Program
 * 
 * @author hyman
 *
 */
public class CheckForFileExistExample {

	public static void main(String[] args) {

		//initialize File constructor
		File file = new File("D:/data/file.txt");
		System.out.println("File Exists : "+file.exists());
		
		File nonExistfile = new File("D:/data/nofile.txt");
		System.out.println("File Exists : "+nonExistfile.exists());

	}

}

如何检查文件是否为目录?

Java File类提供了" isDirectory()"方法,该方法检查文件是否为目录。
如果是目录,它将返回true,否则返回false。

package com.theitroad.examples;

import java.io.File;

/**
 * Java Check if File is Directory Program
 * 
 * @author hyman
 *
 */
public class CheckFileIsDirectoryExample {

	public static void main(String[] args) {

		//initialize File constructor
		File file = new File("D:/data/");
		System.out.println("IS Directory? : "+file.isDirectory());
		
		File file2 = new File("D:/data/file.txt");
		System.out.println("IS Directory? : "+file2.isDirectory());
	}

}

上面程序的输出如下:

IS Directory? : true
IS Directory? : false

文件路径分隔符

Java File类包含四个用于路径分隔符的静态分隔符变量:

  • pathSeparator:这是系统相关的路径分隔符,用字符串表示。

  • pathSeparatorChar:这是系统相关的路径分隔符。

  • separator:这是一个取决于系统的默认名称分隔符,用字符串表示。

  • separatorChar:这是系统相关的默认名称分隔符。

package com.theitroad.examples;

import java.io.File;

/**
 * Java File separator Program
 * 
 * @author hyman
 *
 */
public class FileSeparatorExample {

	public static void main(String[] args) {
		System.out.println("separator = "+File.separator);
      System.out.println("separatorChar = "+File.separatorChar);
      System.out.println("pathSeparator = "+File.pathSeparator);
      System.out.println("pathSeparatorChar = "+File.pathSeparatorChar);
	}
}

上述程序在Windows系统上的输出:

separator = \
separatorChar = \
pathSeparator = ;
pathSeparatorChar = ;

Java文件的绝对路径和规范路径

Java File类提供了两种获取绝对路径和规范路径的方法-getAbsolutePath()和getCanonicalPath()。
下面的示例代码将清除它们之间区别的所有混淆。

package com.theitroad.examples;

import java.io.File;
import java.io.IOException;

public class AbsoluteAndCanonicalPathExample {

	public static void main(String[] args) throws IOException {
		File file = new File("/Users/hyman/source.txt");
		File file1 = new File("/Users/hyman/temp/../source.txt");
		
		System.out.println("Absolute Path : " + file.getAbsolutePath());
		System.out.println("Canonical Path : " + file.getCanonicalPath());

		System.out.println("Absolute Path : " + file1.getAbsolutePath());
		System.out.println("Canonical Path : " + file1.getCanonicalPath());

	}

}

上面程序的输出是:

Absolute Path : /Users/hyman/source.txt
Canonical Path : /Users/hyman/source.txt
Absolute Path : /Users/hyman/temp/../source.txt
Canonical Path : /Users/hyman/source.txt

用Java删除文件

Java File类提供了delete()方法,该方法删除此抽象路径名表示的文件或者目录。
如果是目录,则应为空,否则将不会被删除。
如果文件被删除,则此方法返回true,否则返回false。

package com.theitroad.examples;

import java.io.File;

/**
 * Java File delete Example
 * 
 * @author hyman
 *
 */
public class FileDeleteExample {

	public static void main(String[] args) {
		//initialize File constructor
		File file = new File("D:/data/file.txt");
		
		boolean delete = file.delete();
		if (delete) {
			System.out.println("File Deleted");
		} else {
			System.out.println("File not Deleted");
		}

	}

}

创建目录

Java File类提供了以下两种创建目录的方法。

  • mkdir():此方法创建此抽象路径名命名的目录。
    它仅创建单个目录,如果创建目录则返回true,否则返回false。

  • mkdirs():此方法创建此抽象路径名(包括子目录)命名的目录,如果创建目录则返回true,否则返回false。

package com.theitroad.examples;

import java.io.File;

/**
 * Java Create Direcories Example
 * 
 * @author hyman
 *
 */
public class CreateDirectoriesExample {

	public static void main(String[] args) {

		//initialize File constructor
		File file = new File("D:/hyman/");
		boolean created = file.mkdir();
		if (created) {
			System.out.println("Directory created");
		} else {
			System.out.println("Directory is not created");
		}
		
		//create directories including sub directories
		File file2 = new File("D:/hyman/data/java");
		boolean creatSub = file2.mkdirs();
		if (creatSub) {
			System.out.println("Directory including sub directories created");
		} else {
			System.out.println("Directory including sub directories are not created");
		}

	}

}

使用Files类创建目录

java.nio.Files类提供了两个静态方法-createDirectory()和createDirectories()创建目录。

package com.theitroad.examples;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Create Direcories Using Java 7 Example
 * 
 * @author hyman
 *
 */
public class CreateDirectoriesExample {

	public static void main(String[] args) {
		
		Path path = Paths.get("D:/java7");
		Path subPath = Paths.get("D:/java7/createdir/data");
		try {
			Path dirPath = Files.createDirectory(path);
			Path subdirPath = Files.createDirectories(subPath);
			System.out.println("Directory Path : "+dirPath);
			System.out.println("Directory Including sub Directories Path : "+subdirPath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

如果目录已经存在,它将抛出java.nio.file.FileAlreadyExistsException异常。

package com.theitroad.examples;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Create Direcories Using Java 7 Example
 * 
 * @author hyman
 *
 */
public class CreateDirectoriesExample {

	public static void main(String[] args) {
		
		Path path = Paths.get("D:/hyman");
		try {
			Files.createDirectory(path);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

上述程序引发的异常是:

java.nio.file.FileAlreadyExistsException: D:\hyman
	at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
	at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
	at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
	at sun.nio.fs.WindowsFileSystemProvider.createDirectory(Unknown Source)
	at java.nio.file.Files.createDirectory(Unknown Source)
	at com.theitroad.examples.CreateDirectoriesExample.main(CreateDirectoriesExample.java:20)

目录中的文件列表

我们可以使用listFiles()方法,该方法返回一个表示目录中文件的抽象路径名数组。

package com.theitroad.examples;

import java.io.File;

/**
 * Java Fetch List of File from Directory Example
 * 
 * @author hyman
 *
 */
public class FileListInDirectoryExample {

	public static void main(String[] args) {

		//initialize File constructor
		File dir = new File("D:/hyman");
		File[] files = dir.listFiles();
		
		System.out.println("Files in Directory:");
		for (File file : files) {
			System.out.println(file.getAbsolutePath());
		}

	}

}