2017-02-10 21 views
0

У меня есть следующий код для загрузки файла с клиента на сервер tcp, но когда я пытаюсь открыть вручную, файл пуст, почему хороший вес. У меня есть много сообщений в stackOverflow, но ничего не меняют Thx (Извините за мой плохой английский)
Сервер:BufferedOuputStream сделать пустой файл

общественный класс ThreadServer расширяет тему {

private Socket soc; 
private FileOutputStream fos; 
private BufferedOutputStream bos; 
private InputStream in; 

public ThreadServer (Socket soc) { 
    this.soc = soc; 
} 

public void run(){ 
    try { 
     fos = new FileOutputStream("C:/Users/erwan/workspace/Word/server/text.txt"); 
    } catch (FileNotFoundException e1) { 
     e1.printStackTrace(); 
    } 
    bos = new BufferedOutputStream(fos); 
    byte[] buffer = new byte[1024]; 
    try { 
     in = soc.getInputStream(); 
     int count = 0; 
     while((count= in.read(buffer, 0 , buffer.length)) != -1) { 
      System.out.println(count+" octets received...");     
      bos.write(buffer); 
     } 
     bos.flush(); 
     bos.close(); 
     in.close(); 
     soc.close(); 
     System.out.println("File sent succesfully!"); 
    }catch(IOException e){ 
     e.printStackTrace(); 
     System.out.println("Une erreur est survenu"); 
    } 
} 

}

клиент:

public class Client { 
private static Socket as; 
private static FileInputStream fis; 
private static BufferedInputStream bis; 
private static OutputStream out; 
public static void main(String[] args){ 
    as = null; 
    try{ 
     as = new Socket(InetAddress.getLocalHost(),4020); 

     File f = new File (args[0]); 
     byte [] buffer = new byte [(int) f.length()]; 
     fis = new FileInputStream(f); 
     setBis(new BufferedInputStream(fis)); 
     out = as.getOutputStream(); 
     System.out.println("uploading..."); 
     out.write(buffer,0,buffer.length); 
     out.flush(); 
     out.close(); 
     System.out.println("the file is uploaded."); 
     as.close(); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 

}

ответ

0

Буфер в клиенте не кажется, заполняется данными. Он инициализируется как массив байтов с длиной файла, но во входном потоке нет вызовов метода чтения. Для тестирования fis.read (buffer), вероятно, быстро получите некоторые данные в буфер. Имейте в виду, что чтение не гарантирует заполнения всей длины буфера. Поэтому, особенно если ваш файл содержит нули, тогда недостаток чтения фактических данных в буфер (клиента) является вероятным виновником.

Кроме этого, код сервера также предполагает, что метод чтения полностью заполняет буфер, поэтому вызов метода записи должен указывать длину (количество). Поэтому измените bos.write (buffer) на bos.write (bos, 0, count). Это, вероятно, станет очевидным в конце файла (если файл длиннее 1024 байта), так как конец файла станет повторением некоторых данных из предыдущего фрагмента.

+0

Я действительно не понимаю, почему fis.read (buffer, 0, buffer.lenght) решил проблему, но на самом деле спасибо вам за ответ: Если вы можете объяснить мне снова, как работают dos? thx –

+0

Да. Это действительно не так сложно. Вы сделали новый байт [(int) f.length()]. Это то, что выделяет область памяти для хранения байтов f.length(). Он не помещает данные в эти байты памяти. В большинстве случаев массив был бы инициализирован байтами нулей (двоичные нули, поэтому часто отображались как странные символы в редакторе) jvm. Чтобы поместить данные из вашего входного файла в ваш вновь созданный массив, вам нужно сделать fis.read. –

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

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