Kurzversion meines Problems:
Ich lese aus einem PipedInputStream, der sobald er "leer" ist, nicht "-1" zurück gibt, sondern blockt und scheinbar auf neue Daten wartet. Wie kommt das / was kann man dagegen tun?
Weitere Hintergrundinformationen
Aus Kompabilitätsgrunden ermögliche ich über eine getPrintStream() Methode den Zugriff auf einen PrintStream (OutputStream), in den aufrufende Instanzen schreiben können. Da ich jedesmal eine Log Nachricht generieren möchte, wenn in den Stream geschrieben wurde, muss die aufrufende Instanz die Methode addExternalMessage(...) aufrufen.
Damit ich aus dem OutputStream lesen kann, habe ich den PrintStream mit PipedIn/OutputStreams verbunden. Es handelt es sich sowohl bei dem PrintStream (nicht unbedingt nötig) als auch bei dem PipedInputStream um Klassenattribute.
Ich lese aus einem PipedInputStream, der sobald er "leer" ist, nicht "-1" zurück gibt, sondern blockt und scheinbar auf neue Daten wartet. Wie kommt das / was kann man dagegen tun?
Code:
public void addExternalMessage(Level logLevel, PrintStream outputStream) {
if (null == outputStream || null == logLevel) {
throw new NullPointerException();
}
if (outputStream.checkError()) {
this.getExternalLogger().warn("An error was raised in the PrintStream");
}
outputStream.flush();
InputStreamReader in = new InputStreamReader(internalInputStream);
int bufferSize = 1024;
int charsRead = 0;
char[] charBuffer = new char[bufferSize];
StringBuffer stringBuffer = new StringBuffer();
try {
while ((charsRead = in.read(charBuffer, 0, bufferSize)) != -1) {
this.getExternalLogger().debug("PipedInputStream: read "+charsRead+" chars.");
if (charsRead == bufferSize) {
stringBuffer.append(charBuffer);
} else if (charsRead > 0 && charsRead < bufferSize){
stringBuffer.append(new String(charBuffer).substring(0, charsRead));
in.reset();
break;//workaround, since the empty PipedInputStream blocks...
} else {
this.getExternalLogger().debug("PipedInputStream: reached undefined state!");
}
}
} catch (IOException e) {
this.getExternalLogger().error("I/O Error while reading from internalInputStream");
}
String message = stringBuffer.toString().trim();
if (Utils.isEmptyString(message)) {
this.getExternalLogger().warn("read from empty internalInputStream");
return;
}
this.getExternalLogger().log(logLevel, message);
}
Weitere Hintergrundinformationen
Aus Kompabilitätsgrunden ermögliche ich über eine getPrintStream() Methode den Zugriff auf einen PrintStream (OutputStream), in den aufrufende Instanzen schreiben können. Da ich jedesmal eine Log Nachricht generieren möchte, wenn in den Stream geschrieben wurde, muss die aufrufende Instanz die Methode addExternalMessage(...) aufrufen.
Damit ich aus dem OutputStream lesen kann, habe ich den PrintStream mit PipedIn/OutputStreams verbunden. Es handelt es sich sowohl bei dem PrintStream (nicht unbedingt nötig) als auch bei dem PipedInputStream um Klassenattribute.
Code:
PipedOutputStream pipedOutputStream = new PipedOutputStream();
internalInputStream = new PipedInputStream(pipedOutputStream); //Klassen Attribut
externalPrintStream = new PrintStream(pipedOutputStream); //Klassen Attribut