`
AisiniLe
  • 浏览: 9600 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_自定义字节流的缓冲区

阅读更多

----------- Android培训Java培训Java学习型技术博客、期待与您交流! ------------

通过API提供的BufferedInputStream和BufferedOutputStream两个字节流缓冲类,可以提高字节流的高效读取.

一个标准的利用两者的复制操作(拷贝一个acc音频文件)

 

public static void copy() throws IOException
 	{
 		BufferedInputStream buis = new BufferedInputStream(new FileInputStream("g:\\open your mind.aac"));
 		BufferedOutputStream buos = new BufferedOutputStream(new FileOutputStream("g:\\open.acc"));
 		
 		int data = 0;
 		
 		while((data = buis.read()) != -1)
 		{
 			buos.write(data);
 		}
 		
 		buis.close();
 		buos.close();
 	}
 

基本的实现思路是:BufferedInputStream类提供缓冲区技术,将数据读入到缓冲区中,然后用data作为中间件写入到open.acc中.

根据bufferedInputStream原理来实现自定义字节流的缓冲区

 

import java.io.IOException;
import java.io.InputStream;
 
 public class MyBufferedInputStream
 {
 	private InputStream in;
 	private byte[] buf = new byte[1024];
 	private int pos = 0, count = 0;
 
 	public MyBufferedInputStream(InputStream in)
 	{
 		this.in = in;
 	}
 
 	public int myRead() throws IOException
 	{
 		if (count == 0)
 		{
 			count = in.read(buf);
 			if (count < 0)
 				return -1;
 			pos = 0;
 			byte b = buf[pos];
 			count--;
 			pos++;
 			return b & 255;
 		} else if (count > 0)
 		{
 			byte b = buf[pos];
 			count--;
 			pos++;
 			return b & 255;
 		}
 		return -1;
 
 	}
 
 	public void myClose() throws IOException
 	{
 		in.close();
 	}
 }

 

MyEclipse截图分析:

 

 

关于上幅图中的两个问题解答:

 

1.如果直接return b,执行的结果可能是文件复制成功,但是存储容量是小于原文件的.复制是失败的.

2.文件在计算机中的存储都是由二进制数组成的,有可能在数据中出现连续多个1的情况,读一个字节相当于读了8个二进制位,数据中有11111111,转成十进制为-1.

此时-1是byte类型的,而返回的是int类型的,所以byte类型自爱返回时自动被提升为int类型

 

此时由 11111111转换为了11111111 11111111 11111111 11111111转换后仍然是-1.

在执行语句中

 

while((data = buis.read()) != -1)
 		{
 			buos.write(data);
 		}

 

data直接为-1.结束循环,数据没有读取完成,进而write操作没有执行,根本就没有将数据写入到目的中.这就是为啥复制后的文件时小于原文件的.

 

但是为啥利用int类型接收返回的数据,而不是直接用byte呢?

-->为了避免读取数据1111 1111和判断结束标记-1相同的情况,为了保持原有的8个1的基础上,转成int类型的时候,可以再前面补上0而不补1.

-->但是byte类型自动提升为int类型的时候,是直接在前面补上24个1 

 

byte 11111111

int    11111111 11111111 11111111 11111111

结果仍为-1.

 

如果此时在前面补上0,

byte 11111111

int    00000000 00000000 00000000 11111111

此时的结果不为-1,为255.

 

这就是不返回byte类型而返回int类型的原因了

想取最低8位,就与255进行&操作.

将int类型的-1直接与int类型的255进行&操作

  11111111 11111111 11111111 11111111

&00000000 00000000 00000000 11111111

-------------------------------------------------------

  00000000 00000000 00000000 11111111

 

综述:

 

提升到int类型,结果仍为-1,是-1的原因是因为在8个1之前补上的是1,那么补上0,既可以保留原字节数据不变,

又可以避免-1的出现.

 

还有一个问题:

那就是将byte类型提升到int类型后,原来的1个字节,现在变为4个字节.读取时读的是4个字节.写的时候也是4个字节,

那么最后复制的文件的储存容量应该为源文件的4倍.为何复制后到文件大小没有发生变化??

-->此时的操作就是write()方法在执行强转操作,write()方法直接读取最低的字节.

-->read()方法在提升,write()方法在强转...

 

 

Done.

 

 

2
1
分享到:
评论

相关推荐

    黑马程序员_毕向东_Java基础视频教程第18天-12-IO流(文本文件读取练习).zip

    在这个“黑马程序员_毕向东_Java基础视频教程第18天-12-IO流(文本文件读取练习)”中,毕向东老师将深入讲解如何使用Java IO流来读取文本文件。Java IO流提供了多种类和方法,使得开发者可以灵活高效地处理输入和输出...

    黑马程序员_Java基础辅导班教程课件[第01期]第11天

    "黑马程序员_Java基础辅导班教程课件[第01期]第11天"是一个专门为初学者设计的培训课程,旨在帮助学员深入理解和掌握Java的核心概念。这个课程可能是通过视频形式进行的,结合了理论讲解和实际操作,以便让学习者能...

    黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件).zip

    本教程《黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件)》专注于讲解如何利用IO流来实现文本文件的复制操作。这个过程涉及到了对文件读取、数据缓冲以及写入等基础知识,对于初学者来说是理解和...

    黑马程序员_毕向东_Java基础视频教程第18天-11-IO流(文本文件读取方式二).zip

    在本教程“黑马程序员_毕向东_Java基础视频教程第18天-11-IO流(文本文件读取方式二)”中,主讲人毕向东将深入讲解如何使用Java有效地读取文本文件,特别是第二种常用的方法。以下是关于Java IO流和文本文件读取的...

    黑马程序员_历经5年锤炼(适合初学者入门的Java基础视频)(解压版)

    - **流的操作**:包括读取文件、写入文件、缓冲区操作等。 #### 6. 集合框架 - **集合概述**:集合框架是Java中用来存储和操作一组对象的数据结构。 - **List、Set、Map的区别**:List按插入顺序保存元素;Set不...

    JavaIO实例_字节流_字符流_缓冲流_转换流IODemo

    - 缓冲流是在原始流基础上添加了缓冲区,可以提高数据传输效率。Java提供了`BufferedInputStream`、`BufferedOutputStream`、`BufferedReader`和`BufferedWriter`等类。 - 缓冲流的主要作用是减少磁盘I/O操作的...

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、...day10_缓冲流、转换流、序列化流、Files day11_网络编程 day12_函数式接口 day13_Stream流、方法引用 Java基础小节练习题答案

    网络通信基础第五式——实现自定义字节流协议的KTM

    在实现KTM协议时,博主可能使用了Java或者其他编程语言,并可能涉及到网络套接字(Socket)、字节缓冲区(ByteBuffer)和多线程编程。源码分析可以帮助我们了解如何在实际代码中构建这些概念,例如如何编写读写操作...

    ByteIO_java_字节流_

    同时,`BufferedInputStream`和`BufferedOutputStream`这样的缓冲流可以提高读写性能,通过一次性处理多个字节而不是单个字节。 字节流在处理二进制数据时特别有用,如图像、音频、视频文件,或者处理任何非文本...

    Java-IO流高级-例题 & 例题源码 & PPT教学文档(黑马程序员详细版).rar

    本资料包“Java-IO流高级-例题 & 例题源码 & PPT教学文档(黑马程序员详细版).rar”提供了一个深入学习Java IO流的全面资源,包含实例题目、源代码以及PPT教学材料,适合对Java IO有进阶需求的开发者。 1. **Java ...

    缓冲区数据输入与输出c语言源程序库.rar_数据缓冲_缓冲_缓冲区

    在编程领域,尤其是在C语言中,理解和掌握缓冲区...理解并熟练使用缓冲区,无论是标准I/O库提供的还是自定义的,都是成为优秀C程序员的必备技能。通过深入学习和实践,你可以更好地控制数据的流动,优化程序性能。

    黑马程序员入学Java精华总结

    ### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...

    Java字符流与字节流区别

    Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元...字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--IO将输入流转成字节 |--Json读js资源文件 |--layout布局样式之style配置 |--listview 页面 图片加文字 |--ListView之CursorAdapter异步查询框架之短信 |--ListView之动态添加子view |--ListView优化之分页加载 |...

    JAVA_字节流和字符流

    在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理...理解并熟练掌握字节流和字符流的使用,对于Java程序员来说至关重要。通过实践和不断学习,可以更有效地进行数据的读取、存储和传输。

    串口接收带有FIFO缓冲区

    在串口通信中,数据以字节流的形式传输,当接收端接收到数据时,可能来不及立即处理所有数据。FIFO缓冲区就像是一个临时的数据存储区域,它按照“先入先出”的原则管理数据,即最早进入缓冲区的数据最先被处理。这样...

    java_examine.rar_java 试题_程序员 面试_程序员面试_面试_面试题

    7. **IO流**:字节流、字符流、缓冲流、转换流、对象序列化等。 8. **网络编程**:Socket通信、HTTP协议、TCP/IP基础知识。 9. **数据库连接**:JDBC API的使用、事务管理、SQL优化等。 10. **设计模式**:单例、...

    lua 字节流操作

    在处理网络通信时,数据通常以字节流的形式在网络间传输,因此了解如何在Lua中进行字节流的操作至关重要。本文将深入探讨"lua字节流操作"这一主题,以及它在“网络消息解包压包”和“字节组装”中的应用。 首先,让...

    【黑马面试宝典】虐面试官神器之必备黑马程序员面试宝典V2.51

    "【黑马面试宝典】虐面试官神器之必备黑马程序员面试宝典V2.51"是为准备面试的程序员提供的一份宝贵的资源,它涵盖了JavaSE基础、面向对象、多态以及异常处理等多个核心知识点。本文将详细解析这些内容,帮助你更好...

    Cobal_Strike_自定义OneLiner_Evi1cg's_blog1

    总结来说,这篇博客文章主要介绍了如何利用Java字节码操作工具Javassist来修改Cobalt Strike的源代码,特别是`common.CommonUtils`类中的`OneLiner`方法,以实现自定义的OneLiner命令。这种方法对于那些希望在Cobalt...

Global site tag (gtag.js) - Google Analytics