Java BufferedOutputStream未写入标准IO
我试图使用Robert Sedgwick在其算法4E教科书中提供的BinaryStdOut.java类。这个类的代码可以在他的网站上免费获得,但为了便于参考,我将在这里展示相关的代码片段 在上面提到的类中,BufferedOutputStream声明如下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[]
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!)后,它现在似乎可以从我的测试代码开始工作,谢谢各位!