2016-10-01 5 views
0

私は受け取ったデータを保存しようとするAndroidにbmpファイルとクライアントを送信するサーバーを持っています。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(); 
    } 
} 

しかし、出力に、私はオブジェクトID

例えばを受け取る: 私は、次のコードを使用してファイル内のデータを保存します [B @の23fgfgre [Bする@ eft908eh ...

(【がarray.The Bはbyte.The @はID.The六角桁から型がオブジェクトIDまたはハッシュコードである分離手段)

"PrintWriter"の代わりに "PrintStream"を使用しても同じ結果が得られます...

実際の出力を保存するにはどうしたらいいですか?

+1

'FileOutputStream'から' BufferedOutputStream'を作成し、 'write(byte [])'メソッドを使ってみましたか? –

+1

'Rbuffer =新しいバイト[2000];'。あなたのbmpファイルは2000バイトより小さいですか? – greenapps

+0

'dir.mkdirs();'戻り値を確認してください。それは誤っている可能性があります。それが偽であるが、トーストと戻り値を表示するならば、あなたのコードを続行しないでください。 – greenapps

答えて

1

単語「印刷」。ドキュメントを徹底的に読むと、明示的にそこに記載されています。

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

Specfically、使用しているPrintWriterprint(Object obj)過負荷のドキュメントは、明示的に

は、オブジェクトを印刷しますと言います。 String.valueOf(Object)メソッドによって生成された文字列は、プラットフォームのデフォルト文字エンコーディングに従ってバイトに変換され、これらのバイトはwrite(int)メソッドとまったく同じ方法で書き込まれます。

明らかに、それはあなたが望むものではありません。あなたはバイトの配列を持っていて、それらのバイトをそのままファイルに書きたいと思っています。ですから、PrintWriterPrintStreamを忘れてしまいます。代わりに、次のようなことをしてください:

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

私はそれを使用しましたが、ファイルは数秒で大きすぎます... javaマニュアルによるとwrite():b.lengthバイトを指定されたバイト配列からこのファイル出力ストリームに書き込みます。 –

+0

私はなぜそれが起こっているのか理解できません... –

+0

それはまったく異なる質問です。このコードをどのように使っているのか、どこからデータを取得したのか、データの到着率などではわかりません。新しい質問を投稿し、http://stackoverflow.com/help/mcveで入力データを入力し、その質問に対する回答があるかどうかを確認してください。 –

2

試してください:あなたは、彼らがテキストを生成することをヒントを与える必要がありPrintWriterPrintStreamの名前に

FileOutputStream f = new FileOutputStream(file, true); 
f.write(inputMsg); 
f.close(); 
関連する問題