1. 关于OutputStream 的 write(int)方法
public abstract void write(int b)
throws IOException
此方法接受一个不大于255的整数作为参数,并将其以相应的byte输出到outputStream。
不知读者有没有想过为什么要求int型的参数小于255?
原因是Java中没有无符号的byte类型,所以只好以int作为替代,但这里就存在一个两种类型长度不一的问题(int-32bit, byte-8bit),于是Java的设计者只取int的低8位,而忽略32bit中的高24bit,所以如果传入的int型参数的大小大于255,将出现循环的情况。
例如:如下表
输入的
int型参数
|
相应的二进制
|
取低8位后的
二进制值
|
相应的十进制值
|
0
|
00000000000000000000000000000000
|
0
|
00000000
|
57
|
00000000000000000000000000111001
|
57
|
00111001
|
255
|
00000000000000000000000011111111
|
255
|
11111111
|
256
|
00000000000000000000000100000000
|
0
|
00000000
|
313
|
00000000000000000000000100111001
|
57
|
00111001
|
上表可以很清楚的看到但输入的参数为0和256,或者 57和313 所得到的值将是一致的。
下面给出两个参考程序,以便读者实际的操作。
Demo One :
import java.io.OutputStream;
import java.io.IOException;
public class ASCIIPrint{
public static void generateCharacters(OutputStream out)
throws IOException{
int firstPrintableCharacter = 33 ;
int numberOfPrintableCharacters = 94 ;
int numberOfCharactersPerLine = 72 ;
int start = firstPrintableCharacter ;
int loop = 0 ;
while(loop < 100){
for(int i=start ; i
out.write(((i-firstPrintableCharacter)
% numberOfPrintableCharacters)
+ firstPrintableCharacter);
}
out.write('\r');
out.write('\n');
start = ((start + 1) - firstPrintableCharacter)
% numberOfPrintableCharacters
+ firstPrintableCharacter ;
loop++ ;
}
}
public static void generateCharactersByByteArray(OutputStream out)
throws IOException{
int firstPrintableCharacter = 33 ;
int numberOfPrintableCharacters = 94 ;
int numberOfCharactersPerLine = 72 ;
int start = firstPrintableCharacter ;
byte [] line = new byte[numberOfCharactersPerLine + 2];
int loop = 0 ;
while(loop < 100){
for(int i = start ; i < start+numberOfCharactersPerLine ; i++){
line[i-start] = (byte)((i - firstPrintableCharacter)
% numberOfPrintableCharacters
+ firstPrintableCharacter) ;
}
line[72] = (byte)'\r' ;
line[73] = (byte)'\n' ;
out.write(line) ;
start = ((start + 1) - firstPrintableCharacter)
% numberOfPrintableCharacters
+ firstPrintableCharacter ;
loop++;
}
}
public static void main(String [] args){
try{
// test 1:
ASCIIPrint.generateCharacters(System.out) ;
// test 2:
ASCIIPrint. generateCharactersByByteArray (System.out);
}
catch(IOException IOe){
IOe.printStackTrace();
}
}
}
运行此程序,读者可以很清楚的看到循环的输出ASCII码。
这里希望读者可以细细品味这两个方法的区别,这两个程序的输出是一致的,可为什么要写成两个不同的方法,难道是为了好看?呵呵,当然不是。
如果读者思考后还是没有结果,可以发邮件,我们共同探讨
2.If you are done writing data, never forget to flush the output stream! This good habit avert from deadlock.
System.out is a buffer output stream. 嘻嘻,你知道吗?.\/.
3. 使用InputStream的read()方法时应当注意的.
public abstract int read() throws IOException
在使用read()方法时,注意返回值的类型是int型,而read()是从input stream中读取一个byte,所以很容易想到会使用类型转换向下转型,这个是很容易想到的,可往往细节容易被忽略。由于int型在Java中是有符号的,所以在转型过程中得到的是有符号的byte,即是说其范围是-128 to 127。解决方法是使用如下的一小段代码
int i = b > 0 ? b : 256+b;
byte input = (byte)i;
分享到:
相关推荐
通达OA2009版工作流使用详解 通达OA2009版工作流使用详解.pdf 通达OA2009版工作流使用详解.pdf 通达OA2009版工作流使用详解.pdf 通达OA2009版工作流使用详解.pdf 通达OA2009版工作流使用详解.pdf 通达OA2009版工作流...
最全面的ANSYS经典命令流使用手册
Activiti6.0工作流使用说明文档
Activiti工作流使用手册_acticiti工作流操作手册文档V1.1操作教程手册 解决java开发使用Activiti遇到的问题和使用组件的讲解
最全面的ANSYS apdl命令流使用手册
sentinel 阿里开源、限流使用、熔断微、服务治理,高级使用。业内普遍反向很好。
通达oa工作流使用详解2008通达oa工作流使用详解2008
通过代码展示java输入流使用的详细过程
最全面的ANSYS命令流使用手册
C#文件流使用案例 文件流 C#文件流 案例 希望能对大家有用
详细介绍通达OA工作流使用方法及如何设计流程。
ansys命令流使用方法,详细介绍命令意义,如何使用
目录 ANSYS结构分析单元功能与特性 ANSYS 的基本使用 有限元模型的建立 实体模型的建立 .........
java Stream 流使用用例
java steam流 使用示例,函数式编程,
瀑布流使用collenion实现,内存优化等
express-vue, Express.js的Vue渲染... Vue 文件作为流使用流 express一种使用流在Express中使用服务器端呈现 Vue.js 2.0 的简单方法如果你想使用 Vue.js 和设置大规模web应用程序,使用 Node Express,但是你想使用 Vu
通达OAOffice Anywhere2013工作流使用详解 学习通达OA工作流必备。
通达OA2015版工作流使用详解
Office Anywhere2011工作流使用详解.pdf