2016-10-01 3 views
0

Ich habe Server, der BMP-Datei und einen Client in Android sendet, wo ich versuche, die Daten zu speichern, die ich erhielt. ich die Daten in einer Datei speichern mit dem folgenden Code:Speichern Sie empfangene Daten in Java

... 
byte[] Rbuffer = new byte[2000]; 
dis.read(Rbuffer); 

try { 
    writeSDCard.writeToSDFile(Rbuffer); 
    } catch (Exception e) { 
    Log.e("TCP", "S: Error at file write", e); 

    } finally { 
    Log.e("Writer", "S: Is it written?"); 
    } 
... 

void writeToSDFile(byte[] inputMsg){ 

    // Find the root of the external storage. 
    // See http://developer.android.com/guide/topics/data/data- storage.html#filesExternal 

    File root = android.os.Environment.getExternalStorageDirectory(); 

    File dir = new File (root.getAbsolutePath() + "/download"); 
    if (!(dir.exists())) { 
     dir.mkdirs(); 
    } 
    Log.d("WriteSDCard", "Start writing"); 

    File file = new File(dir, "myData.txt"); 

    try { 
    // Start writing in the file without overwriting previous data (true input) 
     Log.d("WriteSDCard", "Start writing 1"); 
     FileOutputStream f = new FileOutputStream(file, true); 
     PrintWriter ps = new PrintWriter(f); 
//  PrintStream ps = new PrintStream(f); 
     ps.print(inputMsg); 
     ps.flush(); 
     ps.close(); 
     Log.d("WriteSDCard", "Start writing 2"); 
     f.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     Log.i(TAG, "******* File not found. Did you" + 
       " add a WRITE_EXTERNAL_STORAGE permission to the manifest?"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Aber in der Ausgabe erhalte ich den Objekt-IDs

z.B. [B @ 23fgfgre [B @ eft908eh ...

(Wo [Mittel Array B bedeutet byte.The @ der Typ von den Hexadezimalziffern ID.The trennt eine Objekt-ID oder Hash-Code sind.)

Das gleiche Ergebnis erhalte ich auch mit "PrintStream" anstelle von "PrintWriter" ...

Wie kann ich die tatsächliche Ausgabe speichern?

+1

Haben Sie versucht, eine 'BufferedOutputStream' aus Ihrem' FileOutputStream' Erstellung und Verwendung der 'write (byte [])' Methode? –

+1

'Rbuffer = neues Byte [2000];'. Ist Ihre BMP-Datei kleiner als 2000 Byte? – greenapps

+0

'dir.mkdirs();'. Überprüfen Sie den Rückgabewert. Es kann falsch sein. Fahren Sie nicht mit Ihrem Code fort, wenn dieser falsch ist, sondern einen Toast anzeigen und zurückkehren. – greenapps

Antwort

1

Das Wort "Druck" in den Namen von PrintWriter und PrintStream sollten Sie einen Hinweis geben, dass sie Text erzeugen. Wenn Sie die Dokumentation gründlich lesen, wird dies ausdrücklich dort angegeben.

https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#print(java.lang.Object)

specfically, die Dokumentation für die print(Object obj) Überlastung von PrintWriter, die Sie explizit verwenden, sagt

ein Objekt gedruckt wird. Die von der String.valueOf (Object) -Methode erzeugte Zeichenfolge wird entsprechend der standardmäßigen Zeichencodierung der Plattform in Bytes übersetzt, und diese Bytes werden genau wie die write (int) -Methode geschrieben.

Klar, das ist nicht das, was Sie wollen. Sie haben ein Array von Bytes und möchten diese Bytes genau so in eine Datei schreiben, wie sie sind. Also, vergessen Sie PrintWriter und PrintStream. Stattdessen tun Sie etwas wie folgt aus:

BufferedOutputStream bos = new BufferedOutputStream(f); 
bos.write(inputMsg); 
//bos.flush(); stop. always. flushing. close. does. that. 
bos.close(); 
+0

Ich benutzte es, aber die Datei wird in ein paar Sekunden zu groß ... Laut java manuell write(): Schreibt b.length Bytes aus dem angegebenen Byte-Array in diesen Datei-Ausgabestream. –

+0

Ich kann nicht verstehen, warum passiert ... –

+0

Das ist eine ganz andere Frage. Wir haben keine Ahnung, wie Sie diesen Code verwenden, woher Sie Ihre Daten erhalten, mit welcher Geschwindigkeit die Daten eingehen usw.Stellen Sie eine neue Frage, füllen Sie eine http://stackoverflow.com/help/mcve AND Beispiel-Eingabedaten aus und sehen Sie, ob Sie eine Antwort auf diese Frage erhalten. –

2

Versuchen:

FileOutputStream f = new FileOutputStream(file, true); 
f.write(inputMsg); 
f.close();