2014-09-21 2 views
-1

Java 소켓에서 파일을 전송하는 코드를 작성했지만 확장하려고합니다. 내가 원하는 파일을 선택하고 싶습니다.소켓을 통한 파일 전송

가 여기 내 실제 코드의
byte[] mybytearray = new byte[(int) myFile.length()]; 

: : 그리고 한 줄의 코드를 이해하지 못하는

import import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Main { 
    public static void main(String[] args) throws IOException { 
     ServerSocket servsock = new ServerSocket(123456); 
     File myFile = new File("s.pdf"); 

     while (true) { 
      Socket sock = servsock.accept(); 
      byte[] mybytearray = new byte[(int) myFile.length()]; 
      BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile)); 
      bis.read(mybytearray, 0, mybytearray.length); 
      OutputStream os = sock.getOutputStream(); 
      os.write(mybytearray, 0, mybytearray.length); 
      os.flush(); 
      sock.close(); 
     } 
    } 
} 

클라이언트 모듈 :

import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.Socket; 

public class Main { 
    public static void main(String[] argv) throws Exception { 
    Socket sock = new Socket("127.0.0.1", 123456); 
    byte[] mybytearray = new byte[1024]; 
    InputStream is = sock.getInputStream(); 
    FileOutputStream fos = new FileOutputStream("s.pdf"); 
    BufferedOutputStream bos = new BufferedOutputStream(fos); 
    int bytesRead = is.read(mybytearray, 0, mybytearray.length); 
    bos.write(mybytearray, 0, bytesRead); 
    bos.close(); 
    sock.close(); 
    } 
} 
+1

알아 듣겠습니까? 배열이 무엇인지 묻고 있습니까? – SLaks

+0

바이트 배열을 만듭니다. – SLaks

+0

코드를 이해하지 못한다면. 그렇다면 코드 조각을 어떻게 작성했는지 말씀해주십시오. – practice2perfect

답변

1

코드 줄은을 시도한다 읽는 파일과 크기가 같은 1 바이트 배열로, 단일 파일 읽기에서 전체 파일을 바이트 배열로 읽을 수 있습니다.

두 번째 코드 블록은 파일의 길이가 1024 바이트를 초과하지 않으며 '최대 길이'를 초과하지 않는다고 가정합니다. 파일이 < = 1024 바이트 길이라는 것을 알고 있습니까?

여러 가지 이유로 인해 스트림을 처리 할 때 가변 버퍼 크기를 갖는 것이 바람직하지 않습니다. 스트림의 장점은 전체 파일이 메모리에 저장되어 있지 않다는 것입니다.

{ 
     Socket sock = servsock.accept(); 
     byte[] mybytearray = new byte[4096]; 
     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile)); 
     OutputStream os = sock.getOutputStream(); 
     int amt = bis.read(mybytearray, 0, 4096); 
     while (amt>0) { 
      os.write(mybytearray, 0, amt); 
      amt = bis.read(mybytearray, 0, 4096); 
     } 
     os.flush(); 
     sock.close(); 
    } 

내가 무작위 임의의 크기로 4096을 선택하지만, 이것보다 더 큰 크기를 선택하는 진짜 이유는 없다 : 대신,이 패턴을 사용하여 ... 그것은 쉽게 충분하다. 이렇게하면 모든 크기의 파일 (심지어 기가 바이트), 전체 파일을 복사 할 수 있으며 파일이 커지면 메모리 부족 문제가 발생하지 않습니다.

0

The Java™ Tutorials, Trail: Learning the Java Language, Arrays을 살펴보십시오.

간단히 말해 : byte 유형의 요소에 대한 배열을 만들고 바이트 수는 myFile입니다. 배열 생성은 크기에 대해 int 값을 가지므로 java.io.Filelong length()을 제공하므로 long 값은 (int)으로 반환됩니다. DDuckinG을 수행하고 제공되는 자습서를 살펴보십시오.

관련 문제