如何将临时文件重命名为原始文本文件



你好,我的代码基本上是从txt文件中删除空行,但我希望在最后临时文件采用原始名称。

String inputFileName = "src/inware/users.txt";
String outputFileName = "src/inware/usersT.txt";
try (BufferedReader inputFile = new BufferedReader(new FileReader(inputFileName));
PrintWriter outputFile = new PrintWriter(new FileWriter(outputFileName))) {
String lineOfText;
while ((lineOfText = inputFile.readLine()) != null) {
lineOfText = lineOfText.trim();
if (!lineOfText.isEmpty()) {
outputFile.println(lineOfText);
}
}
inputFile.close();
outputFile.close();
inputFile.delete();
outputFile.renameTo(inputFile);
} catch (IOException ex) {
Logger.getLogger(ManageStudentController.class.getName()).log(Level.SEVERE, null, ex);
}

我尝试

inputFile.delete();
outputFile.renameTo(inputFile);

但不起作用。。。有解决方案吗??

使用新的File NIO.2 API,而不是旧的过时的File I/O API。

这意味着您应该使用Files.delete(Path path)Files.move(Path source, Path target),因为如果操作失败,它们将抛出异常,从而解释为什么,而不是像旧的File方法那样只返回无信息的false值。

此外,由于您正在使用尝试使用资源,因此不要自己关闭流。在希望关闭资源时关闭try块。

将代码更改为:

import java.io.*;
import java.nio.file.*;
import java.util.logging.*;
Path inputFile = Paths.get("src/inware/users.txt");
Path outputFile = Paths.get("src/inware/usersT.txt");
try {
try (BufferedReader in = Files.newBufferedReader(inputFile);
PrintWriter out = new PrintWriter(Files.newBufferedWriter(outputFile))) {
for (String line; (line = in.readLine()) != null; ) {
line = line.trim();
if (! line.isEmpty())
out.println(line);
}
}
Files.delete(inputFile);
Files.move(inputFile, outputFile);
} catch (IOException ex) {
Logger.getLogger(ManageStudentController.class.getName()).log(Level.SEVERE, null, ex);
}

如果删除+重命名失败,您现在就知道原因了。

我找到了更好的解决方案来解决我的问题:

Path p = Paths.get("src", "inware", "users.txt");
try {
Path tempFile = Files.createTempFile(p.getParent(), "usersTemp", ".txt");
try (BufferedReader in = Files.newBufferedReader(p);
PrintWriter out = new PrintWriter(Files.newBufferedWriter(tempFile))) {
for (String line; (line = in.readLine()) != null;) {
line = line.trim();
if (!line.isEmpty()) {
out.println(line);
}
}
}
Files.copy(tempFile, p, StandardCopyOption.REPLACE_EXISTING);
Files.delete(tempFile);
} catch (IOException ex) {
Logger.getLogger(ManageStudentController.class.getName()).log(Level.SEVERE, null, ex);
}

最新更新