Ausgabestrom und Errorstrom synchronisieren?

Caruso_Nix

Mitglied
hallo,
wie kann ich den Ausgabestrom und den Errorstrom synchronisieren? Jetzt wird erst der Ausgabestrom in die Datei geschrieben und dann der Errorstrom.
Ideen?
Code:
final Process p = 
     	Runtime.getRuntime().exec("cmd.exe /c dir c:");
    String encoding_system = System.getProperty("file.encoding");
    String encoding = "Cp850";
    StringBuffer sb = new StringBuffer();
    BufferedReader br = new BufferedReader(new 
     	InputStreamReader(p.getInputStream(),encoding_system));
     BufferedReader br_error = new BufferedReader(new 
     	InputStreamReader(p.getErrorStream(),encoding_system));
      
    // Ausgabestrom zwischenspeichern
    while((line = br.readLine()) != null)
    {	  
      sb.append(line + System.getProperty("line.separator"));
    }
 						
    // Errorstrom zwischenspeichern 
    while ((line = br_error.readLine()) != null)
    {
      sb.append(line + System.getProperty("line.separator"));
    }
      File file = new File(fileName);
    if (file.exists()) 
    file.delete();
    try
    {	
    FileOutputStream fos = new FileOutputStream(fileName);
    fos.write(sb.toString().getBytes(encoding_system));
     fos.close();
     }
    catch (Exception e)	{}
 
Hmmm,

ich würde vorschlagen, das du eine funktion write anlegst, welche du mit einem synchronized versiehst.

In dieser funktion schreibst du dann in die Datei deine benötigten daten, text etc. rein.

Dadurch das es synchronized ist, greift immer nur ein stream auf diese datei zu...

sprich sowas hier:


public synchronized boolean synchronizedWriteStream (StringBuffer sb, File file) {
if (file.exists()) file.delete(); //naja, wenn du meinst...
try
{
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(sb.toString().getBytes(encoding_system));
fos.close();
system.out.println("Writing String to File successfull!");
return true;
}
catch (Exception e) {
System.out.println("Failure while writing to file");
return false;
}
}



Nur so eine Idee....


Der Code ist nicht getestet, kann sein, dass da bugs drin sind. Ist auch eher als Pseudo-Code zu lesen...

Viel Spass

;)
 
Zuletzt bearbeitet:
Hätte da auch noch 'ne Idee:

Im java.io-Packages gibt's da so eine Klasse: SequenceInputStream, der kannst Du zwei InputStreams direkt oder noch mehr per Enumeration "verpassen". Vielleicht ist das die Lösung für Dich. :)
 
hallo,
auch wenns spät ist....es hat nicht geholfen.:(
der SequenceInputStream hängt mehrere Eingabeströme zu einem großen Eingabestrom zusammen. ich verwende aber den InputStreamReader.
oder hab ich mich einfach zu dumm angestellt?

Noch jemand eine Idee?
 
mit synchronisieren meine ich, dass die "ströme" (Ausgabeströme und Error) in der reihenfolge gespeichert werden, wie sie auftreten.
beispiel:

eine bat sieht so aus:
dir c:\a\
echo hallo
dir c:\a\

dann soll folgendes ausgegeben werden:
kann datei nicht finden
hallo
kann datei nicht finden

bei mir werden bisher erst alle Ausgabeströme und anschliessend alle Errorströme gesichert. das sieht so aus:
hallo
kann datei nicht finden
kann datei nicht finden

klarer geworden

caruso
 
Hallo!

Schau mal hier:
Code:
/*
 * Created on 04.05.2005@14:15:57 by Darimont
 *
 * TODO Licence info
 */
package de.tutorials;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * @author Darimont
 * 
 * TODO Explain me
 */
public class StreamSynchronizationExample {

	public static void main(String[] args) throws Exception {
		ProcessBuilder builder = new ProcessBuilder(
				new String[] { "c:/test.cmd" });

		builder.redirectErrorStream(true);
		Process p = builder.start();

		BufferedReader input = new BufferedReader(new InputStreamReader(p
				.getInputStream()));

		String inputLine;
		while ((inputLine = input.readLine()) != null) {
			System.out.println(inputLine);
		}

		input.close();
	}
}

test.cmd:
Code:
@echo off
dir c:\a\
echo FOO
dir c:\a\

Gruß Tom
 
oh das klappt alles.;-)

wie kann ich jetzt aber ermitteln, ob es einen errorstream gibt? Also ich will, falls Fehler auftauchen, den Prozess abbrechen.

caruso
 
Zurück