2013-06-13 6 views
2

Я пытаюсь написать два метода для отправки и получения файла с Java сокет в приложения клиент-сервер и у меня есть некоторые сомнения:Java, отправить и получить файл с сокеткой: нужно ли использовать bufferedinputstream и bufferedoutputstream?

Я использую FileInputStream и FileOutputStream. Есть BufferedInputStream и BufferedOutputStream лучше?

static protected long send_file(File file, DataOutputStream output) throws IOException, FileNotFoundException, SecurityException 
{ 
    byte[] buffer = new byte[1024]; 
    long count = 0; 
    int nread = 0; 

    FileInputStream file_input = new FileInputStream(file); 

    output.writeLong(file.length()); 

    while((nread = file_input.read(buffer)) != -1) 
    { 
     output.writeInt(nread); 

     output.write(buffer, 0, nread); 
     count += nread; 
    } 

    output.flush(); 
    file_input.close(); 

    return count; 
} 


static protected long receive_file(File file, DataInputStream input) throws IOException, FileNotFoundException, SecurityException, EOFException 
{ 
    byte[] buffer = new byte[1024]; 
    long dim_file = 0; 
    long count = 0; 
    int nbyte = 0; 
    int nread = 0; 
    int n = 0; 

    FileOutputStream file_output = new FileOutputStream(file); 

    dim_file = input.readLong(); 

    while(count < dim_file) 
    { 
     nbyte = input.readInt(); 

     nread = input.read(buffer, 0, nbyte); 
     if(nread == -1) 
     { 
      file_output.close(); 
      throw new EOFException(); 
     } 

     while(nread < nbyte) 
     { 
      n = input.read(buffer, nread, nbyte-nread); 

      if(n == -1) 
      { 
       file_output.close(); 
       throw new EOFException(); 
      } 

      nread += n; 
     } 

     file_output.write(buffer, 0, nread); 

     count += nread; 
    } 

    file_output.flush(); 
    file_output.close(); 

    return count; 
} 

Я не понимаю необходимость BufferedInputStream и BufferedOutputStream:

В первом методе я использую буфер 1024 байта и первый заполняю его , а затем отправить его в гнездо с DataOutputStream.write(byte[] b, int off, int len) ,

Во втором методе idem: сначала я заполняю буфер DataInputStream.read(byte[] b), а затем записываю файл FileOutputStream.write(byte[] b, int off, int len).

Так зачем использовать BufferedInputStream и BufferedOutputStream? Таким образом, если я понимаю, как они работают, я пишу байты сначала в своем буфере, а затем BufferedInputStream и BufferedOutputStream копирует байты в свой буфер.

+0

Необходимо, нет. Желательно, да. – EJP

ответ

0

Если вы не используют буферные потоки Java IO сделает операционную систему вызова каждый раз вы пишете/читаете байт, записывает ли он/чтение в файл или сокет, что крайне неэффективно.

+0

Каждый раз, когда вы вызываете метод чтения или записи *. Не то же самое. – EJP

+0

Почему? FileInputStream.read() - native, FileOutputStream.write (byte) - native –

+0

Но я использую свой собственный буфер с FileInputStream.read (byte [] b) и DataInputStream.read (byte [] b). –

2

Это не о лучшем. Они предлагают разные вещи. В то время как fileoutputstream записывает в файл, BuffereOutputStreams записывает в буфер (отсюда и имена :)). Вы должны комбинировать их, чтобы получить лучшую производительность. например

BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream("output.txt")) 

Ваша программа будет первым написать все в буфер, и только дамп в файл, когда вы очистить буфер

+0

Итак, у меня будет: ... socket DataInputStream ---> buffer [1024] ---> BufferedOutputStream ---> buffer [?] ----> FileOutputStream ----> Файл. Но какой размер буфера я должен использовать для BufferedOutputStream? По умолчанию? –