1

次のコードで生成された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を隠す方法を知っていますか?

事前にThx、マイク

4

4 に答える 4

2

コードは代わりにSystem.errに書き込んでいる可能性があります。

同じ演習を試してください。ただし、System.outではなくSystem.errを使用してください。

于 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

みんなありがとう、私はついにsysoutを表示することを避けることができました。

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 に答える