Java BufferedOutputStream未写入标准IO

Java BufferedOutputStream未写入标准IO,java,printing,output,bufferedoutputstream,Java,Printing,Output,Bufferedoutputstream,我试图使用Robert Sedgwick在其算法4E教科书中提供的BinaryStdOut.java类。这个类的代码可以在他的网站上免费获得,但为了便于参考,我将在这里展示相关的代码片段 在上面提到的类中,BufferedOutputStream声明如下 private static BufferedOutputStream out = new BufferedOutputStream(System.out); public static void main(String[]

我试图使用Robert Sedgwick在其算法4E教科书中提供的BinaryStdOut.java类。这个类的代码可以在他的网站上免费获得,但为了便于参考,我将在这里展示相关的代码片段

在上面提到的类中,BufferedOutputStream声明如下

    private static BufferedOutputStream out = new BufferedOutputStream(System.out);
    public static void main(String[] args) {
    BinaryStdOut.write(1);
}
    public static void write(int x) {
    writeByte((x >>> 24) & 0xff);
    writeByte((x >>> 16) & 0xff);
    writeByte((x >>>  8) & 0xff);
    writeByte((x >>>  0) & 0xff);
}
如果我的理解正确,这应该允许
out.write()
基本上打印到标准输出,就像我使用
System.out.print()
一样

为了测试这一点,我构建了一个程序,其主要功能如下

    private static BufferedOutputStream out = new BufferedOutputStream(System.out);
    public static void main(String[] args) {
    BinaryStdOut.write(1);
}
    public static void write(int x) {
    writeByte((x >>> 24) & 0xff);
    writeByte((x >>> 16) & 0xff);
    writeByte((x >>>  8) & 0xff);
    writeByte((x >>>  0) & 0xff);
}
这将把整数1传递给BinaryStdOut的
write()
方法,如下所示

    private static BufferedOutputStream out = new BufferedOutputStream(System.out);
    public static void main(String[] args) {
    BinaryStdOut.write(1);
}
    public static void write(int x) {
    writeByte((x >>> 24) & 0xff);
    writeByte((x >>> 16) & 0xff);
    writeByte((x >>>  8) & 0xff);
    writeByte((x >>>  0) & 0xff);
}
writeByte()
代码是:

private static void writeByte(int x) {
    assert x >= 0 && x < 256;

    // optimized if byte-aligned
    if (N == 0) {
        try { out.write(x); }
        catch (IOException e) { e.printStackTrace(); }
        return;
    }

    // otherwise write one bit at a time
    for (int i = 0; i < 8; i++) {
        boolean bit = ((x >>> (8 - i - 1)) & 1) == 1;
        writeBit(bit);
    }
}

写入缓冲区后,需要刷新缓冲区:

// optimized if byte-aligned
if (N == 0) {
    try { 
        out.write(x); 
        out.flush();
    }
    catch (IOException e) { e.printStackTrace(); }
    return;
}

测试程序似乎不打印任何内容的原因是,您正在打印一个控制字符,而该字符不会显示在标准输出中。

写入缓冲区后,需要刷新缓冲区:

// optimized if byte-aligned
if (N == 0) {
    try { 
        out.write(x); 
        out.flush();
    }
    catch (IOException e) { e.printStackTrace(); }
    return;
}

您的测试程序似乎没有打印任何内容的原因是因为您正在打印a,这是一个控制字符,它不会显示在标准输出中。

这为我打印hello world,您是否选择了一些没有可显示标志符号的字节?您可能不应该像那样关闭
System.out
(在BuffedOutputStream上调用close将关闭它并释放与该流关联的任何系统资源)


这为我打印了hello world,您是否选择了一些没有可显示标志符号的字节?您可能不应该像那样关闭
System.out
(在BuffedOutputStream上调用close将关闭它并释放与该流关联的任何系统资源)


是的,您需要
flush
,而您需要
flush
的原因是
缓冲
流外使用:

缓冲输出流:

public BufferedOutputStream(OutputStream out) {
    this(out, 8192);//default buffer size
    }
public synchronized void write(int b) throws IOException {
    if (count >= buf.length) {
        flushBuffer();
    }
    buf[count++] = (byte)b;
    }
所以,在缓冲区被8KB的数据填满之前,内容将保持缓冲状态,而不会流到控制台

write(16)
上,您应该在控制台上看到打印字符(至少是Eclipse IDE),如果您打印1601-1626,您应该看到打印的
A
-
Z
字符。


是的,您需要
刷新
,而之所以需要
刷新
是因为
缓冲
外流使用:

缓冲输出流:

public BufferedOutputStream(OutputStream out) {
    this(out, 8192);//default buffer size
    }
public synchronized void write(int b) throws IOException {
    if (count >= buf.length) {
        flushBuffer();
    }
    buf[count++] = (byte)b;
    }
所以,在缓冲区被8KB的数据填满之前,内容将保持缓冲状态,而不会流到控制台

write(16)
上,您应该在控制台上看到打印字符(至少是Eclipse IDE),如果您打印1601-1626,您应该看到打印的
A
-
Z
字符。


别忘了
flush()
@SotiriosDelimanolis我应该把
flush放在哪里
我在为测试服务而放入主程序的
BufferedOutputStream.write()之后立即添加了一个
(以及所有其他写入的方法)。
out.flush()
其中
out
是您的
BufferedOutputStream
。您正在打印一个DLE(十进制16),它不会显示在标准输出中。在按照@SotiriosDelimanolis将
out.flush()
添加到
writeByte
方法并将我的测试字符更改为print之后(哦!)根据@JonLin的说法,它现在似乎在我的测试代码中工作,谢谢各位!别忘了
flush()
@SotiriosDelimanolis我应该把
flush
放在哪里我在
BufferedOutputStream.write()之后立即添加了一个
我放在测试服务的主程序中,但它似乎仍然没有打印任何内容。您可以将它放在
writeByte
(以及所有其他写入方法)的末尾。
out.flush()
其中
out
是您的
缓冲输出流
。您正在打印DLE(十进制16),它不会出现在stdout中。在根据@SotiriosDelimanolis将
out.flush()
添加到
writeByte
方法并根据@JonLin将我的测试字符更改为print(D'Oh!)后,它现在似乎可以从我的测试代码开始工作,谢谢各位!