Eigener InputStream will nicht mit BufferedReader

Metta

Mitglied
Hallo liebe Java-Gemeinde,

mein Problem ist folgendes:
Ich habe mir eine eigene Klasse von InputStream abgeleitet welche ich später mit einem InputStreamReader und einen BufferedReader gewrapped habe.

Der InputStream dient als Puffer zur Entschlüsselung und Weiterleitung einer verschlüsselten Netzwerkverbindung und überschreibt read(), available(), skip() und markSupported().

Wenn nun die Methode readLine() von BufferedReader mehr Bytes vom stream lesen will, als vorerst da sind, dann blockt der InputStream seinerseits und wartet auf Netzwerkdaten.

Soweit so gut.

Nur komisch ist, dass wenn im Puffer (dh. bereits entschlüsselt) z.B. der String "ich bin ein String\nhallo\n" habe, readLine() einfach nicht mehr aufhört neue Bytes anzufordern, obwohl er schon 2 mal '\n' "überlesen" hat.

Ich habe in die read() Methode meines InputStreams mal eine Debug-Ausgabe geschrieben, welche bestatigt, dass read() solange aufgerufen wird, bis der Puffer "leer" ist und auf neue Netzwerkdaten gewartet werden muss.

Wahrscheinlich eine Kleinigkeit ...
Vielen Dank im vorraus :-D


Hinweis:
- "decrypted" ist der Puffer
- "lastindex" der index des zuletzt aus dem Puffer gelesenem Byte
- die Methode decrypt holt ein neues vershclüsseltes "Paket" vom Netzwerk (evt blockend)

Die Methode decrypt läuft einwandfrei.


Java:
private class AlgoInputStream extends InputStream {
	byte[] decrypted = null;
	int lastindex = -1;
	Cipher cipher = null;
	BufferedReader br = null;
	public AlgoInputStream(BufferedReader br) {
		this.br = br;
		try {
		cipher = Cipher.getInstance("AES");
		cipher.init(Cipher.DECRYPT_MODE, AESKey);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		}
	}
	@Override
	public int read() throws IOException {
		while (decrypted==null || !(lastindex+1<decrypted.length)) {
			if (!decrypt()) {
				return -1;
			}
		}
		lastindex++;
		System.out.println("read a byte from the buffer: (byte)"+decrypted[lastindex]+" (char)"+(char)decrypted[lastindex]);
		return decrypted[lastindex];
	}
	@Override
	public int available() throws IOException {
		return decrypted.length-1-lastindex;
	}
	@Override
	public boolean markSupported() {
		return false;
	}
		
	@Override
	public long skip(long n) throws IOException {
		long skipnbr = (n<available())? n : available();
		lastindex = (int) (lastindex+skipnbr);				
		return skipnbr;
	}
			
	private boolean decrypt() throws IOException {
		lastindex=-1;
		decrypted = null;
		String input = null;
		try {
			System.out.println("trying to fetch & deBase64 a new line");
			if ((input = br.readLine())!=null) {
				decrypted = cipher.doFinal(Config.fromBase64_2(input));
				return true;
			}
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		return false;
	}			
}
 

Metta

Mitglied
Damit das nicht so ganz unübersichtlich ist mit dem ganzen Exceptions und den Cipher-Geschichten nochmal das gleiche Problem auf trivialer Ebene:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


public class StreamTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		StreamTest st = new StreamTest();

		st.start();
		
	}
	
	public void start() {
		BufferedReader br = new BufferedReader(new InputStreamReader(new MyInputStream()));
		try {
			String line ="";
			while (line!=null && !line.equals("q")) {
					line = br.readLine();                 //////////<---  Hier bleibt er einfach hängen und fordert
					System.out.println("received: "+line);//////////      immmer mehr bytes an.
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	public class MyInputStream extends InputStream {
		byte[] buffer = null;
		int lastindex = -1;
		@Override
		public int read() throws IOException {
			while (buffer==null || !(lastindex+1<buffer.length)) { ///wenn bufferunderrun
				if (!fetchinput()) {
					return -1;
				}
			}
			lastindex++;
			System.err.print("read (char)"+(char)buffer[lastindex]);
			return buffer[lastindex];
		}
		private boolean fetchinput() throws IOException {
			buffer = null;
			lastindex=-1;
			String line = null; 
			if ((line =(new BufferedReader(new InputStreamReader(System.in))).readLine())!=null) {  //// neue Zeile von der Console holen
				buffer=line.concat("\n").getBytes();
				return true;
			}
			return false;
		}
		@Override
		public int available() throws IOException {
			return buffer.length-1-lastindex;
		}
		@Override
		public boolean markSupported() {
			return false;
		}
		@Override
		public long skip(long n) throws IOException {
			int skipnr = (int) ((n<available())? n : available());
			lastindex = lastindex+skipnr;
			return skipnr;
		}		
	}

}
 
S

SlaterB

Gast
immer diese Streams, eigentlich ein schönes Thema, solche Fragen nehme ich gerne, verwirrt mich aber noch nach wie vor ;)

das Problem ist nun letztlich, dass du die Methode read(byte[] b, int off, int len) nicht überschrieben hast,
die wird vom InputStreamReader mit einem 8192er Array aufgerufen
und in der Default-Implementierung von InputStream wird in einer Schleife entsprechend oft read() aufgerufen,

wenn du in fetchinput() testweise paar tausend bytes hinzufügst dann klappt das langsam mit dem bisherigen Code,
ansonsten die Methode überschreibe und genau überlegen, unter welchen Bedingungen schon vorher abgebrochen wird,
nur genau einmal aus System.in lesen? spielt Zeilenumbruch eine Rolle? available() abfragen, usw.

den Quellcode von BufferedInputStream usw. als (wenn auch wenig anschauliches) Beispiel hast du/ brauchst du?
 

Metta

Mitglied
danke :-D

stimmt:
(localSkipBuffer, 0, (int) Math.min(SKIP_BUFFER_SIZE, remaining));
und SKIP_BUFFER_SIZE = 2048

war ja so klar ... ich hatte read(byte[] b, int off, int len) schon abgehakt und nicht mehr daran gedacht, weil sie ja in InputStream schon implementiert wurde, aber wer den Javadoc dazu lesen kann ist stark im Vorteil.

"Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read as many as len bytes, but a smaller number may be read." - "Up to" gibt hier den entscheidenden Ausschlag.


War eindeutig zu früh für mein Gerhirn.

Danke für die schnelle Hilfe
Metta
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Eigener InputStream, Hilfe bei read-Methode Java Basics - Anfänger-Themen 6
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Dez-->Binär mit eigener bit Anzahl Erkennung. Java Basics - Anfänger-Themen 3
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
B Eigener Validierungseditor? Java Basics - Anfänger-Themen 3
W Eigener Iterator soll mehrdimensionales Array durchlaufen Java Basics - Anfänger-Themen 4
Bluedaishi Jar mit eigener JRE Java Basics - Anfänger-Themen 7
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
J Threads Problem mit eigener ArrayList Java Basics - Anfänger-Themen 2
E MCLauncher eigener Client workt nicht? Java Basics - Anfänger-Themen 4
A Input/Output Datenströme schließen in eigener Methode Java Basics - Anfänger-Themen 5
J Interface ActionListener in eigener Klasse Java Basics - Anfänger-Themen 27
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
M Messandwendung nach Zeit und eigener Eingabe Java Basics - Anfänger-Themen 4
N Schlüsselworte Bubble Sort nach eigener Ordnung Java Basics - Anfänger-Themen 8
E Compare-Funktion bei eigener Klasse Java Basics - Anfänger-Themen 4
Q ArrayList mit eigener Klasse in Java sotieren Java Basics - Anfänger-Themen 2
N BierSpiel von "Kopf bis Fuss" eigener Code...kleine Problemstellung. Java Basics - Anfänger-Themen 11
C OOP Erstellen eigener Objekte die es schon gibt "schlau"? Java Basics - Anfänger-Themen 3
V Arrays aus eigener Klasse erstellt, zuweisung aber spuckt Fehler in verbindung mit main Methode aus. Java Basics - Anfänger-Themen 3
L Eigener FilterReader Java Basics - Anfänger-Themen 12
E Mein eigener Listener (Hilfe gesucht) Java Basics - Anfänger-Themen 2
M import von eigener Klasse Java Basics - Anfänger-Themen 12
P ArrayList aus eigener Klasse "überschreibt" Werte nicht Java Basics - Anfänger-Themen 4
M xPos und yPos eigener Klassen geben lassen Java Basics - Anfänger-Themen 3
H Exit Befehl in eigener Konsole Java Basics - Anfänger-Themen 9
S Überladener Konstruktor und aufruf aus eigener Klasse Java Basics - Anfänger-Themen 2
D Klassen Problem mit Eigener Array-Klasse Java Basics - Anfänger-Themen 10
S [JUnit] eigener Testsuite Runner + Ausgabe Java Basics - Anfänger-Themen 6
G Eigener Autoboxing Datentyp Java Basics - Anfänger-Themen 3
B Datentypen Probleme mit eigenem Get() bei eigener HashMap Java Basics - Anfänger-Themen 6
B OOP Eigener Event-Listener erstellen Java Basics - Anfänger-Themen 4
G Datentypen "Liste" eigener Objekte durchsuchen Java Basics - Anfänger-Themen 6
S mit eigener Klasse JTextField ändern Java Basics - Anfänger-Themen 3
N Vektor mit eigener Datenstruktur sortieren Java Basics - Anfänger-Themen 20
I Datentypen Eigener DatenTyp Java Basics - Anfänger-Themen 2
B Ordner öffnen (eigener Dateibrowser) Java Basics - Anfänger-Themen 8
B Eigener Webserver + Eigener Webbrowser Java Basics - Anfänger-Themen 7
I eigener "Abstandshalter" vs. LayoutManager Java Basics - Anfänger-Themen 6
X eigener Mergesort auf generischen Typen mit Comparator Java Basics - Anfänger-Themen 6
K Sinn eigener Exceptions Java Basics - Anfänger-Themen 11
D Container mit eigener Klasse Java Basics - Anfänger-Themen 5
B Verwenden eigener Object-Klassen Java Basics - Anfänger-Themen 9
H Eigener Button Java Basics - Anfänger-Themen 2
M Eigener Iterator für LinkedList Java Basics - Anfänger-Themen 20
I Java eigener MSN Messenger schreiben Java Basics - Anfänger-Themen 3
R Event in eigener Klasse implementieren ? Java Basics - Anfänger-Themen 8
G Fortlaufende Aktualisierung bei eigener Klasse Java Basics - Anfänger-Themen 2
G IOException Problem in eigener Klasse Java Basics - Anfänger-Themen 8
B Import Problem mit eigener Klasse. Java Basics - Anfänger-Themen 8
G Eigener Parser Java Basics - Anfänger-Themen 4
T Problem mit eigener Klasse Java Basics - Anfänger-Themen 7
A eigener Explorer via Java? Java Basics - Anfänger-Themen 9
D Thread und Process Kommunikation bei eigener Console Java Basics - Anfänger-Themen 2
T Öffnen externer Datei als eigener Prozess Java Basics - Anfänger-Themen 8
G Datei aus eigener JAR-Datei verwende Java Basics - Anfänger-Themen 2
N Porblem mit dem Importieren eigener Pakete Java Basics - Anfänger-Themen 4
T ActionListener in eigener Klasse Java Basics - Anfänger-Themen 10
T ActionListener in eigener Klasse Java Basics - Anfänger-Themen 5
L ActionListener in eigener Klasse Java Basics - Anfänger-Themen 3
T Erstellen eigener packages Java Basics - Anfänger-Themen 6
G JMenuBar in eigener Klasse erstellen Java Basics - Anfänger-Themen 3
A Eigener Datentyp? Java Basics - Anfänger-Themen 39
F Eigener IP-Paket-Header Java Basics - Anfänger-Themen 15
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
berserkerdq2 inputstream und bufferedwirter /outputstream und bufferedwriter Java Basics - Anfänger-Themen 9
T Bluetooth, Inputstream Java Basics - Anfänger-Themen 0
I InputStream beim zweiten Mal fehlerhaft Java Basics - Anfänger-Themen 10
B Inputstream in file schreiben? Java Basics - Anfänger-Themen 23
B InputStream / OutputStream / PipedOutputStream und managedExecutorService Java Basics - Anfänger-Themen 3
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
B Hilfe bei InputStream To File Java Basics - Anfänger-Themen 22
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
B Konvertieren: Outputstream zu Inputstream Java Basics - Anfänger-Themen 13
J Was genau macht die Methode close() im InputStream? Java Basics - Anfänger-Themen 5
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
D InputStream parsen und als Bilddatei abspeichern Java Basics - Anfänger-Themen 1
G Input/Output InputStream gibt nicht die Korrekten Werte aus Java Basics - Anfänger-Themen 10
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
P bytes aus einem InputStream zählen Java Basics - Anfänger-Themen 2
P InputStream eines Musik-Streams abspielen Java Basics - Anfänger-Themen 2
I Resize Image - Einlesen von InputStream Java Basics - Anfänger-Themen 3
T Input/Output Exception bei einem InputStream Java Basics - Anfänger-Themen 2
W ProcessBuilder InputStream in Array speichern Java Basics - Anfänger-Themen 3
K InputStream erstellen Java Basics - Anfänger-Themen 4
B Input/Output Data / Buffer / File Outstream Inputstream Java Basics - Anfänger-Themen 2
L Webservice soll InputStream übergeben bekommen Java Basics - Anfänger-Themen 7
C InputStream Java Basics - Anfänger-Themen 2
O Input/Output Fragen zum InputStream Java Basics - Anfänger-Themen 7
E Input/Output Relativer Bild-Pfad für InputStream Java Basics - Anfänger-Themen 5
G Frage zu InputStream? Java Basics - Anfänger-Themen 11
E Socket InputStream "terminiert" nicht Java Basics - Anfänger-Themen 4
E Input/Output Inputstream während der Laufzeit füllen Java Basics - Anfänger-Themen 2
A Frage zu Beispiel eines Dekorierers von InputStream Java Basics - Anfänger-Themen 4
B Input/Output InputStream (JSch) in OutputStream (Blob) überführen Java Basics - Anfänger-Themen 8
P Input/Output InputStream Listener? Java Basics - Anfänger-Themen 7
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
A InputStream gibt nur jede 2te Zeile aus Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben