2014-09-21 1 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

Эта строка кода пытается сделать который имеет тот же размер, что и файл, который вы читаете, позволяя ему считывать весь файл в массив байтов в одном чтении.

Второй блок кода «предполагает», что файл длиной не более 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.File предлагает long length() значение long ist cast to (int). Сделайте DDuckinG и изучите предлагаемые учебные пособия.

 Смежные вопросы

  • Нет связанных вопросов^_^