`

流的使用

阅读更多
1.     关于OutputStream writeint)方法
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码。
这里希望读者可以细细品味这两个方法的区别,这两个程序的输出是一致的,可为什么要写成两个不同的方法,难道是为了好看?呵呵,当然不是。
如果读者思考后还是没有结果,可以发邮件,我们共同探讨
 
2If 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. 使用InputStreamread()方法时应当注意的.
     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经典命令流使用手册

    最全面的ANSYS经典命令流使用手册

    最全面的ANSYS apdl命令流使用手册

    最全面的ANSYS apdl命令流使用手册

    sentinel 阿里开源、限流使用、熔断微、服务治理

    sentinel 阿里开源、限流使用、熔断微、服务治理,高级使用。业内普遍反向很好。

    C#文件流使用案例

    本篇文章将深入探讨C#中的文件流使用案例,帮助开发者更好地理解和应用这一关键概念。 一、文件流基础 1. 文件流的概念:文件流是.NET Framework提供的一种处理文件数据的方式,通过抽象出“流”的概念,简化了对...

    H264 裸流使用ffmepg封装MP4

    使用ffmpeg经H264裸码流封装为MP4文件。 使用ffmpeg经H264裸码流封装为MP4文件。

    hue工作流使用说明

    Hue工作流使用说明涉及了Hue工具中工作流、协调器和批处理器的使用方法,文档中也提到了Oozie这个开源的作业调度系统,它能管理复杂的Hadoop作业并按照特定顺序协同运行。文档内容涉及安装、配置、命令行操作和图形...

    java输入流使用

    通过代码展示java输入流使用的详细过程

    最全面的ANSYS命令流使用手册.pdf

    最全面的ANSYS命令流使用手册

    Activiti6.0工作流使用说明文档V1.0.pdf

    Activiti6.0工作流使用说明文档详细介绍了Activiti 6.0版本中工作流的使用方法,内容涵盖了模型设计器的使用、流程开发的步骤、工作流服务开发的相关知识点,以及在开发过程中可能遇到的常见问题和解决办法。...

    通达OA2015版工作流使用详解

    【通达OA2015版工作流使用详解】 通达OA(Office Anywhere)是一款广泛应用的企业协同办公软件,其2015版本在工作流功能上进行了深度优化,为企业的流程管理提供了强大的支持。工作流是OA系统的核心模块之一,它...

    51CTO下载-通达OA-工作流使用手册

    《通达OA-工作流使用手册》是一份针对51CTO下载平台提供的软件应用——通达OA(TongDa Office Automation)的工作流管理模块的详细指南。此手册旨在帮助用户更好地理解和操作通达OA中的工作流系统,解决在实际使用...

    java steam流 使用示例

    java steam流 使用示例,函数式编程,

    IOS瀑布流使用collenion实现

    瀑布流使用collenion实现,内存优化等

    express-vue, Express.js的Vue渲染引擎 使用. Vue 文件作为流使用流.zip

    express-vue, Express.js的Vue渲染... Vue 文件作为流使用流 express一种使用流在Express中使用服务器端呈现 Vue.js 2.0 的简单方法如果你想使用 Vue.js 和设置大规模web应用程序,使用 Node Express,但是你想使用 Vu

    02-Activiti7工作流使用.7z

    02-Activiti7工作流使用.7z

    IMS工作流设计原理与使用方法

    1. WF基础知识 ...4.IMS工作流使用帮助 第一步 设置工作流运行时环境变量 第二步 使用全局属性 第三步 绘制流程图 第四步 发布流程 第五步 编写代码 第六步 配置参数 第七步 调试运行 注意事项

    开发视频流使用的一个H.264测试文件,test264.rar

    以前开发视频流使用的一个H.264测试文件,现贡献出来供大家使用。用于H.264开发本地程序的调试测试等工作。

    Java8并行流中自定义线程池操作示例

    下面的例子中,我们有一个并行流,这个并行流使用了一个自定义的线程池去计算1到 1,000,000的和。 知识点:可以使用ForkJoinPool的构造方法并设定并行级别来创建一个自定义的线程池。 4. 总结 我们简要地看了一下...

    字节流字符流

    在"FileTest"这个文件中,可能包含了一些关于字节流和字符流使用的示例代码或测试用例。通过阅读和理解这些代码,我们可以深入学习如何在Java中运用字节流和字符流进行文件操作,以及如何在需要时进行两者之间的转换...

    Ubuntu c++ 海康sdk获取原始码流使用ffmpeg进行推流

    Ubuntu c++ 海康sdk获取原始码流,使用ffmpeg编码推流到nginx服务器,使用vlc即可拉到rtmp图像,还有海康原始图像yv12转yuv420p,yv12转rgb转jpeg的程序。使用海康sdk获取原始yv12数据和h264数据。

Global site tag (gtag.js) - Google Analytics