[英]Copying file content into a new file deleting old file, renaming new one to old file
我想打开一个.java文本文件,并在文件顶部插入一个新的程序包名称。 经过对此的研究,我发现我必须创建一个新文件,插入新的Package名称,并复制旧文件中的所有内容。 到现在为止还挺好。
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 "";
}
如果出现故障,则返回值仅用于命名。 所以现在一切。
这只是插入软件包名称,删除旧软件包名称以及将其他所有内容复制到新文件中的功能。 之后,应删除旧文件并重命名新文件。
您正在丢失换行符,因为readLine
会删除这些换行符,但是您绝不会将其写出到文件中。 您需要在写入新文件的每一行中添加一个\\n
(或根据您的需要\\r\\n
)。 您可以使用BufferedWriter#newLine
编写与平台相关的行分隔符。
新文件不会被重命名,因为当您尝试重命名时,两个文件的文件流仍然打开。 此外, File#renameTo
高度依赖平台(如文档中所述),并且可能无法覆盖现有文件,我建议您切换到Files#move
,您可以在其中指定StandardCopyOption.REPLACE_EXISTING
。
我还建议您完全切换到NIO API,而根本不使用java.io.File
,而是直接使用Path
还要注意,使用try-with-resources而不是手动关闭流是一个不错的选择,尤其是在一次处理多个流时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.