将文件内容复制到新文件中,删除旧文件,将新文件重命名为旧文件
Copying file content into a new file deleting old file, renaming new one to old file
我想打开一个 .java 文本文件并在文件顶部插入一个新的包名称。经过一些研究后,我发现我必须创建一个新文件插入新的包名称并从我的旧文件中复制所有内容。到目前为止,一切都很好。
1) 第一个问题要么我做的不正确,但我如何才能以正确的方式复制行尾?我有点觉得通过复制我会丢失它们,不确定但是因为我更专注于我的其他问题
2) 我试图重命名的文件没有被重命名,因此导致了问题,我想插入新包的所有文件都被命名为相同的并且因此我只剩下最后一个名称错误的文件。导致我所有其他文件丢失
private static String insertPackage(File file) throws IOException {
//creating package name
File parent = new File(file.getParent());
String packageName = "package " + parent.getName() + ";\n";
//copy old file
File buffer = new File(parent.getPath()+"\buffer.java");
Charset charset = Charset.forName("UTF-8");
BufferedReader br = Files.newBufferedReader(file.toPath(),charset);
BufferedWriter bw = Files.newBufferedWriter(buffer.toPath(),charset);
bw.write(packageName,0,packageName.length());
String line;
while((line = br.readLine()) != null){
if(!line.startsWith("package ")) {
bw.write(line, 0, line.length());
}
}
//rename new file
// String filepath = file.getPath();
// File rename = new File(filepath);
boolean renamed = true;
if(file.delete()) {
renamed = buffer.renameTo(file);
}
bw.flush();
bw.close();
br.close();
if(!renamed){
return file.getPath();
}
return "";
}
return 值只是为了在出现故障时起一个名字。所以现在一切。
这只是插入包名、删除旧包名并将其他所有内容复制到新文件中的功能。之后它应该删除旧文件并重命名新文件。
您丢失了换行符,因为 readLine
删除了它们,但您从未将任何内容写入文件。您需要在写入新文件的每一行中添加 \n
(或 \r\n
,具体取决于您的需要)。您可以使用 BufferedWriter#newLine
来编写依赖于平台的行分隔符。
新文件不会重命名,因为当您尝试重命名时,您的文件流对于这两个文件仍然是打开的。此外 File#renameTo
高度依赖于平台(如文档中所述)并且可能无法覆盖现有文件,我建议您切换到 Files#move
,您可以在其中指定 StandardCopyOption.REPLACE_EXISTING
.
我也可以建议完全切换到 NIO API 并且根本不使用 java.io.File
,而是直接使用 Path
另请注意,使用 try-with-resources 而不是手动关闭流是一个不错的选择,尤其是在一次处理多个流时。
我想打开一个 .java 文本文件并在文件顶部插入一个新的包名称。经过一些研究后,我发现我必须创建一个新文件插入新的包名称并从我的旧文件中复制所有内容。到目前为止,一切都很好。
1) 第一个问题要么我做的不正确,但我如何才能以正确的方式复制行尾?我有点觉得通过复制我会丢失它们,不确定但是因为我更专注于我的其他问题
2) 我试图重命名的文件没有被重命名,因此导致了问题,我想插入新包的所有文件都被命名为相同的并且因此我只剩下最后一个名称错误的文件。导致我所有其他文件丢失
private static String insertPackage(File file) throws IOException {
//creating package name
File parent = new File(file.getParent());
String packageName = "package " + parent.getName() + ";\n";
//copy old file
File buffer = new File(parent.getPath()+"\buffer.java");
Charset charset = Charset.forName("UTF-8");
BufferedReader br = Files.newBufferedReader(file.toPath(),charset);
BufferedWriter bw = Files.newBufferedWriter(buffer.toPath(),charset);
bw.write(packageName,0,packageName.length());
String line;
while((line = br.readLine()) != null){
if(!line.startsWith("package ")) {
bw.write(line, 0, line.length());
}
}
//rename new file
// String filepath = file.getPath();
// File rename = new File(filepath);
boolean renamed = true;
if(file.delete()) {
renamed = buffer.renameTo(file);
}
bw.flush();
bw.close();
br.close();
if(!renamed){
return file.getPath();
}
return "";
}
return 值只是为了在出现故障时起一个名字。所以现在一切。
这只是插入包名、删除旧包名并将其他所有内容复制到新文件中的功能。之后它应该删除旧文件并重命名新文件。
您丢失了换行符,因为 readLine
删除了它们,但您从未将任何内容写入文件。您需要在写入新文件的每一行中添加 \n
(或 \r\n
,具体取决于您的需要)。您可以使用 BufferedWriter#newLine
来编写依赖于平台的行分隔符。
新文件不会重命名,因为当您尝试重命名时,您的文件流对于这两个文件仍然是打开的。此外 File#renameTo
高度依赖于平台(如文档中所述)并且可能无法覆盖现有文件,我建议您切换到 Files#move
,您可以在其中指定 StandardCopyOption.REPLACE_EXISTING
.
我也可以建议完全切换到 NIO API 并且根本不使用 java.io.File
,而是直接使用 Path
另请注意,使用 try-with-resources 而不是手动关闭流是一个不错的选择,尤其是在一次处理多个流时。