如果我手动关闭程序,程序仅写入文件吗?

1 java io

KnockKnockServer文件

这将启动服务器

public static void main(String[] args) {
        /* Create new Server object
         * Call run() on new Server object
         */
        KnockKnockServer kks = new KnockKnockServer();
        kks.run();

    }
Run Code Online (Sandbox Code Playgroud)

这将启动新线程并打开日志文件。

 private void run(){
        try {
            File logfile = new File("prog1b.log");
            FileOutputStream fos = new FileOutputStream(logfile);
            PrintWriter out = new PrintWriter(fos, true);
            ServerSocket serverSocket = new ServerSocket(5520);
            while(true){
                try {
                    Socket serverClient = serverSocket.accept();
                    KnockKnockServerThread kkst = new KnockKnockServerThread(serverClient, out);
                    kkst.start();
                } catch (IOException evt) {
                    System.out.println("Error");
                }
            }
        } catch (IOException evt) {
            System.out.println("error");
        }
    }
Run Code Online (Sandbox Code Playgroud)

KnockKnockThread文件

public KnockKnockServerThread(Socket clientSocket, PrintWriter logfile) {
            serverClient = clientSocket;
            lOut = logfile;
        }
Run Code Online (Sandbox Code Playgroud)

这将写入文件并回复客户端。

public void run() {
            try {
                sOut = new PrintWriter(serverClient.getOutputStream(), true);
                lOut.write(formatter.format(date) + ": Client connected from " + serverClient.getRemoteSocketAddress() + " on port # " + serverClient.getPort() + ".\n");
                in = new BufferedReader(new InputStreamReader(serverClient.getInputStream()));

                String clientMessage = "", serverMessage = "";

                while (!clientMessage.equals("quit")) {
                    clientMessage = in.readLine();
                    if(!clientMessage.equals("quit")) {
                        serverMessage = encrypt(clientMessage);
                        sOut.println(serverMessage);
                        lOut.write(formatter.format(date) + " Client " + serverClient.getPort() + ": " + clientMessage + "\n");
                        lOut.write(formatter.format(date) + " Server: " + serverMessage + "\n");
                    }
                    else if(clientMessage.equals("quit")){
                        sOut.println("Good Bye!\n");
                        lOut.write(formatter.format(date) + ": Connection closed on port " + serverClient.getPort() + ".\n");
                    }
                }
                sOut.close();
                in.close();
                serverClient.close();
            } catch (IOException e) {
                System.out.println("Error");

            }
        }
Run Code Online (Sandbox Code Playgroud)

该程序的总要点

无论出于何种原因,当我手动关闭文件时,我只能在日志文件中看到文本。否则,它完全是空白的。我找不到任何在线帮助。我以为可能要回到第一个run()并制作一个新文件来清除文本,但是我在各处都放置了打印语句,事实并非如此。我很困惑。我无法关闭文件,因为服务器需要准备好从其他线程写入日志文件。

rou*_*ble 5

如果要更快地将数据写入文件,则需要在流上调用flush()。这是因为通常为I / O性能缓冲数据。从该方法的文档中flush:

刷新输出流并强制写出所有缓冲的输出字节。刷新的一般约定是,调用它的指示是,如果先前写入的任何字节已由输出流的实现缓冲,则应立即将这些字节写入其预期的目标。