Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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的System.out.println();它会阻止它将有延迟的程序吗_Java_Linux_Console_Tty - Fatal编程技术网

Java的System.out.println();它会阻止它将有延迟的程序吗

Java的System.out.println();它会阻止它将有延迟的程序吗,java,linux,console,tty,Java,Linux,Console,Tty,我将通过非常慢的ssh连接运行程序。它会减慢速度还是阻碍交通 System.out.println(); 大量印刷。所以,若它直接将几GB的数据打印到控制台中,但我的连接很慢,那个么未播放的数据会出现在哪里?tty内存的大小是多少?如果我将失去连接一段时间-它还会运行吗?否。PrintWriter不会等待完成确认 它会阻止它将有延迟的程序吗 Java的控制台输出是,因此您的代码可能会阻塞,特别是在编写大量数据时 tty内存的大小是多少 我很确定这取决于您的内核,这表明它在某个时刻是4096字节

我将通过非常慢的ssh连接运行程序。它会减慢速度还是阻碍交通

System.out.println();

大量印刷。所以,若它直接将几GB的数据打印到控制台中,但我的连接很慢,那个么未播放的数据会出现在哪里?tty内存的大小是多少?如果我将失去连接一段时间-它还会运行吗?

否。PrintWriter不会等待完成确认

它会阻止它将有延迟的程序吗

Java的控制台输出是,因此您的代码可能会阻塞,特别是在编写大量数据时

tty内存的大小是多少

我很确定这取决于您的内核,这表明它在某个时刻是4096字节:

我查看了内核代码linux\drivers\char\serial.c,其中有一个名为serial_XMIT_SIZE的定义。起初我想也许我可以改变,但似乎传输缓冲区实际上是固定的内存页4k

如果我将失去连接一段时间-它还会运行吗

是的,如果没有人连接到tty,那么它将运行得更快,因为它将能够丢弃数据

也是模拟您的用例的小型测试应用程序

Echo.java

import java.io.IOException;

public class Echo {
    public static void main(String[] args) throws InterruptedException, IOException {
        final byte[] data = new byte[Test.BODY_LENGTH + Test.END_MARKER.length];
        int index = 0;
        outer: while (true) {
            data[index++] = (byte) System.in.read();
            final int dataOffset = index - Test.END_MARKER.length;
            if (dataOffset < 0) {
                continue;
            }
            for (int i = 0; i < Test.END_MARKER.length; i++) {
                if (data[dataOffset + i] != Test.END_MARKER[i]) {
                    continue outer;
                }
            }
            System.out.print(new String(data, 0, index));
            return;
        }
    }
}
Test.java

import java.io.File;
import java.io.IOException;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

public class Test {

    public static final byte[] END_MARKER = "$TERMINATE$".getBytes();
    public static final int BODY_LENGTH = 1024768;

    public static void main(String[] args) throws IOException, InterruptedException {
        StringBuilder data = new StringBuilder();
        for (int i = 0; i < BODY_LENGTH; i++) {
            data.append((char) ('a' + ThreadLocalRandom.current().nextInt(('z' - 'a' + 1))));
        }
        final Process process = new ProcessBuilder("java", Test.class.getPackage().getName() + ".Echo")
                .directory(new File("out/production/week 3")) // Change to your output directory
                .start();
        process.getOutputStream().write(data.toString().getBytes());
        process.getOutputStream().write(END_MARKER);
        process.getOutputStream().flush();
        System.out.println("Written!");
        final boolean exitedAfterWroteData = process.waitFor(5, TimeUnit.SECONDS);
        System.out.println(exitedAfterWroteData ? "Complete" : "Running"); // Will print running after 5 seconds
        int read = 0;
        while (process.getInputStream().read() > -1) {
            read++;
        }
        if (read != data.toString().getBytes().length + END_MARKER.length) {
            throw new IllegalStateException("Expected echo to print exactly " + BODY_LENGTH + END_MARKER.length + " symbols!");
        }
        final boolean exitedAfterWeReadData = process.waitFor(50, TimeUnit.MILLISECONDS);
        System.out.println(exitedAfterWeReadData ? "Complete" : "Running"); // Will print complete after a few milliseconds
    }
}

这个问题太宽泛了,你能详细说明一下吗?比如举个例子或者解释一下数据类型,以及你到底要做什么?数据类型?PrintStream只打印字符串?这个问题不是关于java的,而是关于TTY和控制台的。