文
章
目
录
章
目
录
在Java中创建新文件可以使用不同的技术,包括NIO Path、IO File、OutputStream,以及开源库,如Guava和Apache Commons。还有关于创建临时文件和将文件设置为只读的单独文章。
1.使用Java NIO创建新文件
使用Files.createFile(path, attribs)
是在Java中创建新的、空的可写文件的最佳方式,如果您尚未使用它,将来应该成为您的首选方法。
createFile()
方法接受Path
接口而不是File
,它检查文件是否已经存在,然后创建文件。- 检查现有文件并创建文件是一个原子操作。
attribs
是一个可选的文件属性列表,用于在创建文件时进行原子设置。- 如果同名文件已经存在,它将返回
FileAlreadyExistsException
。 - 如果发生I/O错误或父目录不存在,它将返回
IOException
。
例子1:创建一个新的可写文件。
String TEXT_FILE = "C:/temp/io/textFile.txt";
Path textFilePath = Paths.get(TEXT_FILE);
Files.createFile(textFilePath);
例子2:创建一个新的只读文件。
String TEXT_FILE = "C:/temp/io/textFile.txt";
Set<PosixFilePermission> permissions = PosixFilePermissions
.fromString("r--r--r--");
FileAttribute<Set<PosixFilePermission>> attribs = PosixFilePermissions
.asFileAttribute(permissions);
Path textFilePath = Paths.get(TEXT_FILE);
Files.createFile(textFilePath, attribs);
还可以在创建文件时设置文件属性。在给定的示例中,我们使用字符串“r–r–r–”为所有者、组和其他用户设置只读(“r”)访问权限。
2.使用File.createNewFile()
使用File.createNewFile()
方法可以创建新文件,前提是该文件名尚不存在。检查现有文件并创建文件是一个原子操作。
此方法返回一个布尔值:
- 如果文件成功创建,返回
true
。 - 如果文件已经存在,返回
false
。 - 如果发生I/O错误,将抛出
IOException
。
String TEXT_FILE = "C:/temp/io/textFile.txt";
File textFile = new File(TEXT_FILE);
boolean isFileCreated = textFile.createNewFile();
3.使用FileOutputStream
构造函数会自动在指定位置创建一个新文件。请注意,如果具有相同名称的文件已经存在,它将被覆盖。
如果给定的文件路径表示一个目录,或者由于任何原因无法创建新文件,它将抛出FileNotFoundException
。
String TEXT_FILE = "C:/temp/io/textFile.txt";
try(FileOutputStream fos = new FileOutputStream(TEXT_FILE)){
// We can write data as byte[]
// fos.write(data, 0, data.length);
}
4.Guava的Files.touch()
要使用Guava,需要将以下内容添加到pom.xml
中。
pom.xml<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
Files.touch()
方法类似于Unix的touch命令。它创建一个空文件或更新最后更新的时间戳。
当不带任何选项使用touch命令时,它假定文件不存在时创建一个空文件。如果文件已存在,则更改时间戳。
String TEXT_FILE = "C:/temp/io/textFile.txt";
com.google.common.io.Files.touch(new File(TEXT_FILE));
5.Apache Commons IO的FileUtils.touch()
要使用Apache Commons IO,需要将以下内容添加到pom.xml
中。
pom.xml<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
FileUtils.touch()
与前面的示例非常相似。它也实现了Unix上“touch”实用程序的相同行为。
此方法还会在v1.3版本后创建父目录(如果不存在)。如果文件的最后修改日期无法设置,它将抛出IOException
。
String TEXT_FILE = "C:/temp/io/textFile.txt";
org.apache.commons.io.FileUtils.touch(new File(TEXT_FILE));