StringBufferInputStream

UPDATE: siehe auch den neuen Post StrinInputStream StringOutputStream der einige Schwächen dieser Lösung hier beseitigt.

Da programmiert man vor sich hin und vor sich hin, man will ein Java Objekt, oder besser gesagt ein Bean in ein XML-Format bringen (bzw. serialisieren).

Es gibt ja diese wunderbare Library die auch Java RMI verwendet, aber leider kann die nur in Streams schreiben, bzw. von Streams lesen.

Will man aber das XML (warum auch immer) als String haben, kann man den Umweg über ein File gehen – das ist eher doof – oder sich einen StringBuffer-Stream schreiben.

Hört sich vielleicht ein wenig kompliziert an, aber eigentlich sind die Java Streams recht einfache Konstrukte.

Da wäre diese zwei Streamchen zu erwähnen:

Will man nun eigene Streams schreiben, implementiert man einfach seine eigene Java Klasse die von dem jeweiligen Stream erbt.

So sieht dann mein StringBufferInputStream aus:

package xmlTest;

import java.io.IOException;
import java.io.InputStream;

public class StringBufferInputStream extends InputStream {

  StringBuffer content = new StringBuffer();
  int pos = 0;

  public StringBufferInputStream(StringBuffer stringBuffer) {
    content = stringBuffer;
    pos = 0;
  }

  @Override
  public int read() throws IOException {
    if (pos < content.length()) {
      return content.codePointAt(pos++);
    } else {
      return -1;
    }

  }
}

Dieser kleinen Klasse muss man beim Instanzieren über den Konstruktor einen befüllten StringBuffer übergeben, und ein anderer Konsument kann dann über die normale Streamfunktion read() diesen String zeichenweise auslesen.

Umgekehrt gibt es natürlich auch den StringBufferOutputStream, der macht nichts anderes als jedweden Input in einen StringBuffer zu stopfen.

package xmlTest;

import java.io.IOException;
import java.io.OutputStream;

public class StringBufferOutputStream extends OutputStream {

  StringBuffer content = new StringBuffer();

  public StringBufferOutputStream(StringBuffer stringBuffer) {
    content = stringBuffer;
  }

  @Override
  public void write(int b) throws IOException {
    content.append(Character.toChars(b));
  }
}

Dieser Klasse übergibt man beim Instanzieren einen leeren StringBuffer mit, in diesem steht dann die ausgelesenen Daten drinnen.

Zuguterletzt: das ganze ist nur schnell hingetippt, ohne grossartige umfangreiche Tests - und sicher gibt es da noch einiges zum optimieren (ich denke da an BufferedReader...) - aber ich denke das hebe ich mir für andere Postings auf.

1 Gedanke zu „StringBufferInputStream“

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.