Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我手动关闭,程序是否只写入文件?_Java_Io - Fatal编程技术网

Java 如果我手动关闭,程序是否只写入文件?

Java 如果我手动关闭,程序是否只写入文件?,java,io,Java,Io,knockServer文件 这将启动服务器 public static void main(String[] args) { /* Create new Server object * Call run() on new Server object */ KnockKnockServer kks = new KnockKnockServer(); kks.run(); } 这将启动新线程并打开日志文件

knockServer文件

这将启动服务器

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

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

 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");
        }
    }
knockThread文件

这会写入文件并回复客户端

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");

            }
        }
该计划的总体要点


无论出于何种原因,我只能在手动关闭日志文件时看到日志文件中的文本。否则,它是完全空白的。我在网上找不到任何帮助。我想它可能会回到第一次运行,并制作一个新文件,以清除文本,但我把打印语句放在所有地方,事实并非如此。我完全糊涂了。我无法关闭该文件,因为服务器需要准备好从其他线程写入日志文件

文件I/O通常是缓冲的。您需要做的是刷新文件,这在关闭文件时自动发生,但也可以通过调用相关方法自行完成。

通常,文件I/O是缓冲的。您需要做的是刷新文件,该操作在关闭文件时自动发生,但也可以通过调用相关方法自行完成。

如果您想更快地将数据写入文件,则需要在流上调用flush。这是因为数据通常被缓冲以提高I/O性能。从冲洗方法的开始:

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


如果希望更快地将数据写入文件,则需要在流上调用flush。这是因为数据通常被缓冲以提高I/O性能。从冲洗方法的开始:

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


您可以使用try with resources,看看这是否解决了您的问题:

您可以使用资源试用,看看这是否解决了您的问题:

如果您深入研究一下Unix,文件I/O将被缓冲。例如,当您写入文件时,您将使用系统调用:

写文件描述符,用户空间缓冲区,计数

您可以从缓冲区写入驻留在磁盘上的文件。你写什么。。。它的作用是将数据从用户空间中的缓冲区复制到内核缓冲区并立即返回。这样做的目的是,由于磁盘I/O非常昂贵,因此调用不会占用很多时间

关闭文件将释放文件描述符并刷新缓冲区

注意:您也可以绕过内核级缓冲区进行直接I/O。

如果您深入研究Unix,文件I/O将被缓冲。例如,当您写入文件时,您将使用系统调用:

写文件描述符,用户空间缓冲区,计数

您可以从缓冲区写入驻留在磁盘上的文件。你写什么。。。它的作用是将数据从用户空间中的缓冲区复制到内核缓冲区并立即返回。这样做的目的是,由于磁盘I/O非常昂贵,因此调用不会占用很多时间

关闭文件将释放文件描述符并刷新缓冲区


注意:您也可以绕过内核级缓冲区进行直接I/O操作。

鉴于您正在写入的文本数量,在您关闭文件之前,它几乎肯定不会刷新到文件中。@MichaelBerry抱歉,我对此一无所知,我真的不明白刷新是如何工作的。我想既然自动冲洗是开着的,我就不用担心了。显然不是。但在什么时候我需要冲洗,为什么?实际上我想我明白了。比如说马桶是缓冲器,管道是过程,出口是文件。当我在文件上执行IO操作时,它们会留在碗里,直到我冲洗马桶,管道将它们从马桶输送到我的文件出口。我理解得对吗?考虑到你正在写的文本数量,在你关闭它之前,几乎肯定不会刷新到文件中。@MichaelBerry抱歉,我不知道刷新是如何工作的。我想既然自动冲洗是开着的,我就不用担心了。显然不是。但在什么时候我需要冲洗,为什么?实际上我想我明白了。比如说马桶是缓冲器,管道是过程,出口是文件。当我在文件上执行IO操作时,它们会留在碗里,直到我冲洗马桶,管道将它们从马桶输送到我的文件出口。我理解对了吗?
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");

            }
        }