2012-04-18 2 views
0

DataStream을 사용하여 여러 파일을 보내면됩니다. 파일의 이름과 파일의 바이트를 보내서이 작업을 수행합니다. 나는 파일의 미정 된 숫자를 보내야합니다. 다음은 DataOutputStream 코드입니다.DataInputStream에서 여러 바이트 [] 읽는 중

  out.writeUTF(path); 
      out.write(Files.readAllBytes(file.toPath())); 

각 파일을 전송해야합니다. 하지만 DataInputStream을 올바르게 읽는 법을 모르겠습니다. 이것은 내가 지금까지 가지고있는 것이다.

while (in.available() != 0) { 
     String path = in.readUTF(); 
     byte bytes = in.readByte(); 
    } 

분명히 1 바이트를 읽으므로 작동하지 않을 것입니다. 그러나 모든 바이트를 읽는 방법을 모르겠습니다. 여러 파일이 전송되기 때문에 available()은 모든 파일의 끝을 읽을 때만 0과 같을 것이라고 생각합니다. 어떤 도움이라도 대단히 감사합니다.

내가 언급 한 것을 완전히 잊어 버렸습니다. 메모리가 부족하여 큰 파일을 보낼 수 있기를 원하며, 이것이 작동하지 않을 것이라고 생각합니다. 내가 버퍼를 사용해야 할 것 같아요,하지만 어떤 클래스가 파일을 지원하는지 모르겠습니다.

+0

왜 각 바이트를 작성 별도로 대신 한 번에 전체 바이트 배열을 쓰고있다? –

+0

@JonSkeet 특별한 이유가 없습니다. 그렇게하는 것이 낫겠습니까? – Stripies

+0

어떻게 DataInputStream을 초기화 했습니까? init이 맞는지 확실합니까? 당신은 단계를 밟아서 한 번만 읽고 독신이라고 결정 했습니까? 읽은 내용이 파일의 내용입니까? 아니면 init이 올바르지 않아서 아무것도 읽지 않으십니까? – Churk

답변

2

가변 길이 메시지를 보낼 때마다 각 방법의 시작과 끝을 표시 할 방법이 필요합니다. 그런 다음

List<File> files = someListOfFilesYouWantToSend; 
out.writeInt(files.size()); 
for(File file : files){ 
    out.writeUTF(path); 
    out.writeLong(file.getTotalSpace()); 
    out.write(Files.readAllBytes(file.toPath())); 
} 

은 같은 것을 할 것입니다 그것을 읽어

int filesToRead = in.readInt();  
for(int i = 0; i < filesToRead; i++){ 
    String path = in.readUTF(); 
    long bytesToRead = in.readLong();  
    FileOutputSteam fos = new FileOutputStream(path); 

    byte[] buffer = new byte[1024]; 
    while(bytesToRead > 0){ 
    bytesRead = in.read(buffer,0,bytesToRead > buffer.length ? buffer.length : bytesToRead); 
    bytesToRead -= bytesRead; 
    fos.write(buffer); 
    } 
} 
0

그건 방법이 아닙니다 ... 왜 아카이브 (예 : JAR 또는 ZIP)로 보낼 모든 파일을 간단하게 보관하지 않습니까? 수신 측에서는 아카이브를 추출 할 수 있습니다. Java에는 사용할 수있는 내장 java.util.jar의 JAR 구현이 있습니다.

+1

이것은 구현에 대한 의견 일 뿐이지 만 지퍼 링 또는 jaring 작업은 옵션이 아닐 수도 있습니다. 당신이 현장에서 수출하지 않는 한 '그렇게하는 것이 아닙니다'라고 말하는 것에 동의해야합니다. – Churk

+0

글쎄, 분명히 여기 질문에 대한 구현을 제안하고있다. 왜 옵션이 아닌가요? 예를 들어 Gmail은 여러 첨부 파일을 보관 파일로 전송합니다. – smichak

+0

Gmail이하는 일, 권장 사항이 아니므로 Gmail에서 하나씩 다운로드 할 수 있도록 허용하고 있습니다. 그렇다면 귀하의 요점은 무엇입니까?당신의 의견이 더 유효하기 때문에 누군가에게 말하는 것은 뭔가를하는 방법이 아닙니다. 기술적 인 질문에 대한 유효한 해결책을 제시하지 않았다면, 주장을 뒷받침하는 작동 코드가 없다는 또 다른 구현을 간략하게 설명하십시오. 저자가 자신의 문제에 더 많은 것을 추가하기 위해 고치려고하는 것을 살펴 봅시다. – Churk