2016-10-01 3 views
0

У меня есть сервер, который отправляет файл bmp и клиент на Android, где я пытаюсь сохранить данные, которые я получил. я сохранить данные в файл, используя следующий код:Сохранить полученные данные в 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(); 
    } 
} 

Но на выходе я получаю идентификаторы объектов

например [B @ 23fgfgre [B @ eft908eh ...

(где [означает array.The В означает byte.The @ отделяет тип из шестнадцатеричных цифр ID.The являются идентификатор объекта или хэш-код.)

Тот же результат, который я получаю даже с помощью «PrintStream» вместо «PrintWriter» ...

Как сохранить реальный выход?

+1

Вы пытались создать 'BufferedOutputStream' из вашего' FileOutputStream' и с помощью 'записи (байт [])' метод? –

+1

'Rbuffer = новый байт [2000];'. Ваш файл bmp меньше 2000 байт? – greenapps

+0

'dir.mkdirs();'. Проверьте возвращаемое значение. Это может быть неверно. Не продолжайте свой код, если он неверен, но отображает тост и возвращает. – greenapps

ответ

1

слово «печать» в названиях PrintWriter и PrintStream должны дать вам подсказку, что они генерируют текст. Если вы внимательно прочтете документацию, это прямо указано там.

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

Specfically, документация для print(Object obj) перегрузки PrintWriter, что вы используете явно говорит

Печать объекта. Строка, созданная методом String.valueOf (Object), преобразуется в байты в соответствии с кодировкой символов по умолчанию для платформы, и эти байты записываются точно так же, как метод write (int).

Очевидно, что это не то, что вы хотите. У вас есть массив байтов, и вы хотите записать эти байты в файл, точно так же, как они есть. Итак, забудьте о PrintWriter и PrintStream. Вместо этого, сделать что-то вроде этого:

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

Я использовал его, но файл становится слишком большим за пару секунд ... Согласно java manual write(): Записывает b.length байты из указанного массива байтов в этот выходной поток файла. –

+0

Я не могу понять, почему это происходит ... –

+0

Это совершенно другой вопрос. Мы не знаем, как вы используете этот код, откуда вы получаете свои данные, с какой скоростью поступают данные и т. Д.Отправьте новый вопрос, в комплекте с http://stackoverflow.com/help/mcve И примерными входными данными, и посмотрите, получите ли вы ответ на этот вопрос. –

2

Try:

FileOutputStream f = new FileOutputStream(file, true); 
f.write(inputMsg); 
f.close(); 
Смежные вопросы