注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

流的理解以及Java IO包中字节流、字符流详细说明  

2012-12-14 12:22:39|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

流是什么?流,是一个很重要的概念,暂时理解为流是Java通信中一个很抽象的机制,代表一个单向通道的一个端点。可以从通信通道中读出数据,也可以向通信通道中写入数据。流分两类:输入流和输出流。

 

什么是通信通道?一般通信通道通常可以将输出流与对应的输入流连接起来,所有写入输出流的信息都能依次从输入流中读取出来。这个连接可以是这几种方式:网络连接、不同进程之间的内存缓冲区、文件等。

有些说法,叫这个也可叫做一种数据源,这些数据源,我们分成而下的几种,字节数组,String对象,文件,管道,工作方式与实际管理相似,其它的数据源如Internet连接。对应每个数据源都会有相对应的子类。

 

为什么要用流呢?流为应用程序提供一个统一的数据接口,而不用考虑具体使用什么样的通信通道。

 

java的流是怎样的?都在I/O类由java.io包提供。


 内核类 

    从概念上讲,流就是有序的字节序列.但是,把流看作是"可以依次执行写入与读出操作的数据结构"会更形象.从定义来看,对流的写和读操作是依次进行的(而不是并发执行的),也就是说,客户程序能够逐个字节地依次向流中写入数据或者逐个字节地依次从流中读取数据.需要明确指出的,绝大多数类型的流都不支持"回退"(者说是"后悔")功能,即一旦客户程序从流中读出了若干数据,那就它只能接着向后检索剩余的数据了.同样地,一旦客户程序向流中写入了数据,那么已经被写入的数据就不可能再被抹除了. 
    乍看来,流的确是一个非常贫瘠的数据结构.对大多数任务来说,能直接存取对象的HashMap和ArrayList的确要比字节序列更受器重的多.但是,流拥有着独一无二的优点:对于计算机设备而言,流具备杰出的简易性和正确性.所谓正确性能够这样理解:无论客户程序发送数据至打印机还是客户程序发送数据至调制解调器,它们的代码实现机制都是相同的.这个机制被概括为"信息被逐个字节地发送至目的地,并且已经被发送的数据就绝不能再被收回了".因此,流就自然地成为了客户程序与计算机设备之间的理想抽象层.通过该抽象层,在数据交换过程中,客户程序就不必过多地关心计算机设备的各种细节信息了. 
    在现实生活中,虽然用户可以向打印机发送"取消打印请求"来撤消之前发送的"打印请求",但是"打印请求"消息已经被发送的事实是无法改变的. 
    流的使用步骤可以被归纳为三个阶段: 
    1.创建一个与设备相关的流实例.这个步骤被称为"打开"流. 
    2.从流实例中读出数据或向流实例中写入数据.这个步骤是设备无关的,它仅与流接口定义有关. 
    3.关闭流. 

有什么特点?

1.先进先出

2.顺序存取【一个接一个地写入一串字节】

3.只读或只写【输出流将数据写入通道,输入流从通道中读出数据】

      对于一个网络中,打一个网络连接,实际上是获得了两个流,一个是从网络中读取数据的输入流,而另一   个则是数据写入到网络的输出流。

4.阻塞

     阻塞是线程进入了睡眠状态,什么原因让线程进入睡眠呢?有两个情况,首先想读的数据没有;然后就是想写而不能马上去写。

     一个例子,当线程要求我们去输入信息的时候,那它就得等我们真的去敲击键盘去输入信息了,只有输入了信息它才能读到信息,在我们输入信息的过程中,线程是阻塞的。

 

相对于字节流另一种叫字符流?

      字符流以和一般的流传输字节型数据一样的方式传输16位Unicode字符。对于完全基于文本的通信,推荐使用字符流。这里提供了作为字节流和字符流之间的接口的通道转换类。它们可用来连接到非Unicode系统,如本地文件或网络流。这转换类统一性允许文本很容易从Unicode编码方式转换成ASCII,ISO Latin1,字符或其它合适的字节编码方式。


Java IO学习笔记:概念与原理
 
一、概念
 
Java中对文件的操作是以流的方式进行的。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分。
 
二、分类
 
流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕。流分类的方式很多:
 
1、按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序。
 
2、按照处理数据的单位不同分,字节流和字符流,字节流读取的最小单位是一个字节(1byte=8bit),而字符流一次可以读取一个字符(1char = 2byte = 16bit)。
 
3、按照功能的不同分,分节点流和处理流,节点流是直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的一种流,FileInputStream是一个接点流,可以直接从文件读取数据,但是BufferedInputStream可以包装FileInputStream,使得其有缓冲功能。
 
其实除了以上三种分类外,还有一些常常听到的一些分类比如:对象流、缓冲流、压缩流、文件流等等。其实都是节点流和处理流的子分类。当然你也可以创建新的流类型,只要你需要。
 
三、流分类的关系
 
不管流的分类是多么的丰富和复杂,其根源来自于四个基本的类。这个四个类的关系如下:
 
字节流
字符流
输入流
InputStream
Reader
输出流
OutputStream
Writer
 
 
四、字节流和字符流的相互转换
 
1、从字节流到字符流:InputStreamReader、OutputStreamWriter类可以实现。
 
2、从字符流到字节流:可以从字符流中获取char[]数组,转换为String,然后调用String的API函数getBytes() 获取到byte[],然后就可以通过ByteArrayInputStream、ByteArrayOutputStream来实现到字节流的转换。
 
 
以上知识是学习Java流的根基,对流的操作非常的容易,Java API中提供了丰富的流处理类,API也大差不差,看看文档即可上手。
  评论这张
 
阅读(386)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016