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;
分享到:
相关推荐
最全面的ANSYS apdl命令流使用手册
sentinel 阿里开源、限流使用、熔断微、服务治理,高级使用。业内普遍反向很好。
本篇文章将深入探讨C#中的文件流使用案例,帮助开发者更好地理解和应用这一关键概念。 一、文件流基础 1. 文件流的概念:文件流是.NET Framework提供的一种处理文件数据的方式,通过抽象出“流”的概念,简化了对...
Hue工作流使用说明涉及了Hue工具中工作流、协调器和批处理器的使用方法,文档中也提到了Oozie这个开源的作业调度系统,它能管理复杂的Hadoop作业并按照特定顺序协同运行。文档内容涉及安装、配置、命令行操作和图形...
使用ffmpeg经H264裸码流封装为MP4文件。 使用ffmpeg经H264裸码流封装为MP4文件。
Activiti6.0工作流使用说明文档详细介绍了Activiti 6.0版本中工作流的使用方法,内容涵盖了模型设计器的使用、流程开发的步骤、工作流服务开发的相关知识点,以及在开发过程中可能遇到的常见问题和解决办法。...
【通达OA2015版工作流使用详解】 通达OA(Office Anywhere)是一款广泛应用的企业协同办公软件,其2015版本在工作流功能上进行了深度优化,为企业的流程管理提供了强大的支持。工作流是OA系统的核心模块之一,它...
《通达OA-工作流使用手册》是一份针对51CTO下载平台提供的软件应用——通达OA(TongDa Office Automation)的工作流管理模块的详细指南。此手册旨在帮助用户更好地理解和操作通达OA中的工作流系统,解决在实际使用...
java steam流 使用示例,函数式编程,
瀑布流使用collenion实现,内存优化等
express-vue, Express.js的Vue渲染... Vue 文件作为流使用流 express一种使用流在Express中使用服务器端呈现 Vue.js 2.0 的简单方法如果你想使用 Vue.js 和设置大规模web应用程序,使用 Node Express,但是你想使用 Vu
05.HDFS的写数据到文件的输出流使用示例.mp4
1. WF基础知识 ...4.IMS工作流使用帮助 第一步 设置工作流运行时环境变量 第二步 使用全局属性 第三步 绘制流程图 第四步 发布流程 第五步 编写代码 第六步 配置参数 第七步 调试运行 注意事项
下面的例子中,我们有一个并行流,这个并行流使用了一个自定义的线程池去计算1到 1,000,000的和。 知识点:可以使用ForkJoinPool的构造方法并设定并行级别来创建一个自定义的线程池。 4. 总结 我们简要地看了一下...
在"FileTest"这个文件中,可能包含了一些关于字节流和字符流使用的示例代码或测试用例。通过阅读和理解这些代码,我们可以深入学习如何在Java中运用字节流和字符流进行文件操作,以及如何在需要时进行两者之间的转换...
Ubuntu c++ 海康sdk获取原始码流,使用ffmpeg编码推流到nginx服务器,使用vlc即可拉到rtmp图像,还有海康原始图像yv12转yuv420p,yv12转rgb转jpeg的程序。使用海康sdk获取原始yv12数据和h264数据。
使用MP4v2库 封装,解码H264码流。 1.包含live555拉流操作。 2.mp4v2库 3.mp4muxer 把H264封装成MP4 4.MP4demuxer 从MP4文件读取h264码流 5.测试项目
在这段代码中,虽然没有调用`close()`方法,但由于字符流使用了缓冲区,因此不会将内容写入到文件中。这说明字符流的操作依赖于缓冲区。 #### 四、缓冲区的作用 缓冲区是一种存储数据的临时内存空间,其主要目的是...
总结了java中的IO流及其包装类的详细使用方法,展示类其底层原理的代码。
文件流使用内部缓冲区来提高效率,这意味着不是每次写入或读取操作都会立即影响磁盘。为了确保数据立即写入或刷新缓冲区,可以使用flush()或sync()方法。 总结来说,文件流提供了一种灵活且易于使用的接口来操作...