20110831日的总结--关于原始流与字符流之间的转换中的设计问题

Android获取音视频原始流数据方法详解 视频数据流的获取Android设备视频数据的获取,是调用Camera,所以需要在AndroidManifest中添加以下的权限:<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature androi 阅读详情

关于原始流与字符流之间的转换中的设计问题

 

装饰模式在这里显然派上了很大的用用场,现在先分析一下InputStramReader到底是如何将原始流包装成字节流的。

明显他们中间的主接口是 InputStream,这个接口主导了其中的设计,使各个类之间能够方便被相互修饰,说白了还是装饰模式。

 

比较不解的地方就是在使用 OutputStreamWrite中的write(byte[] b, int off, int len);中的方法的时候会莫名错误(当然错误的提示很明确,但是我查看过java.io.OutputStreamWriter类的源码之后发现一个很奇怪的问题),莫名的原因就是因为在查看 java.io.OutputStreamWriter的源码的时候发现,其中的weite(byte[]b, int off,int len)方法的参数竟然是一个StreamEncoder类型的,经过我查看其中的类型发现StreamEndcoder是com.sun.nio包下的一个类,其实不是特别清楚,想去查看源码,但是发现竟然没有com.sun这个包,然后就很不解了,忘指点。

 

其他的关于IO流的东西,已经比较清楚了,我希望可以用java做出来一些特例独行,和别人不一样的东西,最近在设计的网站雏形还没有出来,更是没时间做,主导开发还是php,所以近期压力比较大,也不能说压力大吧,随便看一下而已。

 

如果老师们看一看 thinking in java之后可以模仿上面的方法来教导学生,其实如果只是想知道语法和基础的东西的话自己看就可以了,我更希望得到切实的经验,因为对一个不聪明的人来说,经验是最宝贵的,尤其是自己得不到的经验

 

下面是一篇比较好的概述,方便以后查看

Java中的流、字符流和字节流

 

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://sobaid.blogbus.com/logs/59873645.html

一、什么是流:

流是一个抽象的概念。当Java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。

流分为字节流和字符流。字节流也称为原始数据,需要用户读入后进行相应的编码转换。而字符流的实现是基于自动转换的,读取数据时会把数据按照JVM的默认编码自动转换成字符。

字节流由InputStream和OutputStream处理,而字符流由Reader和Writer处理。Reader和Writer是Java后加入的处理类,出于让数据的处理更方便的目的。

二、字节流和字符流

      如果数据流中最小的数据单元是字节,那么称这种流为字节流;如果数据流中最小的数据单元是字符,那么称这种流为字符流。在Java的IO系统中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,java.io.Reader和java.io.Writer分别表示字符输入流和字符输出流。

I/O流的层次

1.字节流:

从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。

◇ InputStream、OutputStream

  ◇ FileInputStream、FileOutputStream

  ◇ PipedInputStream、PipedOutputStream

  ◇ ByteArrayInputStream、ByteArrayOutputStream

  ◇ FilterInputStream、FilterOutputStream

  ◇ DataInputStream、DataOutputStream

  ◇ BufferedInputStream、BufferedOutputStream

 2.字符流:

从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。

◇ Reader、Writer

  ◇ InputStreamReader、OutputStreamWriter

    ◇ PipedReader、PipedWriter

  ◇ FileReader、FileWriter

  ◇ CharArrayReader、CharArrayWriter

  ◇ FilterReader、FilterWriter

  ◇ BufferedReader、BufferedWriter

  ◇ StringReader、StringWriter

 3.对象流

  ◇ ObjectInputStream、ObjectOutputStream

4.其它

  ◇ 文件处理:

  File、RandomAccessFile;

  ◇ 接口

  DataInput、DataOutput、ObjectInput、ObjectOutput
三、字节流

    1. 处理概述:  

对于字节流处理的类都继承自InputStream和OutputStream这两个抽象类。

InputStream提供的最重要的方法是:

Java代码

1.     read();   

2.     read(byte[] b) ;   

3.     read(byte[] b, int off, int len) ;  

 

用于从输入流中读取字节。

OutputStream提供的最重要的方法是:

Java代码

1.     write(int b);   

2.     write(byte[] b);   

3.     write(byte[] b, int off, int len)   

用于将字节写入输出流。

2. 字节流:

字节流的处理类有很多,他们都继承自InputStream或者OutputStream抽象类。

输入流: 

先谈谈输入流,输入流中跟数据源直接接触的类有:FileInputStream和ByteArrayInputStream,他们分别实现了从文件或者内存中的字节数组读入数据到输入流。

 

其他的输入流处理类都是装饰类(Decorator模式),下面对他们进行一下简单介绍: 

BufferedInputStream: 提供了缓冲功能。

DataInputStream: 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

PipedInputStream: 允许以管道的方式来处理流。当连接到一个PipedOutputStream后,它会读取后者输出到管道的数据。

PushbackInputStream: 允许放回已经读取的数据。

SequenceInputStream: 能对多个inputstream进行顺序处理。

 

输出流:

基本上每个输入流类都有一个相应的输出流类,提供相应的输出流处理。

同样,跟数据目的地直接接触的类有:FileOutputStream和ByteArrayOutputStream,前者实现了把数据流写入文件的功能,后者实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。

下面对其它的装饰类做一下简单介绍:

BufferedOutputStream: 提供了缓冲功能的输出流,在写出完成之前要调用flush来保证数据的输出。

DataOutputStream: 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

PipedOutputStream: 允许以管道的方式来处理流。可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。

PrintStream: 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。我们经常用到的System.out或者System.err都是PrintStream。

 四、字符流:

1.  字符流处理概述

所有的字符流操作类都继承自Reader或者Writer这两个抽象类。

Reader提供的重要方法有:

Java代码

1.     read(char[] cbuf);   

2.     read(char[] cbuf, int off, int len);   

3.     read(CharBuffer target);  

 

他们提供了从流中读取数据到字符数组或者CharBuffer的功能。

 

Writer提供的重要方法有:

Java代码

1.     write(char[] cbuf);   

2.     write(char[] cbuf, int off, int len);  

3.     write(int c);   

4.     write(String str);   

write(String str, int off, int len);  

他们提供了把字符、字符数组或者字符串写入流中的功能。

 

   2. 字符流处理

 

输入流:

       跟数据源直接接触的类:

CharArrayReader: 从内存中的字符数组中读入数据,以对数据进行流式读取。

StringReader:从内存中的字符串读入数据,以对数据进行流式读取。

FileReader:从文件中读入数据。注意这里读入数据时会根据JVM的默认编码对数据进行内转换,而不能指定使用的编码。所以当文件使用的编码不是JVM默认编码时,不要使用这种方式。要正确地转码,使用InputStreamReader。

 

   装饰类:

BufferedReader:提供缓冲功能,可以读取行:readLine();

LineNumberReader: 提供读取行的控制:getLineNumber()等方法。

InputStreamReader: 字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。

 

输出流:

 

根数据目的相关的类:

CharArrayWriter:把内存中的字符数组写入输出流,输出流的缓冲区会自动增加大小。输出流的数据可以通过一些方法重新获取。

StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。

FileWriter:把数据写入文件。

 

装饰类:

BufferedWriter:提供缓冲功能。

OutputStreamWriter:字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。

PrintWriter: 向文本输出流打印对象的格式化表示形式。

 

流处理中的其它方法:

mark和reset用于重复读取某段的数据,如下代码:

     Java代码

1.     is = new BufferedInputStream(new FileInputStream("res/input.data"));  

2.     assertTrue(is.available() > 0);   

3.     assertTrue(is.markSupported());     

4.     // The read limit has no effect.  

5.     is.mark(0);     

6.     int first = is.read();   

7.     int second = is.read();     

8.     is.reset();   

9.     int firstAgain = is.read();   

10.   int secondAgain = is.read();     

11.   assertEquals(first, firstAgain);   

12.   assertEquals(second, secondAgain);  

Writer或者OutputStream中的flush(): 刷新该流的缓冲,用于确保数据的输出。

 

close(): 关闭流并释放与之关联的所有系统资源。

 

 

 

AD从原理图到PCB超详细教程 我在学习AD的时候,看了网上很多教程,但是东西很杂,有很多条理不清而且废话很多,所以相信大家学习的时候也是遇到一样的困难。我就特地写一篇帖子,整理了一下AD从画原理图开始一直到画完PCB文件的所有步骤,一方面是供大家参考学习,另一方面可以方便我自己学习记忆更加深刻。我用的版本是AD16中文版,大家用新的版本AD20或者AD22应该操作都是差不多的。 阅读详情

相关推荐

基于boot + 双app升级方案

基于boot+双app的升级方案

weixin_44654285的博客 4515

06-IO流(原始流、缓冲流)

是文件和目录路径名的抽象表示文件和目录是可以通过File封装成对象(私有的)的对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已它可以是存在的、也可以是不存在的—将来是要通过具体的操作把这个路径的内容转换为具体存在的File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法File类的静态变量File类的构造方法方法名说明通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例从父路径名字符串和子路径名字符串创建新的 File实例。

m0_54230514的博客 193

闲置服务器之代理服务器篇

这台服务器是在阿里云免费白嫖的,天工开物计划,阿里给的300块无门槛优惠券,买了一台新加坡的境外服务器,288,刚刚抵扣完,因为是境外服务器,能够访问一些国内不能访问的网站,所以本文章仅从技术的角度来搭建代理服务器,使用时,请自觉遵守国家相关规定,如有任何违法行为,与本人无任何关系!!!。本文使用tinyproxy来搭建代理服务器。

m0_50281408的博客 2104

Java Stream(流)的分类, 四大基本流的介绍

上一篇文章已经介绍过什么是流, 以及流的基本概念 http://blog.youkuaiyun.com/nvd11/article/details/29917065 本文主要介绍java

nvd11的专栏 9934

不到200块!手把手教你用ZYNQ7010和AD9363攒一台自己的开源SDR硬件(附BOM清单)

本文详细介绍了如何用不到200元的预算,基于ZYNQ7010 FPGA和AD9363射频芯片打造一台功能完备的开源SDR硬件平台。从核心组件选型、PCB设计到焊接调试,提供全流程实战指南,特别适合预算有限的硬件爱好者和创客群体探索无线通信世界。

weixin_26854829的博客 479

STM32串口编程基础知识讲解

本篇文章给大家介绍一下串口的基础编程知识,这些知识是属于串口的理论知识,在开始学习编写代码的时候必须要掌握这些基本的知识点。本篇文章讲解了串口的基本概念知识,大家在学习编写代码时将其掌握才能更好的理解代码。

m0_49476241的博客 1208

原始视频流的格式问题

1 RGB

markman101---神即是道 道法自然 如来 4125

YOLOv13改进策略【注意力机制篇】| ICASSP 2023 EMA 高效多尺度注意力,跨空间学习提高远距离建模依赖

ICASSP 2023 EMA 高效多尺度注意力在 YOLOv13 的接入实战:跨空间学习提升远距离依赖建模,含原理图解、完整代码、yaml 配置与实测参数量对比(ultralytics 8.3.63)。

qq_53329130的博客 934

你的Java知识有多深?

来自:http://www.cnblogs.com/avenwu/archive/2012/02/24/2367304.html 前言 关于java的基础知识,只是在大二初学时看得多些,今天看了看张孝祥老师的视频,突然发现自己根本不了解Java很多东西,有些是忘了,而有些以前根本不知道,拿来分享一下,这些你曾注意吗?(牛人就不要往下看了)   1.“&”和“&&”的区别分析

hack2me---Just for fun 1462

从 Open SQL JOIN 走向 ABAP CDS Association:把查询写成可复用的数据模型

摘要: 本文通过飞行模型示例,对比了ABAP中三种表关联实现方式:Open SQL JOIN、CDS显式JOIN和CDS Association。重点解析了Association的本质是将表关系声明为数据模型语言,使用时通过路径表达式按需展开为JOIN。文章指出路径表达式在不同位置会默认展开为不同JOIN类型(如SELECT列表默认为LEFT OUTER),并演示了如何用[inner]强制指定INNER JOIN。最后结合S/4HANA实际案例,说明Association通过中心化关系定义和路径复用,能有效

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 384

2025年数学建模国赛高教社杯A题、B题、C题、D题、E题详细思路和代码 模型||插值与拟合

核心思想:构造一个精确通过所有已知离散数据点(xi, yi)的函数y = f(x),并以此函数来估算或预测未知点的值。基本假设:我们认为已知的数据点是100%精确、无误差的(或者误差可忽略不计),比如理论计算值、高精度仪器测量值等。我们的目标是“还原”或“重建”出点与点之间的真实函数关系。关键特征精确性:曲线或曲面必须穿过每一个样本点。局部性:插值结果严重依赖于局部数据点的分布和数值。用途:用于“补全”数据、填充缺失值、进行函数近似等。常见方法多项式插值:拉格朗日插值、牛顿插值。

2201_76125261的博客 802

SmartRCP是什么

这是个好东西,果断备忘 本系列简要介绍怎样使用smartrcp构建强大可伸缩的桌面程序。项目地址:http://code.google.com/p/smartrcp/ SmartRCP是什么 SmartRCP是一个使用Java与Flex 编写

hack2me---Just for fun 822

第六:Charles抓包-苹果手机抓包

【代码】第六:Charles抓包-苹果手机抓包。

欢迎来到本博客! 1658

今天的作业 java IO练习,一个山寨记事本,没什么技术含量

/* * 2011 08 29 java IO操作小练习 * Notepad 山寨记事本 * ×很多人都写过的东西,没记错的话已经是第二次写了吧,没什么技巧,也没什么算法,纯属熟悉程序的练手,一直想写一个完整的,还是先把作业交了再说吧 ×一直想把程序尽量规范起来,希望能进步快点

hack2me---Just for fun 794

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

30日学习笔记,关于java的IO系统已经Decorarot模式

这是纯技术性质的总结,所以果断不废话。   关于 java I/O处理,其实我个人认为如果从一般学习者就是之前没有经验的人开始理解起来确实是比较困难的,这里我要作出一个对比,我想表达的是别人不曾表达的东西,关于概念性的基础中的基础的问题(比如说流是如何被比喻的,还有就是各种语

hack2me---Just for fun 774

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

新手学习java的心得体会

<br /><br />/**2011年3月12日<br />* Hacked by Younger.shen<br />*http://www.hack2me.com<br />*younger.x.shen@gmail.com<br />*/<br /> <br />研究java也有几个月的时间了,现在想写一点心得体会,虽然我现在基本上还是停留在读书写程序片段死扣语法的阶段,但是我认为还是很有必要来写一写的。<br />首先对于java的认识让我一开始对java没有太多的好感,直到现在读了很多书之后才认

hack2me---Just for fun 755

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

20110829 日作业,复制文件,简单IO操作,我自己扩展过的,比题干要求的功能多点

/* * 20110829 日作业 * coded by Younger.shen申延刚 younger.x.shen@gmail.com * blog : blog.youkuaiyun.com/hack2me * blog : youngershen.com/blog/ (you sh

hack2me---Just for fun 712

自编java细节(3)----之你不可能得到正确的结果

我很高兴这一刻我又有了新的进展,又找到了新的好玩的东西, 先来看看下面的一段程序 public static boolean isOdd(int i){ return i % 2 == 1; }你可否会考虑一下上面的方法是否总是正确,它是否会得到意想不

hack2me---Just for fun 670

最近在练手的一个管理系统

当然做java ee的不可能没做过这样的小型ERP的吧,感觉相当无聊,不过练手也是必须的,在设计上,站在新手的角度上,要把业务逻辑和UI实现分开,然后用OOP的设计模式分布把系统完善出来,是相当不容易的,因为没有任何经验,都是一边摸索一边在做的。 还有这个系统目前只是整个系统中的一个子集,希望能够把代码重用的精髓突出出来,java就像钢琴一样,要弹的好的话需要2点,首先是有天赋,然后是从小

hack2me---Just for fun 658

20110830 java IO处理学习----一个自写文件复制类

要说java 的IO处理因为有了很多类看起来是很方便的,虽然都封装好了很多算法细节,但是如果只看JDK 文档的说明还是十分困惑的,比如说BufferedReader类里面的readLine()方法,刚开始的时候光看名字我一直以为是读取行可以间接读取的,其实是不可以间接读取的,在自

hack2me---Just for fun 566

最近项目的 core逻辑核心程序

这次的设计也算是失败了百分之40的,不过拿来练手也确实是学到了很多东西,学会了解决问题的很多不通的方法,整个系统是一个子集而已,还需要很多完善,而且想做一个高仿的,看来还是需要继续改进,最近又要忙了,自己给自己打气,晓儿,你加油哦! package com.youngershen.mrp;import java.util.*;import java.sql.*;//°ÑžÃ

hack2me---Just for fun 561

2011 下学期计划

I have seen thefuture , It is in my browser      这个题目是我突然找到到的现在我手中有一张田爱娜的名片,名片的反面写着这样的一句话,当然这是html5小组的口号。 开放互联网给了很多人很多梦想与希望,html5又一次给了每个人

hack2me---Just for fun 527

2011 09 15 学习笔记

一直在进行增删改查的联系,mysql可真够没意思的,就插入一个图片,折腾了一晚上,也不知道是什么情况,从来没人告诉我数据库的编码是 gbk的话就插不进去图片,无意中发现一个帖子才解决了问题, 如果你在mysql中插入图片的时候出现奇怪的报错信息,通常都是 sql语句的语法错,而

hack2me---Just for fun 514

2011 0907学习总结

2011 09 07 学习总结 今天上课的时候主要学习的是java的线程调度,说到底最关键的还是2个方法 wait和notify这两个方法是非常关键的,在进行线程调度的时候由于书本上和老师总结的都不十分完全,所以我现在必须要把问题说清楚,明明白白的说清楚,就我今天晚上帮同学解决

hack2me---Just for fun 504

自编java细节(1)

也是暑期時候寫的, 之前發布於 http://youngershen.com/blog 自编java细节(1) on August 13th, 2011 by youngershen | No Comments » java 是很强

hack2me---Just for fun 482

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 288
上一篇: 一个JS的RPG引擎,备忘,准备写个html5的动作游戏
下一篇: 2011 -09-01-实现递归列目录的操作
程序员迈克
博客等级 码龄16年 36粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值