我想重定向/隐藏由以下代码生成的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吗?
提前, 麦克
答案 0 :(得分:2)
代码可能正在写入System.err。
尝试使用System.err而不是System.out进行相同的练习。
答案 1 :(得分:1)
使用System.out
时,您的解决方案正常,因此我猜测您要“阻止”的代码不会使用System.out
作为输出。尝试找出输出是如何完成的,这样你就可以“阻止”输出。
答案 2 :(得分: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());
}
}
}
答案 3 :(得分:0)
谢谢大家,我终于设法避免显示sysout。
当 Magodiez 建议我找出输出是如何完成的时候,我想我不能这样做因为我无法访问源代码;但后来我意识到我只需要反编译代码。
所以我用Java Decompiler反编译它,然后我看到输出是如何完成的:
LOGGER.log(Level.INFO, str2);
然后我通过使用以下行解决了我的问题:
java.util.logging.Logger.getLogger("log.tools").setLevel(Level.SEVERE);
这实际上是我真正想要的,现在只有SEVERE消息将被打印在sysout上。
再次感谢!