Java File 文件处理(文件管理)

文件在所有的开发语言是一个很重要的一个类,在Java里,两样也是很重要的!

Java中的文件路径表示

  • 对于 UNIX 平台,绝对路径名的前缀始终是 "/"。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 "/" 且名称序列为空。
  • 对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 ":" 组成。如果路径名是绝对路径名,还可能后跟 "\"。UNC 路径名的前缀是 "\\";主机名和共享名是名称序列中的前两个名称。没有指定驱动器的相对路径名没有前缀。

Java操作文件权限

文件系统可以实现对实际文件系统对象上的某些操作(比如,读、写、执行)进行限制。这些限制统称为访问权限。文件系统可以对一个对象设置多个访问权限。例如,一个设置可能适用于对象的所有者,另一个设置则可能适用于所有其他用户。对象上的访问权限可能导致此类的某些方法执行失败。

Java File 类提供的方法

boolean canExecute()
测试应用程序是否可以执行此抽象路径名表示的文件。
boolean canRead()
测试应用程序是否可以读取此抽象路径名表示的文件。
boolean canWrite()
测试应用程序是否可以修改此抽象路径名表示的文件。
int compareTo(File pathname)
按字母顺序比较两个抽象路径名。
boolean createNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
static File createTempFile(String prefix, String suffix)
在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
static File createTempFile(String prefix, String suffix, File directory)
在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
boolean delete()
删除此抽象路径名表示的文件或目录。
void deleteOnExit()
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
boolean equals(Object obj)
测试此抽象路径名与给定对象是否相等。
boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
File getAbsoluteFile()
返回此抽象路径名的绝对路径名形式。
String getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。
File getCanonicalFile()
返回此抽象路径名的规范形式。
String getCanonicalPath()
返回此抽象路径名的规范路径名字符串。
long getFreeSpace()
返回此抽象路径名指定的分区中未分配的字节数。
String getName()
返回由此抽象路径名表示的文件或目录的名称。
String getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
File getParentFile()
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
String getPath()
将此抽象路径名转换为一个路径名字符串。
long getTotalSpace()
返回此抽象路径名指定的分区大小。
long getUsableSpace()
返回此抽象路径名指定的分区上可用于此虚拟机的字节数。
int hashCode()
计算此抽象路径名的哈希码。
boolean isAbsolute()
测试此抽象路径名是否为绝对路径名。
boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
boolean isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。
long lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。
long length()
返回由此抽象路径名表示的文件的长度。
String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles(FilenameFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
static File[] listRoots()
列出可用的文件系统根。
boolean mkdir()
创建此抽象路径名指定的目录。
boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
boolean renameTo(File dest)
重新命名此抽象路径名表示的文件。
boolean setExecutable(boolean executable)
设置此抽象路径名所有者执行权限的一个便捷方法。
boolean setExecutable(boolean executable, boolean ownerOnly)
设置此抽象路径名的所有者或所有用户的执行权限。
boolean setLastModified(long time)
设置此抽象路径名指定的文件或目录的最后一次修改时间。
boolean setReadable(boolean readable)
设置此抽象路径名所有者读权限的一个便捷方法。
boolean setReadable(boolean readable, boolean ownerOnly)
设置此抽象路径名的所有者或所有用户的读权限。
boolean setReadOnly()
标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。
boolean setWritable(boolean writable)
设置此抽象路径名所有者写权限的一个便捷方法。
boolean setWritable(boolean writable, boolean ownerOnly)
设置此抽象路径名的所有者或所有用户的写权限。
String toString()
返回此抽象路径名的路径名字符串。
URI toURI()
构造一个表示此抽象路径名的 file: URI。
URL toURL()
已过时。 此方法不会自动转义 URL 中的非法字符。建议新的代码使用以下方式将抽象路径名转换为 URL:首先通过 toURI 方法将其转换为 URI,然后通过 URI.toURL 方法将 URI 装换为 URL。

Java 使用文件示例

public class Test
{
	public static void main(String[] args) {
		File file = new File("C:/Users/Administrator/Desktop/test/test/test/test.txt");

		System.out.println("创建单级目录(如果有中间有多级则创建失败) => " + file.mkdir());
		System.out.println("创建多级目录(只要中间有不存在的,则会创建) => " + file.mkdirs());

		// 创建失败,因为被上面的方法创建成了目录
		System.out.println("创建文件 = " +file.createNewFile());

		// 判断方法
		System.out.println("文件是否存在 : " + file.exists());
		System.out.println("是不是文件 ? " + file.isFile());
		System.out.println("是不是目录 : " + file.isDirectory());
		System.out.println("文件大小(字节单位) : " + file.length());
	}
}

运算结果为

创建单级目录(如果有中间有多级则创建失败) => false
创建多级目录(只要中间有不存在的,则会创建) => true
创建文件 = false
文件是否存在 : true
是不是文件 ? false
是不是目录 : true
文件大小(字节单位) : 0

实际工作中,对于非文本类型的文件,操作文件也无非上面几种,如果文件是文本类型,那就多了 这里我们使用commons-io这个工具库来使用

请创建一个maven工程,并在pom.xml引入commons-io包, 这个是工作中一个常用的一个工具包

<dependency>
	<groupId>commons-io</groupId>
	<artifactId>commons-io</artifactId>
	<version>2.6</version>
</dependency>
public class Test
{
	public static void main(String[] args) {
		File file = new File("C:/Users/Administrator/Desktop/test/test/test/aaaaaa.txt");

		String data = "Hello Pangugle";
		String encoding = "utf-8";
		boolean append = false; // 写入数据是追加还是覆盖, 这里选择覆盖
		FileUtils.writeStringToFile(file, data, encoding, append);

		System.out.println("============请先打开 C:/Users/Administrator/Desktop/test/test/test/aaaaaa.txt 这个路径下的文件,是不是写入数据了");

		// 读取文件数据
		System.out.println("读取文件文本内容 :" + FileUtils.readFileToString(file, encoding));

		System.out.println("=====================================");

		// 这里我以追加的方式再写入一行, 前面加了一个换行符号
		FileUtils.writeStringToFile(file, "\nHello Pangugle, I'm Java!", encoding, true);

		// 按行读取文件
		List<String> lineList = FileUtils.readLines(file, encoding);
		for(String line : lineList)
		{
			System.out.println("按行读取数据: " + line);
		}
	}
}

运算结果为

============请先打开 C:/Users/Administrator/Desktop/test/test/test/aaaaaa.txt 这个路径下的文件,是不是写入数据了
读取文件文本内容 :Hello Pangugle
=====================================
读取文件文本内容 :Hello Pangugle
Hello Pangugle, I'm Java!
按行读取数据: Hello Pangugle
按行读取数据: Hello Pangugle, I'm Java!