2016-01-20 7 views
0

Я использую АОH с Shell для запуска нескольких команд против хоста. все работает, но мой вопрос в том, как я могу получить System.out и сохранить это для файла. Я хочу копировать, а не перенаправлять. Я могу сделать то или другое, но не могу сделать то и другое.Копирование System.out в файл с использованием Jsch и Java

try (OutputStream logOutput = new BufferedOutputStream(new FileOutputStream(outputFilePath))) { 
      try (InputStream login = new BufferedInputStream(new FileInputStream(outputFilePath))) { 

    JSch jsch = new JSch(); 
    Session session = jsch.getSession(user, host, 22); 
    session.setPassword(password); 
    session.setConfig(getProperties()); 
    session.connect(10 * 1000); 
    Channel channel = session.openChannel("shell"); 
    //channel.setOutputStream(System.out);// I want to activate it as well as the following command 
    channel.setOutputStream(logOutPut, true);// I am writing it to file 
    try (PipedInputStream commandSource = new PipedInputStream(); 
      OutputStream commandSink = new PipedOutputStream(commandSource)) { 
      CommandSender sender = new CommandSender(commandSink); 
      Thread sendThread = new Thread(sender); 
      sendThread.start(); 

      channel.setInputStream(commandSource); 
      channel.connect(15 * 1000); 
      sendThread.join(); 
        if (sender.exception != null) { 
         throw sender.exception; 
          } 
        } 
        channel.disconnect(); 
        session.disconnect(); 

ответ

2

Вы можете сделать подкласс FilterOutputStream который записывает те же байты в нескольких OutputStreams:

public class MultiplexOutputStream 
extends FilterOutputStream { 
    private final OutputStream[] streams; 

    public MultiplexOutputStream(OutputStream stream, 
           OutputStream... otherStreams) { 
     super(stream); 
     this.streams = otherStreams.clone(); 

     for (OutputStream otherStream : otherStreams) { 
      Objects.requireNonNull(otherStream, 
       "Null OutputStream not permitted"); 
     } 
    } 

    @Override 
    public void write(int b) 
    throws IOException { 
     super.write(b); 
     for (OutputStream stream : streams) { 
      stream.write(b); 
     } 
    } 

    @Override 
    public void write(byte[] bytes) 
    throws IOException { 
     super.write(bytes); 
     for (OutputStream stream : streams) { 
      stream.write(bytes); 
     } 
    } 

    @Override 
    public void write(byte[] bytes, 
         int offset, 
         int length) 
    throws IOException { 
     super.write(bytes, offset, length); 
     for (OutputStream stream : streams) { 
      stream.write(bytes, offset, length); 
     } 
    } 

    @Override 
    public void flush() 
    throws IOException { 
     super.flush(); 
     for (OutputStream stream : streams) { 
      stream.flush(); 
     } 
    } 

    @Override 
    public void close() 
    throws IOException { 
     super.close(); 
     for (OutputStream stream : streams) { 
      stream.close(); 
     } 
    } 
} 

Для того, чтобы использовать его в вашем коде:

channel.setOutputStream(new MultiplexOutputStream(logOutput, System.out), true); 
+0

Хороший подход, вы можете добавьте некоторые комментарии к своему коду, как я никогда раньше не делал этого. Также вы можете показать мне, как я могу получить доступ к вашему подклассу? Можете ли вы интегрировать свой ответ с моим кодом, пожалуйста? Я хочу написать вывод outputFilePath и System.out – Moe

+0

. Пример использования примера. Нет смысла добавлять комментарии; каждый метод выполняет то же самое, что и FilterOutputStream, но эта операция применяется ко всем OutputStreams, а не к функции FilterOutputStream. – VGR

+0

Еще раз спасибо за ваш быстрый ответ. теперь я получаю нестационарную переменную, на которую нельзя ссылаться со статического содержимого – Moe