2015-12-02 2 views
2

Есть ли способ сохранить весь вывод консоли в файл при многопоточности? Я работаю с 5 потоками. У меня была эта идея, что я могу поместить printstream в run-method.Консольный вывод в файл с использованием многопоточности

пример:

public void run() { 
try{ 
    PrintStream out = new PrintStream(file); 
    stopExecute stop = new stopExecute(); 
    Thread t = new Thread(stop); 
    Scanner in = new Scanner(System.in); 
    t.start(); 

     while (!in.hasNextLine()) 
    { 
     classThatUsingMultipleThrads(); 
     System.out.println("Finished"); 
     anotherClassThatUsingThreads(); 
     System.out.println("Finished"); 
    } 
     System.out.prinln("User stopped the execution"); 
     stop.keepRunning = false; 
     System.setOut(out); 

     } 
    catch(IOException e){System.out.println(e);} 

Проблема здесь в том, что это только экономия на выходе «купирован пользователя исполнение» и все в whileloop не сохраняются. Или выход из других классов.

Я пытался поставить

System.setOut(out); 

в то время как петли, но не помогло.

Edit: коррекция Spell

+0

«Закончено», а не «финишировано» :) Ох. И «остановился», а не «остановился». –

+0

Использует ли система ведения журнала, например Log4J, ваше дело? –

+0

@ C-Otto Спасибо за исправление, я каждый день изучаю новые вещи :) – Micropop

ответ

0

Вы, вероятно, следует искать в использовании библиотеки протоколирования, таких как Log4J. Однако вы также можете использовать что-то вроде TeeOutputStream. Этот тип выходного потока записывается в 2 других потока при вызове. Несколько библиотек имеют отличные реализации, но вы также можете написать их самостоятельно. Я быстро взбила это.

Вы можете установить выходной поток для всей вашей программы в методе main, чтобы использовать эту TeePrintStream, то все вызовы System.out.* будут записывать данные в обычном System.out и вашей FileOutputStream.

Theres также реализация TeePrintStream здесь http://www.java2s.com/Code/Java/File-Input-Output/TeePrintStreamteesallPrintStreamoperationsintoafileratherliketheUNIXtee1command.htm

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintStream; 

public class SO34042494 { 
    public static void main(String[] args) throws FileNotFoundException { 
     System.setOut(new TeePrintStream(System.out, new FileOutputStream(new File("x:\\output.txt")))); 

     System.out.println("Check check"); 
     System.out.println("1"); 
     System.out.println(2); 
     System.out.println(3L); 
    } 

    public static class TeePrintStream extends PrintStream { 
     private final OutputStream tee; 

     public TeePrintStream(PrintStream original, OutputStream tee) { 
      super(original); 
      this.tee = tee; 
     } 

     @Override 
     public void write(byte[] b) throws IOException { 
      super.write(b); 
      tee.write(b); 
     } 

     @Override 
     public void write(byte[] buf, int off, int len) { 
      super.write(buf, off, len); 
      try { 
       tee.write(buf, off, len); 
      } catch (IOException e) { 
       throw new RuntimeException(e); 
      } 
     } 

     @Override 
     public void write(int b) { 
      super.write(b); 
      try { 
       tee.write(b); 
      } catch (IOException e) { 
       throw new RuntimeException(e); 
      } 
     } 

     @Override 
     public synchronized void close() { 
      try { 
       tee.close(); 
      } catch (IOException e) { 
       throw new RuntimeException(e); 
      } finally { 
       super.close(); 
      } 
     } 
    } 
} 

TeePrintStream я здесь что-то я просто бросил вместе, пожалуйста, если ты собираешься использовать это в производство проекта полируют его и проверить его полностью

0

Okej Я думаю, я решил. В моем основном я просто сделал так:

public static void main(String[] args) { 
Prinstream out = new Prinststream(file); 

/* 
    Do some things like start threads, call objects etc.. 
    . 
    . 
    . 
    . 
*/ 
    System.setOut(out); 

Я думаю, что, когда все потоки запускаются и делать свои вещи (я назначить объект для каждого потока) PrintStream будет ловить каждый консольный вывод, что происходит в других классы. Это не сработало до того, как я отредактировал класс stopExecute.

public class stopExecute implements Runnable { 
    Scanner scan = new Scanner(System.in);  
    private Object[] obj; 

public stopExecute(Object[] obj) 
{ 
    this.obj = obj; 
} 

public void run() { 
    while(true){ 
     stop(); 
    } 
} 
public void stop() { 
    if(scan.hasNextLine()){ 
     System.out.println("Stopped"); 
     System.exit(0); 
    } 
    } 
} 

Благодарим за помощь. Я рассмотрю ваши предложения и попробую их. В этом решении я не могу использовать Log4J. Но я обязательно проверю это.

Смежные вопросы