繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM