Java FileoutputStream不';t在空行(换行)后输出任何字符串

Java FileoutputStream不';t在空行(换行)后输出任何字符串,java,file-io,client-server,fileinputstream,fileoutputstream,Java,File Io,Client Server,Fileinputstream,Fileoutputstream,在我的客户机-服务器应用程序中,当我尝试从服务器端下载一个文件时,该文件会被下载;但是标题信息,例如一些带有换行符的附加文本,无法读取。正如您在我的服务器类中看到的,以下信息应该在客户端打印出来 outputToClient.printf("Status OK\r\nSize %d Bytes\r\n\r\nFile %s Download was successfully\r\n", fileSize, filename)

在我的客户机-服务器应用程序中,当我尝试从服务器端下载一个文件时,该文件会被下载;但是标题信息,例如一些带有换行符的附加文本,无法读取。正如您在我的服务器类中看到的,以下信息应该在客户端打印出来

outputToClient.printf("Status OK\r\nSize %d Bytes\r\n\r\nFile %s Download was successfully\r\n",
                                    fileSize, filename);
但事实并非如此。仅打印
\r\n
之前的第一个字符串(状态正常),而不是
\r\n
之后的任何字符串

我怎样才能修好它

我的完整代码:

服务器端:

 public class ServerSide {

private BufferedReader inputFromClient;
private PrintWriter outputToClient;
private FileInputStream fis;
private OutputStream os;
private static final int PORT = 8000;
private ServerSocket serverSocket;
private Socket socket;

public static void main(String[] args) {
    int port = PORT;
    if (args.length == 1) {
        port = Integer.parseInt(args[0]);
    }
    new ServerSide(port);
}

private boolean fileExists(File[] files, String filename) {
    boolean exists = false;
    for (File file : files) {
        if (filename.equals(file.getName())) {
            exists = true;
        }
    }
    return exists;
}

public ServerSide(int port) {
    // create a server socket
    try {
        serverSocket = new ServerSocket(port);
    } catch (IOException ex) {
        System.out.println("Error in server socket creation.");
        System.exit(1);
    }

    while (true) {
        try {

            socket = serverSocket.accept();
             outputToClient = new PrintWriter(socket.getOutputStream());
            inputFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while (true) {

                String request = inputFromClient.readLine();

                if (!request.startsWith("exit") && !request.startsWith("pwd") && !request.startsWith("list") && !request.startsWith("GET")) {
                    outputToClient.println("Wrong request\r\n"
                            + "\r\n");
                } else if (request.startsWith("exit")) {
                    break;
                } else if (request.startsWith("pwd")) {
                    File file = new File(System.getProperty("user.dir"));
                    outputToClient.print("Status OK\r\n"
                            + "Lines 1\r\n"
                            + "\r\n"
                            + "Working dir: " + file.getName() + "\r\n");
                } else if (request.startsWith("list")) {
                    File file = new File(System.getProperty("user.dir"));
                    File[] files = file.listFiles();
                    outputToClient.print("Status OK\r\n"
                            + "Files " + files.length + "\r\n"
                            + "\r\n"
                            + Arrays.toString(files).substring(1, Arrays.toString(files).length() - 1) + "\r\n");
                } else if (request.startsWith("GET")) {
                    String filename = request.substring(4);
                    File file = new File(System.getProperty("user.dir"));
                    File[] files = file.listFiles();

                    if (fileExists(files, filename)) {
                        file = new File(filename);
                        int fileSize = (int) file.length();

                        outputToClient.printf("Status OK\r\nSize %d Bytes\r\n\r\nFile %s Download was successfully\r\n",
                                fileSize, filename);
                        outputToClient.flush();

                        try (FileInputStream fis = new FileInputStream(file)) {
                            os = socket.getOutputStream();
                            byte[] buffer = new byte[(1 << 7) - 1];
                            int bytesRead = 0;

                            while ((bytesRead = fis.read(buffer)) != -1) {
                                os.write(buffer, 0, bytesRead);
                            }

                        }
                        //os.close();
                       // fis.close();
                    } else {
                        outputToClient.print("Status 400\r\n"
                                + "File " + filename + " not found\r\n"
                                + "\r\n");
                        outputToClient.flush();
                    }
                }
                outputToClient.flush();
            }
        } catch (IOException e) {
            System.err.println(e);
        }

    }
}

您应该在final
outputToClient.flush()之后关闭输出流
outputToClient.close()
,谢谢,但它没有帮助。与以前的问题相同。您将
输出客户端.close()
放在哪里了?就在最终输出客户端.flush()之后
public class ClientSide {

private static Socket socket;
private static PrintWriter outputToServer;
private static BufferedReader inputFromServer;
private static InputStream is;
private static FileOutputStream fos;
private static final int PORT = 8000;
private static final String SERVER = "85.197.159.45";
boolean Connected;
DataInputStream serverInput;

public static void main(String[] args) throws InterruptedException {
    String server = "localhost";
    int port = PORT;

    if (args.length >= 1) {
        server = args[0];
    }
    if (args.length >= 2) {
        port = Integer.parseInt(args[1]);
    }

    new ClientSide(server, port);
}

public ClientSide(String server, int port) {

    try {
        socket = new Socket(server, port);
        serverInput = new DataInputStream(socket.getInputStream());
        outputToServer = new PrintWriter(socket.getOutputStream(), true);
        inputFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println("Client is connected! ");
        Connected = true;
        String line = null;

        Scanner sc = new Scanner(System.in);
        System.out.print("Type command: ");

        while (sc.hasNextLine()) {
            String request = sc.nextLine();

            if (request.startsWith("exit")) {
                outputToServer.println(request);
                System.out.println("Application exited!");
                //outputToServer.flush();
                break;
            } else if (request.startsWith("pwd")) {
                outputToServer.println(request);
                outputToServer.flush();
            } else if (request.startsWith("list")) {
                outputToServer.println(request);
                outputToServer.flush();
            } else if (request.startsWith("GET")) {
                System.out.print("\r\n");
                outputToServer.println(request);
                outputToServer.flush();
            }
            while (Connected) {
                line = inputFromServer.readLine();
                System.out.println(line);
                if (line.isEmpty()) {
                    Connected = false;
                    if (inputFromServer.ready()) {
                        System.out.println(inputFromServer.readLine());
                    }
                }
                if (line.startsWith("Status 400")) {
                    while (!(line = inputFromServer.readLine()).isEmpty()) {
                        System.out.println(line);
                    }
                    break;
                }
                if (request.startsWith("GET")) {
                    File file = new File(request.substring(4));
                    is = socket.getInputStream();
                    fos = new FileOutputStream(file);

                    byte[] buffer = new byte[socket.getReceiveBufferSize()];
                    serverInput = new DataInputStream(socket.getInputStream());
                    //int bytesReceived = 0;
                    byte[] inputByte = new byte[4000];

                    int length;
                    while ((length = serverInput.read(inputByte, 0, inputByte.length)) > 0) {
                        fos.write(inputByte, 0, length);

                    }

                    request = "";
                    fos.close();

                }
            }
            System.out.print("\nType command: ");
            Connected = true;
        }
        outputToServer.close();
        inputFromServer.close();
        socket.close();
    } catch (IOException e) {
        System.err.println(e);
    }

}
}