Java 从文件中删除代码行

Java 从文件中删除代码行,java,automation,automated-refactoring,Java,Automation,Automated Refactoring,我正在做一个小项目,在这个项目中,我需要删除java中的一些注释代码行。在两种情况下,我应该删除这些行:(I)当代码行以/#开头时,以及;(ii)当代码行以/@开头时 但是,我为本案例开发的方法不适用于任何类型的移除: private static void dropLines(String[] args, String f) throws IOException { List<String> lines = Files.readAllLines(Paths.get(f),

我正在做一个小项目,在这个项目中,我需要删除java中的一些注释代码行。在两种情况下,我应该删除这些行:(I)当代码行以
/#
开头时,以及;(ii)当代码行以
/@
开头时

但是,我为本案例开发的方法不适用于任何类型的移除:

private static void dropLines(String[] args, String f) throws IOException {
    List<String> lines = Files.readAllLines(Paths.get(f), Charset.forName("UTF-8"));
    PrintWriter pw = new PrintWriter(new FileWriter(f));
    boolean empty = false;

    for (String string : lines) {
        if (!string.trim().startsWith("//#")) {
            if (string.trim().equals("") && !empty) {
                pw.println(string);
                empty = true;
            } else if (!string.trim().equals("")) {
                pw.println(string);
                empty = false;
            }
        }
        else if (!string.trim().startsWith("//@")) {
            if (string.trim().equals("") && !empty) {
                pw.println(string);
                empty = true;
            } else if (!string.trim().equals("")) {
                pw.println(string);
                empty = false;
            }
        }
    }

    pw.flush();
    pw.close();
}

重要:尽管输入文件具有与预处理类似的符号,但这对于删除行的这一阶段没有任何重要性,因为理论上,预处理部分已经在以前的方法中使用了。我只需要创建一个在处理后删除行的方法。

看起来您需要将周围的if/else if语句更改为单个if语句:

private static void dropLines(String[] args, String f) throws IOException {
    List<String> lines = Files.readAllLines(Paths.get(f), Charset.forName("UTF-8"));
    PrintWriter pw = new PrintWriter(new FileWriter(f));
    boolean empty = false;

    for (String string : lines) {
        if (!string.trim().startsWith("//#") && !string.trim().startsWith("//@")) {
            if (string.trim().equals("") && !empty) {
                pw.println(string);
                empty = true;
            } else if (!string.trim().equals("")) {
                pw.println(string);
                empty = false;
            }
        }
    }

    pw.flush();
    pw.close();
}
private static void dropLines(字符串[]args,字符串f)引发IOException{
列表行=Files.readAllLines(path.get(f)、Charset.forName(“UTF-8”);
PrintWriter pw=新的PrintWriter(新文件写入程序(f));
布尔空=假;
用于(字符串:行){
如果(!string.trim().startsWith(“//#”)&!string.trim().startsWith(“//”)){
if(string.trim()等于(“”&!空){
println(字符串);
空=真;
}如果(!string.trim().equals(“”),则为else{
println(字符串);
空=假;
}
}
}
pw.flush();
关闭();
}

按照您现在的方式,它设置为始终重新打印该行,因为如果您的行以
“/@”
开头,则
!string.trim().startsWith(“//#”)
true
,如果它以
“//#”
开头,则
!string.trim().startsWith(“//”)
true

假设您的行以
/#
开头,则它不以
/@
开头,反之亦然。所以在任何情况下你的一个ifs都会被执行。这是一个用调试器很容易就能发现的事实。非常感谢,它工作得非常好。我缺乏解决这个问题的编程逻辑。不幸的是,我还在学习编程,所以我遇到了一些困难。
private static void dropLines(String[] args, String f) throws IOException {
    List<String> lines = Files.readAllLines(Paths.get(f), Charset.forName("UTF-8"));
    PrintWriter pw = new PrintWriter(new FileWriter(f));
    boolean empty = false;

    for (String string : lines) {
        if (!string.trim().startsWith("//#") && !string.trim().startsWith("//@")) {
            if (string.trim().equals("") && !empty) {
                pw.println(string);
                empty = true;
            } else if (!string.trim().equals("")) {
                pw.println(string);
                empty = false;
            }
        }
    }

    pw.flush();
    pw.close();
}