2016-10-01 14 views
0

받은 데이터를 저장하려고하는 안드로이드에 bmp 파일과 클라이언트를 보내는 서버가 있습니다.자바에서 수신 된 데이터 저장

... 
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 B가 byte.The @가 ID.The의 16 진수의 형태는 오브젝트 ID 또는 해시되어 분리 수단).

"PrintWriter"대신 "PrintStream"을 사용해도 같은 결과가 나타납니다 ...

어떻게 실제 출력을 저장할 수 있습니까?

+1

'FileOutputStream'에서'BufferedOutputStream'을 만들고'write (byte [])'메소드를 사용해 보았습니까? –

+1

'Rbuffer = 새로운 바이트 [2000];'. bmp 파일이 2000 바이트보다 작습니까? – greenapps

+0

'dir.mkdirs();'. 반환 값을 확인하십시오. 거짓 일 수 있습니다. false 인 경우 코드를 계속 사용하지만 축배를 표시하고 반환하십시오. – 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();