5

我想System.out.println从我的 java 代码中删除/注释所有出现的 。这System.out.println可能在里面,,,,或if任何地方。由于源代码文件很大,我无法手动完成。if elseforwhile

请帮我自动化这个过程。是否有任何重构工具可用于此任务?我可以为此使用 eclipse JDT 吗?

4

7 回答 7

6

更新

如此处所述创建一个 NullOutPut

public final DevNull { 
    public final static PrintStream out = new PrintStream(new OutputStream() {
        public void close() {}
        public void flush() {}
        public void write(byte[] b) {}
        public void write(byte[] b, int off, int len) {}
        public void write(int b) {}

    } );
}

并替换System.out.printDevNull.out.print

然后切换到日志框架,让您轻松处理事情


链接

于 2012-12-26T17:54:01.513 回答
3

可以使用源代码文件中的原始查找/替换功能来注释掉(或删除)语句,但是任何正则表达式都可以很容易地被破坏,所以也许您最好注意像 log4j 或 slf4j 这样的日志框架。

首先是大图:而不是使用通常的System.out.println(),您最终将使用如下代码行:

logger.debug("Just entered main");

日志框架可以配置一个简单的属性文件,因此您可以拥有多个附加程序(控制台、文件、数据库等)并根据需要分别关闭每个附加程序(例如控制台附加程序)。要切换到日志 API,您仍然必须对源文件执行原始查找/替换,并且可能手动修复一些事情,无论是在您的 IDE 中,还是使用如下命令:

find src/ -name '*.java' | \
xargs sed -i -e 's/System.out.println/logger.verbose/g'
于 2012-12-26T18:02:25.210 回答
2

如果您不使用 IDE,在 Linux 上:

sed '/System.out.println/d' %YOUR_PROJ_DIR%/*.java

在 Windows 上,如果你安装了 cygwin,你也可以这样做。

于 2012-12-26T17:57:31.097 回答
2

正如 Jigar Joshi 所说,使用查找和替换方法可能会对您有很大帮助,特别是如果您不干扰除了System.out.println.

如果您不需要编辑/更改源代码,我会提出不同的解决方案。您可以在驱动程序中禁用System.out流,然后这些语句不会打印任何内容。您只需要像这样设置它:

System.setOut(new PrintStream(new OutputStream() {
    public void write(int b) {
        // No operation.
    }
    public void close() {}
    public void flush() {}
    public void write(byte[] b) {}
    public void write(byte[] b, int off, int len) {}
    public void write(int b) {}
}));
于 2012-12-26T18:03:49.337 回答
1

我已经使用 jEdit 文本编辑器来完成这样的任务。可能还有其他文本编辑器可以做到这一点,重要的功能是通过目录/子目录进行查找和替换搜索。

  1. 打开查找和替换对话框。
  2. 确保检查了搜索文件夹和子目录选项。 同样,这是在整个项目中处理事情的关键。
  3. 在查找字段中写入“System.out.println”。编写一个正则表达式来处理参数。
  4. 在替换字段中写入 //System.out.println 或更安全的“/*System.out.println*/”(或者如果更可取,则将其留空)。使用正则表达式匹配来替换函数的原始参数。
  5. 我建议您手动替换前几次出现以确保一切按预期进行。一旦你确信它是,点击全部替换并庆祝。

我不是 Java 程序员,但这个解决方案应该适用于任何语言。希望有帮助。祝你好运!

于 2012-12-26T18:08:14.567 回答
0

您可以使System.out.println应用程序中的所有内容不在控制台中打印任何内容。创建一个类,如:

import java.io.PrintStream;


public class MyStream extends PrintStream {
   private static final MyStream INSTANCE = new MyStream();

   public static void init() {
      System.setOut(INSTANCE);
   }

   private MyStream() {
      super(System.out);
   }

   @Override
   public void println(Object x) {
      return;
   }

   @Override
   public void println(String x) {
      return;
   }
}

将其用作:

public class Test {

    public static void main(String... args) {
        MyStream.init();
        System.out.println("This line will not print");
    }
}

将不再打印。

于 2012-12-26T18:14:09.610 回答
0

做一个简单的查找和替换。应该这样做。

于 2012-12-26T17:54:14.580 回答