BufferedOuputStream сделать пустой файл

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

открытый класс 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();
    }   

}

1 ответ

Решение

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

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

Другие вопросы по тегам