`

字节流误区

阅读更多

1、字节流
误区:   被参数所迷惑
先来看一个普通的字节流
FileOutputStream fos = new FileOutputStream("d:\\testbit.txt");
看起方法
write(int b)
这里传入的是一个int,误以为是写入一个int
FileInputStream
read()方法,返回值是int,误以为是读取一个int

1)如果写入一个小于256的数,比如255,读取结果是255
2)如果写入大于255的数,比如256  ,读取的结果是0
查看文件的大小是1个字节
FileOutputStream fos = new FileOutputStream("d:\\testbit.txt");
   fos.write(256);
   fos.flush();
   fos.close();
FileInputStream fis = new FileInputStream("d:\\testbit.txt");
   int a =fis.read();
   System.out.println(a);

疑问:为什么传入一个int,int占四个字节,然后写入文件,文件大小只有1个字节,而且传入256,读取出来是0


注意:如果发现了上面的问题,那么以后使用就必须注意,不能再乱用字节流。

分析:由于写入一个int到文件,文件的大小只有1个字节,说明只写入了一个字节到文件中,但是int是占四个字节,00000000 00000000 00000000 00000000,那么说明计算机肯定进行了截图,其实在通过写入255,和256可以发现,其实该方法会截图int的最后一个字节写入文件,由于256的二进制是
00000000 00000000 00000001 00000000,最后一个字节大小是0,使用实质是往文件中写入了0。

总结:字节流,都是一个字节,一个字节的在进行读写,当然DataInputStream可以写入int,那么它是不是一下写入了四个字节呢,其实不是的
看他的writeInt();方法的源代码:
public final void writeInt(int v) throws IOException {
        out.write((v >>> 24) & 0xFF);
        out.write((v >>> 16) & 0xFF);
        out.write((v >>>  8) & 0xFF);
        out.write((v >>>  0) & 0xFF);
        incCount(4);
    }

写入一个int的时候,是写入了一个字节一个字节的写入,写了四次,通过观察可以方法,它是将int的四个字节,通过截图,将把每个字节写入,
再看readInt()方法源代码:
 public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
    }
读取的一个int的时候,读取出了四个字节,然后进行位移运算,再加在一起,这样一个int,经历了拆分到组装的过程,组装的过程需要根据拆分的过程来,这就是为什么输入流和输出流需要对应使用,如果输入流和输出流不一致,那么拆分和组装的方法就不一致,就不能将拆分后的还原了。

 

 

 


 

2
0
分享到:
评论

相关推荐

    无线WiMAX和Wi-Fi网络的常见知识几大误区

    WiMAX和Wi-Fi是当前无线网络领域非常流行的两种技术,它们各自拥有特定的应用场景和用户群体,但在公众中存在一些关于它们的常见误区。以下分别对这些误区进行详细阐释: 1. WiMAX的传输范围一定比Wi-Fi大: WiMAX...

    java问答式教程 很好的

    理解输入输出流的分类(如字节流和字符流)、缓冲区和转换流的使用,以及NIO(非阻塞I/O)的概念,将有助于你在处理数据输入输出时游刃有余。 6. **多线程**:Java内置对多线程的支持,理解线程的创建、同步和通信...

    Java考证历年试题以及参考答案

    6. **I/O流**:文件操作、字节流和字符流的区别、缓冲流的使用、对象序列化等。 7. **网络编程**:Socket编程,了解TCP和UDP协议,以及服务器端和客户端的实现。 8. **数据库连接**:JDBC基本操作,包括连接、执行...

    java_disabuse.rar_java disabuse

    理解字节流和字符流的区别,以及缓冲区的概念,能提升程序的效率。文档可能提供示例代码,演示如何使用FileReader、FileWriter等类进行文件操作。 6. **多线程**:Java提供了强大的多线程支持。理解线程的创建、...

    电脑上网流量换算法资料.pdf

    【电脑上网流量换算法资料】 在理解电脑上网流量和网络带宽时,了解基本的存储和传输单位至...了解这些基础知识有助于更准确地理解和优化网络使用,特别是在涉及大量数据传输的应用场景中,如远程监控、高清视频流等。

    Java基础知识精华总结

    8. **IO流**:输入/输出流的分类,缓冲流,字符流与字节流的区别,以及NIO(New IO)的介绍。 9. **多线程**:线程的创建方式,同步机制(synchronized,Lock),并发工具类(ExecutorService,Semaphore,...

    如何正确的使用Java序列化技术

    Java序列化技术是一种强大的功能,它能够将对象的状态转化为字节流,以便在网络上传输或持久化到文件系统中。这一机制是Java远程方法调用(RMI)、企业JavaBeans(EJB)、Java Native Interface(JNNI)等关键技术的基础。...

    眼见不一定为实:调用链HBase倾斜修复.doc

    RowKey由字节流组成,可以是任意二进制数据,但需要注意其可读性和存储效率。 Region是HBase中的数据分区单位,随着数据的增长,Region会自动分裂以保持系统的水平扩展能力。然而,如果RowKey设计不合理,可能导致...

    2021-2022计算机二级等级考试试题及答案No.18541.docx

    - **概念**: `InputStreamReader` 类用于将字节流转换为字符流。 - **应用场景**: 当需要处理文本数据时,通常会使用此类进行流类型的转换。 ### 17. C语言中的字符串处理 - **选项分析**: - **D**: 正确。`char ...

    Android面试题

    - B 选项提到的字节流和字符流是按数据单位分类的。 - C 选项中的“节点流和处理流”是按功能分类的,其中处理流是为了处理节点流中的数据而存在的。 - D、E、F、G 选项分别列出了具体的流类型,不符合题目要求。...

    大数据试题及复习资料.doc

    在存储容量方面,1KB小于1MB小于1GB,每个字节可以存储一个英文字符,一个汉字通常需要两个字节的空间。 聚类挖掘技术是一种无监督学习方法,它将数据自动分成不同的类别,要求同类数据相似度高,不同类数据相似度...

    前端面试题(JavaScript).docx

    GET 请求的参数限制在于 URL 的长度,不同浏览器和服务器有不同的限制,如 IE 最大 2083 字节,Chrome 为 8182 字节。 2. **GET 和 POST 请求缓存**:GET 请求适用于缓存,因为它通常用于获取数据,而 POST 请求...

    2021-2022计算机二级等级考试试题及答案No.10176.docx

    - FileInputStream/FileOutputStream:用于读取和写入字节流。 - Reader/Writer:用于读取和写入字符流。 - RandomAccessFile:既可以读取也可以写入文件,支持随机访问。 - File类:提供了基本的文件和目录操作...

    2021-2022计算机二级等级考试试题及答案No.16445.docx

    FileInputStream 是 Java 中用于读取文件的字节流类,适用于读取二进制文件或其他类型的文件数据。 以上就是从给定文件中提取的关键知识点。这些知识点涵盖了数据库操作、编程基础、数据结构与算法等多个方面,对于...

    OCJP考试题题库解析,稳过290道

    5. **输入/输出流**:掌握File、BufferedReader、PrintWriter等基本操作,理解I/O流的分类和管道。 6. **多线程**:线程的创建与管理,同步机制(synchronized关键字、Lock接口)以及并发工具类的使用。 7. **内存...

    对JAVA程序设计的感想.pdf

    遇到困难时,及时向老师或同学求教,避免错误的积累和理解误区的形成。 在Java教学方面,有实际项目开发经验的老师能够提供更实用的指导,帮助学生快速理解和应用知识。课程中注重细节,比如符号的使用,看似...

    Java面试解惑系列

    这一系列的内容旨在帮助程序员们更好地理解和掌握Java编程的核心概念、技术细节以及常见误区,从而在面试中展现出扎实的技术功底。 Java作为一种广泛使用的高级编程语言,其面试题目通常涵盖了以下几个主要领域: ...

Global site tag (gtag.js) - Google Analytics