java - BufferedOutputStream 未写入 standardIO

标签 java printing output bufferedoutputstream

我正在尝试使用 Robert Sedgwick 在他的算法 4E 教科书中提供的 BinaryStdOut.java 类。该类的代码可以在他的网站上免费获得,但为了便于引用,我将在此处显示它的相关片段。

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

    private static BufferedOutputStream out = new BufferedOutputStream(System.out);

如果我的理解是正确的,这应该允许 out.write() 本质上打印到标准输出,就像我使用 System.out.print() 一样。

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

    public static void main(String[] args) {
    BinaryStdOut.write(1);
}

这会将整数 1 传递给 BinaryStdOut 的 write() 方法,如下所示

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

现在我的问题是测试代码似乎没有做任何事情。它编译并成功运行,但我的终端中没有打印任何内容,就像我使用相同的整数执行 System.out.print() 一样。

为了查看问题是否出在 BinaryStdOut 类上,我将 BufferedOutputStream 声明直接复制到主程序中,然后尝试直接写入该流,结果相同。

使用 BufferedOutputStream.write() 时我是否遗漏了什么?

编辑:我的测试程序的主要功能当前如下所示:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    BufferedOutputStream out = new BufferedOutputStream(System.out);
    try {out.write(16);
    out.flush();
    out.close();}
    catch(IOException e){
        System.out.println("error");
    }
}

最佳答案

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

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

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

关于java - BufferedOutputStream 未写入 standardIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20209391/

相关文章:

java - 如何在同一个对象上添加多个方法?

java - 将十进制数转换为完整整数 - BigDecimal 是否矫枉过正?

java - 保留 lib 文件夹内未更改的 jar 的时间戳

java - 以良好的格式打印元素

python - 如何每行打印几个数组元素到文本文件

java - 我可以拥有多个具有重叠路径的 Java web 应用程序吗?

Java:打印数组元素

python - 以紧凑的方式打印大型嵌套字典的结构,而无需打印所有元素

C程序: multi-word guessing game conversion error

linux - 在 ramdisk 上缓存 - 查找要删除的最旧文件