将文件内容复制到新文件中删除旧文件,将新文件重命名为旧文件

时间:2016-12-01 22:06:38

标签: java file rename bufferedreader bufferedwriter

我想打开一个.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 "";
}

如果出现故障,返回值就是有名称。所以现在一切。

这只是插入包名称,删除旧包名称以及将所有其他内容复制到新文件中的功能。之后,它应删除旧文件并重命名新文件。

1 个答案:

答案 0 :(得分:0)

您正在丢失换行符,因为readLine会删除它们,但您永远不会将任何内容写入文件。您需要在写入新文件的每一行中添加\n(或\r\n,具体取决于您的需要)。您可以使用BufferedWriter#newLine来编写与平台相关的行分隔符。

新文件未重命名,因为当您尝试重命名文件时,两个文件的文件流仍处于打开状态。此外File#renameTo高度依赖于平台(如文档中所述),可能无法覆盖现有文件,我建议您切换到Files#move,您可以在其中指定StandardCopyOption.REPLACE_EXISTING。< / p>

我还建议完全切换到NIO API,而不是完全使用java.io.File,而是直接使用Path

另请注意,使用try-with-resources而不是手动关闭流是一个不错的选择,尤其是在一次处理多个流时。