BufferedInputStream auslesen mit Bitverschiebung

Status
Nicht offen für weitere Antworten.

0001001

Bekanntes Mitglied
Kann mir jemand mit folgender Methode helfen, die ich im Netz gefunden habe, helfen:

Code:
	public byte[] read(BufferedInputStream inputtream) throws Exception{

		byte[] pSize = new byte[4];
		int nTotal = 0;
		int nRead = 0;
		while(nTotal<4){	
			nRead = inputtream.read(pSize,nTotal,4-nTotal);
			if(nRead<0) break;
			nTotal += nRead;
		}
		int nSize = (pSize[0]&0x000000ff)|((pSize[1]&0x000000ff)<<8)|((pSize[2]&0x000000ff)<<16)|((pSize[3]&0x000000ff)<<24);
		
		if(nSize==0){
			return "".getBytes();
		}
		byte[] pData = new byte[nSize];
		nTotal = 0;
		nRead = 0;
		while(nTotal<nSize){	
			nRead = inputtream.read(pData,nTotal,nSize-nTotal);
			if(nRead<0) break;
			nTotal += nRead;
		}
		return pData;
	}

Das die Methode einen Stream ausliest und das Ergebnis in einem byte[] zurückgibt ist mir klar. Allerding verstehe ich die Zeile:
Code:
		int nSize = (pSize[0]&0x000000ff)|((pSize[1]&0x000000ff)<<8)|((pSize[2]&0x000000ff)<<16)|((pSize[3]&0x000000ff)<<24);
nicht.

Kann mir das jemand erklären?
 

Ark

Top Contributor
In der Datei steht zu Beginn eine Art Header, in dem mindestens die Größe der eigentlichen Daten vermerkt ist, und zwar in 4 Bytes mit Little-Endian-Ordnung. Diese Bytes für die Größenangabe werden in der Zeile zu einem int zusammengezogen, um sie für Java zur Angabe der Arraygröße nutzbar/verarbeitbar zu machen.

BTW: Der Code ist vergleichsweise umständlich geschrieben (und damit meine ich nicht nur die genannte Zeile).

Ark
 

0001001

Bekanntes Mitglied
Ich würde die Methode gerne verwenden, weil die Methode laut Autor unabhängig von der Kodierung der Daten im Stream ist.

Allerdings wirft die Methode unter Umständen eine OutOfMemoryError Exception, wie hier zu sehen ist:

Füttert man folgende Demo mit einer Textdatei mit dem Inhalt:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Code:
import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class Test {
	public static void main(String[] args) {
		new Test().start();
	}
	
	public void start(){
		try {
			BufferedInputStream in = new BufferedInputStream( new FileInputStream("test.txt") );
			byte[] b = read(in);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}

	
	public static final byte[] read(BufferedInputStream inStream) throws Exception{
		byte[] pSize = new byte[4];
		int nTotal = 0;
		int nRead = 0;
		while(nTotal<4){	
			nRead = inStream.read(pSize,nTotal,4-nTotal);
			if(nRead<0) break;
			nTotal += nRead;
		}
		int nSize = (pSize[0]&0x000000ff)|((pSize[1]&0x000000ff)<<8)|((pSize[2]&0x000000ff)<<16)|((pSize[3]&0x000000ff)<<24);

		if(nSize==0){
			return "".getBytes();
		}
		byte[] pData = new byte[nSize];
		nTotal = 0;
		nRead = 0;
		while(nTotal<nSize){	
			nRead = inStream.read(pData,nTotal,nSize-nTotal);
			if(nRead<0) break;
			nTotal += nRead;
		}
		return pData;
	}
}

Die Frage ist nun, warum fliegt diese Exception?
 

Ark

Top Contributor
0001001 hat gesagt.:
Ich würde die Methode gerne verwenden, weil die Methode laut Autor unabhängig von der Kodierung der Daten im Stream ist.
Ich würde Abstand von diesem Autor nehmen, denn er hat wohl von informationstechnischen Dingen (und von der Java-API!) nicht wirklich Ahnung. Informationen aus Daten unabhängig von ihrer Kodierung zu extrahieren, kommt dem Versuch gleich, Wörter unabhängig von der ihr zu Grunde liegenden Sprache verstehen zu wollen.

Warum der Speicher nicht ausreicht, ist leicht geklärt: Wie bereits gesagt, werden mindestens 4 Bytes als Header ausgewertet, um das Volumen der Folgedaten zu erfassen. "aaaa" ergibt - abhängig von der Zeichensatzkodierung! - z.B. 0x61616161 (ASCII oder kompatibel). Das macht dann, wenn man diese Bytes als Größenangabe interpretiert, 1633771873 Bytes oder rund 1,52 GiB (Gibibyte) an Speicher, die reserviert werden. Aber selbst dieses Reservieren ist fast immer komplett sinnlos. Was auch immer der Autor da erzählt, ist Müll!

Ark
 

0001001

Bekanntes Mitglied
Ok,
du hast mich überzeugt.

Nun bleibt die Frage, wie man die Kodierung eines Streams herausbekommt.
 

Ark

Top Contributor
0001001 hat gesagt.:
Nun bleibt die Frage, wie man die Kodierung eines Streams herausbekommt.
Gar nicht. Man muss zumindest davon ausgehen, dass es sich um Daten in der erwarteten Kodierung handelt. Ansonsten kann man in einen Haufen von Nullen und Einsen alles hineininterpretieren, was man will.

In deinem Fall solltest du uns z.B. mitteilen, von welcher grundsätzlichen Art Information du ausgehst. Soll dieser Stream reinen Text enthalten? Oder ein Bild? PNG? JPEG? Oder ein Dokument in ODF? PDF? Oder Ton? AU? WAV? Solange du das nicht verrätst, ist dir nicht weiterzuhelfen. ;)

Ark
 

0001001

Bekanntes Mitglied
Daran soll es nicht scheitern: :)

Konkret mache ich folgendes:

Code:
Process proc = Runtime.getRuntime().exec(new String("cmd"),null);
InputStream inputStream = proc.getInputStream();

Die Ausgabe von cmd kommt ja in dem Stream zurück. Diesen würde ich gerne (mit jener Methode von oben) in ein byte[] auslesen.

Nur welche Kodierung hat ein solcher Stream der von cmd kommt?
 

Ark

Top Contributor
0001001 hat gesagt.:
Nur welche Kodierung hat ein solcher Stream der von cmd kommt?
Keine bestimmte. Das hängt mal wieder auch davon ab, was du mit den Daten anstellen willst. Vielleicht interpretiert cmd die Bytes als Text mit CP850, vielleicht aber auch als Text mit CP1252. Vielleicht ist es UTF-8. Das würde aber, wie gesagt, nur zutreffen, wenn es um Text geht. Wenn ich aber mir den Inhalt eines JPEG-Bildes ausgeben lasse (unter Linux geht das mit dem Befehl cat, und unter Windows, glaube ich, mit type), ist es eben JPEG. Vielleicht ist es aber dann auch schon mit CP850 interpretiert worden, vielleicht mit CP1252. Vielleicht aber auch gar nichts davon. Vielleicht gibt da jemand eine MP3-Datei aus. Wieder etwas ganz anderes ...

Aber vor allem: was willst du damit dann machen? Als Text anzeigen? Oder als Bild? Oder als Ton ausgeben? Oder in eine Datei schreiben? Fragen über Fragen ...

Ark
 

0001001

Bekanntes Mitglied
Naja wenn ich einen Kommandozeileninterpreter wie cmd verwende, dann um mit ihm Text ein- und auszugeben.
Selbst wenn ich mir mit type ein jpg ausgeben lasse:
C:\type Sonnenuntergang.jpg
↑Photoshop 3.0 8BIM♥ÝÝ
↑FX Global Lighting Angle ♦ x8BIM♦↓↕FX Global Altitude ♦ ▲8BIM♥¾♂Print
Flags ☺ 8BIM♦
♫Copyright Flag ☺ 8BIM'►¶Japanese Print Flags
☺ ☻8BIM♥§↨Color Halftone Settings H /ff ☺ lff ♠ ☺ /ff ☺ íÖÜ ♠ ☺
2 ☺ Z ♠ ☺ 5 ☺ - ♠ ☺8BIM♥°↨Color Transfer Settings p         
              ♥Þ                       ♥Þ                       ♥Þ     
URL overrides ♦ 8BIM♦Guides ► ☺ ☻@ ☻@ 8BIM♦▲
Dann besitzt zwar das jpg eine bestimmte Kodierung, aber dadurch dass es auf der Konsole ausgegeben wurde, sollte die Kodierung der Konsole angewandt worden sein.

Was ich sagen will: Ein Stream von der Konsole muss doch eine bestimmte Kodierung (bspw. CP12529) besitzen.

Wie würdest du den Output der Konsole aus dem Stream lesen, wenn du ihn so ausgeben möchtest, wie er auch auf der Konsole aussehen würde?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Unterschied BufferedReader und BufferedInputStream Java Basics - Anfänger-Themen 4
D BufferedInputStream nur bestimmte Zeichen Java Basics - Anfänger-Themen 11
D BufferedInputStream zeile einlesen Java Basics - Anfänger-Themen 5
B FileinputStream und BufferedInputStream Java Basics - Anfänger-Themen 12
M BufferedOutputStream / BufferedInputStream Java Basics - Anfänger-Themen 5
K Wie funktioniert einFTP Up via BufferedInputStream usw? Java Basics - Anfänger-Themen 2
S BufferedInputStream -> String Java Basics - Anfänger-Themen 3
S Daten aus Import Datei auslesen und sortieren Java Basics - Anfänger-Themen 2
T array auslesen Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
D Eclipse will nicht auslesen Java Basics - Anfänger-Themen 6
E TIF Datei auslesen Java Basics - Anfänger-Themen 2
krgewb Breite und Höhe eines Bildes in base64 auslesen Java Basics - Anfänger-Themen 3
sserio TXT-Datei Auslesen und den Wert jedes Namen ausrechnen etc. Java Basics - Anfänger-Themen 37
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
U Sekunden von LocalTime auslesen, wie möglich? Java Basics - Anfänger-Themen 1
E Outlook ordner auslesen Java Basics - Anfänger-Themen 4
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
J Datei aus Netzwerk auslesen Java Basics - Anfänger-Themen 9
J Jsonfile auslesen Java Basics - Anfänger-Themen 8
A Eine Textdatei auslesen Java Basics - Anfänger-Themen 16
N Aus einem String die Anzahl der Vokale auslesen Java Basics - Anfänger-Themen 40
H Array rückwärts auslesen funktioniert nicht Java Basics - Anfänger-Themen 3
J Bestimmte parameter aus Jsonfile auslesen Java Basics - Anfänger-Themen 15
AleXusher Mehrdimensionales Array aus txt.file auslesen Java Basics - Anfänger-Themen 4
L Zeichen an bestimmter Stelle auslesen Java Basics - Anfänger-Themen 4
3 Textdatei Zeilenweise auslesen Java Basics - Anfänger-Themen 3
J Json Datei auslesen Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
S Tastatureingabe auslesen und in Konsole ausgeben Java Basics - Anfänger-Themen 6
S CSV Datei auslesen und anders darstellen Java Basics - Anfänger-Themen 2
G Scanner nutzen und Index auslesen Java Basics - Anfänger-Themen 8
N JTable auslesen Java Basics - Anfänger-Themen 6
N Java CSV Datei auslesen Java Basics - Anfänger-Themen 6
F Webseiten Quelltext auslesen Java Basics - Anfänger-Themen 5
J Datei auslesen (nur bestimmte Stellen) Java Basics - Anfänger-Themen 2
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
S Letzte Zahl eines Integer auslesen? Java Basics - Anfänger-Themen 3
G If / While Programm (Datei auslesen) Java Basics - Anfänger-Themen 6
S Aus einer .bz2 Datei auslesen Java Basics - Anfänger-Themen 2
K Textdatei auslesen und über Mqtt schicken Java Basics - Anfänger-Themen 4
B Name von Verzeichnis bekommen - Files von einem Ordner auslesen Java Basics - Anfänger-Themen 4
A Daten auslesen/vergleichen Java Basics - Anfänger-Themen 3
D XML von Seite auslesen Jsoup Java Basics - Anfänger-Themen 2
I Druckerauflösung auslesen - mittlerweile möglich? Java Basics - Anfänger-Themen 4
B WSDL auslesen? Java Basics - Anfänger-Themen 8
D Methoden Textdokument erstellen und auslesen. Java Basics - Anfänger-Themen 46
B HTML Code / Seite auslesen und JAVA Objekte erstellen Java Basics - Anfänger-Themen 12
S Datein auslesen und verarbeiten Java Basics - Anfänger-Themen 1
J Geld speichern und wieder auslesen Java Basics - Anfänger-Themen 10
S CSV auslesen UTF-8 Problem Java Basics - Anfänger-Themen 7
D Datei auslesen & Werte in Variable speichern Java Basics - Anfänger-Themen 12
K String buchstaben auslesen Java Basics - Anfänger-Themen 9
S Amazon Produktbeschreibung auslesen und nach Keywords suchen Java Basics - Anfänger-Themen 2
x-tshainge Interface Wie kann ich aus Textfeldern auslesen Java Basics - Anfänger-Themen 6
Z Ersten Buchstaben eines Elements eines String-Arrays auslesen Java Basics - Anfänger-Themen 5
B .txt. Datei auslesen und bestimmten Wert wiedergeben Java Basics - Anfänger-Themen 5
CptK x wert eines Bildes auslesen Java Basics - Anfänger-Themen 1
T Website auslesen Java Basics - Anfänger-Themen 2
T String auslesen bzw. überprüfen Java Basics - Anfänger-Themen 1
L CSV Auslesen Java Basics - Anfänger-Themen 5
B Auslesen von PDF / Bilder Java Basics - Anfänger-Themen 5
das_leon Alle Zeilen einer CSV-Datei auslesen Java Basics - Anfänger-Themen 1
D Mit Java HTML bzw Javascript auslesen Java Basics - Anfänger-Themen 1
F Arrays Sätze speichern und einzelne Worte mit Index Angabe auslesen Java Basics - Anfänger-Themen 4
F Zwischenwerte aus Browser auslesen Java Basics - Anfänger-Themen 19
S Jede Ziffer einer Zahl auslesen, damit rechnen und beim Ergebnis wiederholen ? Java Basics - Anfänger-Themen 20
G Servlet - externe HTML (URL) auslesen Java Basics - Anfänger-Themen 1
T class Datei auslesen Java Java Basics - Anfänger-Themen 5
P Liste auslesen und in Variablen speichern Java Basics - Anfänger-Themen 7
D String erste Zahl mit LKZ auslesen lassen Java Basics - Anfänger-Themen 36
J Hashmap auslesen Java Basics - Anfänger-Themen 7
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
D String untereinander auslesen lassen Java Basics - Anfänger-Themen 2
M Aus Datei auslesen und untersuchen ob diese Zeile schon vorhanden ist Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Variablen Zahlen aus Strings auslesen Java Basics - Anfänger-Themen 4
J Informationen aus Webseiten auslesen Java Basics - Anfänger-Themen 1
S Text aus einer HTML Datei auslesen Java Basics - Anfänger-Themen 1
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
dragonfight86 Erste Schritte OpenDocument auslesen Java Basics - Anfänger-Themen 13
I Texte mit Absätzen in Dateien speichern und auslesen Java Basics - Anfänger-Themen 1
W DNS Name auslesen + weitere Anfängerfrage Java Basics - Anfänger-Themen 4
C Werte aus JTable auslesen Java Basics - Anfänger-Themen 4
Chrizzey45 Calc-Dokument in Java auslesen? Java Basics - Anfänger-Themen 2
B Datei auslesen und 2D-Array anlegen Java Basics - Anfänger-Themen 1
B Key auslesen/ausgeben innerhalb von foreach() Java Basics - Anfänger-Themen 5
M Eigenschaften einer Datei auslesen Java Basics - Anfänger-Themen 5
M Textarea auslesen und beschreiben Java Basics - Anfänger-Themen 8
JokerBlacky Klassen Klasse Queue Klasse mit Attributen anhängen und auslesen können Java Basics - Anfänger-Themen 4
Y Bildschirmauflösung auslesen Java Basics - Anfänger-Themen 4
S for schleife auslesen Java Basics - Anfänger-Themen 4
Voreck String Zeichen für Zeichen auslesen Java Basics - Anfänger-Themen 9
Voreck Array aus txt datei auslesen Java Basics - Anfänger-Themen 2
N JFreeChart --> TimeSeries auslesen Java Basics - Anfänger-Themen 9
OlafHD Datei Auslesen Java Basics - Anfänger-Themen 6
M Metadaten OpenOffice mit Java auslesen Java Basics - Anfänger-Themen 9
P JList, aus selectedValue bestimmten Wert aus Containerklasse auslesen Java Basics - Anfänger-Themen 4
J OpenOffice Dokumentenvariable mit Java auslesen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben