1

我想重定向/隐藏以下代码生成的系统输出:

Tools tool = new ToolsImpl();
HashCode hash = tool.computeHashCodes(dir);

困难的部分是:computeHashCodes 方法存储在一个 jar 中

我试过以下代码:

PrintStream printStreamOriginal=System.out;
System.out.println("sysout deactivated");

System.setOut(new PrintStream(new OutputStream() {
   public void write(int b) {}
}));

System.out.println("Text to delete");

Tools tool = new ToolsImpl();
HashCode hash = tool.computeHashCodes(dir);

System.setOut(printStreamOriginal);
System.out.println("sysout reactivated");

要删除的文本”确实被删除了,但“ .computeHashCodes ”生成的系统输出没有。有人知道如何隐藏这个 sysout 吗?

提前谢谢,迈克

4

4 回答 4

2

代码可能正在写入 System.err。

尝试相同的练习,但使用 System.err 而不是 System.out。

于 2012-06-04T10:01:32.253 回答
1

您的解决方案在使用时工作正常System.out,所以我猜测您想要“阻止”的代码不会System.out用于输出。尝试找出输出是如何完成的,以便您可以“阻止”它。

于 2012-06-04T09:57:35.503 回答
1

看这里:

写到罐子里

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;

public class CreateJarFile {
  public static int BUFFER_SIZE = 10240;
  protected void createJarArchive(File archiveFile, File[] tobeJared) {
    try {
      byte buffer[] = new byte[BUFFER_SIZE];
      // Open archive file
      FileOutputStream stream = new FileOutputStream(archiveFile);
      JarOutputStream out = new JarOutputStream(stream, new Manifest());

      for (int i = 0; i < tobeJared.length; i++) {
        if (tobeJared[i] == null || !tobeJared[i].exists()
            || tobeJared[i].isDirectory())
          continue; // Just in case...
        System.out.println("Adding " + tobeJared[i].getName());

        // Add archive entry
        JarEntry jarAdd = new JarEntry(tobeJared[i].getName());
        jarAdd.setTime(tobeJared[i].lastModified());
        out.putNextEntry(jarAdd);

        // Write file to archive
        FileInputStream in = new FileInputStream(tobeJared[i]);
        while (true) {
          int nRead = in.read(buffer, 0, buffer.length);
          if (nRead <= 0)
            break;
          out.write(buffer, 0, nRead);
        }
        in.close();
      }

      out.close();
      stream.close();
      System.out.println("Adding completed OK");
    } catch (Exception ex) {
      ex.printStackTrace();
      System.out.println("Error: " + ex.getMessage());
    }
  }
}
于 2012-06-04T10:09:52.490 回答
0

谢谢大家,我终于设法避免显示系统输出。

Magodiez建议我找出输出是如何完成的时,我认为我不能这样做,因为我无法访问源代码;但后来我意识到我只需要反编译代码。

所以我用Java Decompiler对其进行了反编译,然后我看到了输出是如何完成的:

LOGGER.log(Level.INFO, str2);

然后我使用以下行解决了我的问题:

java.util.logging.Logger.getLogger("log.tools").setLevel(Level.SEVERE);

这实际上是我真正想要的,现在只有 SEVERE 消息会打印在 sysout 上。

再次感谢 !

于 2012-06-04T12:09:52.947 回答