system out zu string?

oldshoe

Bekanntes Mitglied
Hallo,
ich nutze Methoden einer .jar leider sind fast alle vom Typ void und es werden sämtliche Ausgaben automatisch auf der Console ausgegeben.
Ist es möglich diese irgendwie in einen String abzuleiten, also nutzbar zu machen?

Schon mal vielen Dank...:autsch:
 
Ich bin mir nicht sicher, ob das auch für die Jar gilt, sollte aber:
Du brauchst zwei Stream: PipedInputStream und PipedOutputStream. Diese kannst du näml. miteinander verbinden. Dann setzte du System.setOut() auf den Pipedoutputstream. Das wird dann im Prinzip weitergeleitet an PipedInputStream und das kannst du dann als String behandeln.

MFG

Tomate_Salat
 
Hier ein Beispiel:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;


public class PipedTest 
{
	public PipedInputStream 	pin;
	public PipedOutputStream	pout;
	
	private IHandler 			handler;	
	private boolean 			run;
	
	public PipedTest(IHandler handler) throws IOException 
	{
		run = true;
		pout= new PipedOutputStream();
		pin	= new PipedInputStream(pout);		
		
		this.handler	= handler; 
		
		System.setOut(new PrintStream( pout ));		
		
		start();
	}
	
	public void start()
	{
		new Thread()
		{
			public void run() 
			{
				while(run)
				{
					try
					{								
						BufferedReader reader	= new BufferedReader( new InputStreamReader( pin ));
						String out				= "";
						
						while(reader.ready())
						{
							out	= reader.readLine();
							
							if(out.trim().length() > 0)
								handler.handleInput(out);
						}												
					}
					catch(IOException e)
					{
						e.printStackTrace();
					}
				}
			};
		}.start();		
	}	
	
	public void kill()
	{
		run	= false;
	}
	
	public static void main(String[] args)
	{
		IHandler	h	= new IHandler()
		{

			@Override
			public void handleInput(String rslt) 
			{
				System.err.println("INPUT: " + rslt);
			}
			
		};
		
		try 
		{
			PipedTest pipe = new PipedTest(h);		
			System.out.println("Hallo");
			System.out.println("du");
			System.out.println("da");
			pipe.kill();
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		} 							
	}
}

interface IHandler
{
	public void handleInput(String rslt);
}

Ausgabe
Code:
INPUT: Hallo
INPUT: du
INPUT: da

Anmerkung Performence mäßig ist das oben allerdings schrott ;-). Könntest z.b. sagen er soll nur alle halbe sekunde oder so drauf hören, das macht einen merklichen Unterschied, weis aber nicht wie es da mit der Verlustrate ausschaut, habe in dieser Richtung relativ wenig zu tun. Wenn jmd prinzipielle Optimierungsmöglichkeiten kennt, als her damit ;-)
 
Zuletzt bearbeitet von einem Moderator:
Oder du schreibst dir einfach einen eigenen Outputstream:
Java:
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

import javax.swing.JOptionPane;

public class OSGS
	extends OutputStream
{
	private boolean read	= false;
	private String 	out		= null;
	
	@Override
	public void write(int b) throws IOException
	{
		if(read)
			out += (char) b;
	}	
	
	@Override
	public synchronized void write(byte[] b, int off, int len) throws IOException
	{
		read	= !read;
		 
        // Experimentell(!) in den Test funktioniert das
		if(read)
			out = "";
		else
			notifyAll();
		
		super.write(b, off, len);
	}
	
	public synchronized String getSystemOut() throws InterruptedException
	{
		while(out == null)
		{
			wait();
		}
		
		String rslt	= out;
		out			= null;
		
		return rslt;
	}
	
	public static void main(String[] args)
	{
		final OSGS osgs	= new OSGS();
		System.setOut( new PrintStream( osgs ) );
		
		Thread receiver	= new Thread()
		{
			public void run() 
			{
				boolean run	= true;
				
				while(run)
				{
					try
					{
						String str	= osgs.getSystemOut();
						System.err.println("Received: " + str);
					} 
					catch (InterruptedException e)
					{
						run	= false;
					}
				}
			};
		};
		
		receiver.start();
		
		for(int i=0; i<3; i++)
		{
			String get	= JOptionPane.showInputDialog("Message:");
			System.out.println(get);
		}
		
		receiver.interrupt();
	}
}

ist performencemäßig wesentlich besser als das oben stehende

MFG

Tomate_Salat
 

Neue Themen


Zurück
Oben