Java重定向jar中类的sysout

时间:2012-06-04 09:49:09

标签: java redirect jar system.out

我想重定向/隐藏由以下代码生成的sysout:

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不是。有人知道如何隐藏这个sysout吗?

提前, 麦克

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

使用System.out时,您的解决方案正常,因此我猜测您要“阻止”的代码不会使用System.out作为输出。尝试找出输出是如何完成的,这样你就可以“阻止”输出。

答案 2 :(得分:1)

见这里:

Writing to jars

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());
    }
  }
}

答案 3 :(得分:0)

谢谢大家,我终于设法避免显示sysout。

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

所以我用Java Decompiler反编译它,然后我看到输出是如何完成的:

LOGGER.log(Level.INFO, str2);

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

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

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

再次感谢!