У меня есть следующий код для загрузки файла с клиента на сервер 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();
}
}
Я действительно не понимаю, почему fis.read (buffer, 0, buffer.lenght) решил проблему, но на самом деле спасибо вам за ответ: Если вы можете объяснить мне снова, как работают dos? thx –
Да. Это действительно не так сложно. Вы сделали новый байт [(int) f.length()]. Это то, что выделяет область памяти для хранения байтов f.length(). Он не помещает данные в эти байты памяти. В большинстве случаев массив был бы инициализирован байтами нулей (двоичные нули, поэтому часто отображались как странные символы в редакторе) jvm. Чтобы поместить данные из вашего входного файла в ваш вновь созданный массив, вам нужно сделать fis.read. –