Java - Преобразование данных из DataOutputStream в файл, где размер DataOutputStream неизвестен - PullRequest
1 голос
/ 25 октября 2019

Это упрощенная версия моей программы. У меня есть файл Server.java, в котором я читаю «b.txt» в байтовый массив, а затем записываю его в DataOutputStream.

import java.io.*;
import java.net.*;

class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(4000);
            Socket s = ss.accept();

            DataOutputStream dout = new DataOutputStream(s.getOutputStream());

            byte[] byteArray = new byte[32];

            File tempFile = new File("Files/b.txt");
            FileInputStream fis = new 

            FileInputStream(tempFile);

            fis.read(byteArray);
            fis.close();

            dout.write(byteArray);
            dout.flush();
            dout.close();

            s.close();

        } catch (Exception e) {
            //handle exceptions
        }
    } 
}

В Client.java я считываю DataInputStream в byteArray. Затем я создаю FileOutputStream. В закомментированном коде fos.write (byteArray) это записывает в файл, однако, поскольку фактический файл может быть не ровно 32 байта, я остался с поврежденным файлом, так как оставшиеся байты просто заполняются случайными данными (или что-то происходит)).

import java.io.*;
import java.net.*;

class Client {
    public static void main(String[] args) {
        try {
            Socket s = new Socket("localhost", 4000);
            DataInputStream din = new DataInputStream(s.getInputStream());

            byte[] byteArray = new byte[32];

            FileOutputStream fos = new FileOutputStream("Downloaded/testfile.txt");
            //fos.write(byteArray);

            int count;
            while ((count = din.read(byteArray)) > 0) {
                fos.write(byteArray, 0, count);
            }

            fos.close();
            din.close();

            s.close();

        } catch (Exception e) {
            //handle exceptions
        }
    }
}

Итак, я посмотрел, как это исправить, и во многих местах мне сказали сделать код, который есть внутри цикла while: while ((count = din.read ... и т. Д.).

Однако, когда я пытаюсь это сделать, testfile.txt остается пустым и содержит 0 байтов. Я что-то упустил здесь? Я попытался отправить правильное количество байтов с сервера, однако это ничего не меняет.

Я хотел бы иметь возможность передавать файлы любого типа, поэтому важно, чтобы я мог передавать правильное количество байтов, не повреждая данные, так как байты "зависают". Спасибо.

...