导航:首页 > 数据分析 > 数据流中输出流的都有哪些

数据流中输出流的都有哪些

发布时间:2023-12-08 01:40:48

① 数据流详细资料大全

数据流(data stream)是一组有序,有起点和终点的位元组的数据序列。包括输入流和输出流。

数据流最初是通信领域使用的概念,代表传输中所使用的信息的数字编码信号序列。这个概念最初在1998年由Henzinger在文献87中提出,他将数据流定义为“只能以事先规定好的顺序被读取一次的数据的一个序列”。

基本介绍

产生背景,细节数据,复杂分析,区别特征,分类,输入流与输出流,缓冲流,模型描述,形式化,数据集合,数据属性,计算类型,相关思路,简介,随机采样,构造略图,直方图,小波变换,新动向,小说流派,

产生背景

数据流套用的产生的发展是以下两个因素的结果:

细节数据

已经能够持续自动产生大量的细节数据。这类数据最早出现于传统的银行和股票交易领域,后来则也出现为地质测量、气象首悉尺、天文观测等方面。尤其是网际网路(网路流量监控,点击流)和无线通信网(通话记录)的出现,产生了大量的数据流类型的数据。我们注意到这类数据大都与地理信息有一定关联,这主要是因为地理信息的维度较大,容易产生这类大量的细节数据。

复杂分析

需要以近实时的方式对更新流进行复杂分析。对以上领域的数据进行复杂分析(如趋势分析,预测)以前往往是(在数据仓库中)脱机进行的,然而一些新的套用(尤其是在网路安全和国家安全领域)对时间都非常敏感,如检测网际网路上的极端事件、欺诈、入侵、异常,复杂人群监控,趋势监控(track trend),探查性分析(exploratory *** yses),和谐度分析(harmonic *** ysis)等,都需要进行在线上的分析。 在此之后,学术界基本认可了这个定义,有的文章也在此基础上对定义稍微进行了修改。例如,S. Guha等[88]认为,数据流是“只能被读取一次或少数几次的点的有序序列”,这里放宽了前述定义中的“一遍”限制。 为什么在数据流的处理中,强调对数据读取次数的限制呢?S. Muthukrishnan[89]指出数据流是指“以非常高的速者高度到来的输入数据”,因此对数据流数据的传输、计算和存储都将变得很困难。在这种情况下,只有在数据最初到达时有机会对其进行一次处理,其他时候很难再存取到这些数据(因为没有也无法保存这些数据)。

区别特征

与传统的关系数据模式区别 B.Babcock等[90]认为数据流模式在以下几个方面不同于传统的关系数据模式: 1. 数据在线上到达; 2. 处理系统无法控制所处理的数据的到达顺序; 3. 数据可能是无限多的; 4. 由于数据量的庞大,数据流中的元素被处理后将被抛弃或存档(archive)。以后再想获取这些数据将会很困难,除非将数据存储在记忆体中,但由于记忆体大小通常远远小于数据流数据的数量,因此实际上通常只能在数据第一次到达时获取数据。 三个 特点 我们认为,当前所研究的数据流计算之所以不同于传统的计算模式,关键在于这些数据流数据本身具有如下三个陆袭特点: 数据的到达—快速 这意味着短时间内可能会有大量的输入数据需要处理。这对处理器和输入输出设备来说都是一个较大的负担,因此对数据流的处理应尽可能简单。 酷睿2处理器 数据的范围—广域 这是指数据属性(维)的取值范围非常大,可能取的值非常多,如地域、手机号码、人、网路节点等。这才是导致数据流无法在记忆体或硬碟中存储的主要原因。如果维度小,即使到来的数据量很大,也可以在较小的存储器中保存这些数据。例如,对于无线通信网来说,同样的100万条通话记录,如果只有1000个用户,那么使用1000个存储单位就可以保存足够多和足够精确的数据来回答“某一用户的累计通话时间有多长”的问题;而如果共有100000个用户,要保存这些信息,就需要100000个存储单位。数据流数据的属性大多与地理信息、IP位址、手机号码等有关,而且往往与时间联系在一起。这时,数据的维度远远超过了记忆体和硬碟容量,这意味着系统无法完整保存这些信息,通常只能在数据到达的时候存取数据一次。 数据到达的时间—持续 数据的持续到达意味着数据量可能是无限的。而且,对数据进行处理的结果不会是最终的结果,因为数据还会不断地到达。因此,对数据流的查询的结果往往不是一次性而是持续的,即随着底层数据的到达而不断返回最新的结果。 以上数据流的特点决定了数据流处理的特点一次存取,持续处理,有限存储, 近似结果,快速回响。 近似结果是在前三个条件限制下产生的必然结果。由于只能存取数据一次,而且只有相对较小的有限空间存储数据,因此产生精确的计算结果通常是不可能的。而将对结果的要求从过去的“精确”改为“近似”后,实现数据流查询的快速回响也就成为了可能。

分类

数据的性质、格式不同,则对流的处理方法也不同,因此,在java的输入/输出类库中,有不同的流类来对应不同性质的输入/输出流。在java.io包中,基本输入/输出流类可按其读写数据的类型之不同分为两种:位元组流和字元流。

输入流与输出流

数据流分为输入流(InputStream)和输出流(OutputStream)两类。输入流只能读不能写,而输出流只能写不能读。通常程式中使用输入流读出数据,输出流写入数据,就好像数据流入到程式并从程式中流出。采用数据流使程式的输入输出操作独立与相关设备。 输入流可从键盘或档案中获得数据,输出流可向显示器、印表机或档案中传输数据。

缓冲流

为了提高数据的传输效率,通常使用缓冲流(Buffered Stream),即为一个流配有一个缓冲区(buffer),一个缓冲区就是专门用于传输数据的记忆体块。当向一个缓冲流写入数据时,系统不直接传送到外部设备,而是将数据传送到缓冲区。缓冲区自动记录数据,当缓冲区满时,系统将数据全部传送到相应的设备。 当从一个缓冲流中读取数据时,系统实际是从缓冲区中读取数据。当缓冲区空时,系统就会从相关设备自动读取数据,并读取尽可能多的数据充满缓冲区。

模型描述

我们试图从数据集合、数据属性和计算类型三个不同方面对数据流的模型进行归纳和描述。实际上,很多文章提出了各种各样的数据流模型,我们并没有包括所有这些模型,只是将其中比较重要的和常见的进行了归纳和分类。

形式化

以下是对数据流的一个形式化描述。 考虑向量α,其属性的域为[1..n](秩为n),而且向量α在时间t的状态 α(t)=<α1(t), ...αi(t), ...αn(t) > 在时刻s,α是0向量,即对于所有i,αi(s)=0。对向量的各个分量的更新是以二元组流的形式出现的。即,第t个更新为(i, ct),意味着αi(t)= αi(t . 1) + ct,且对于i. =.i,αi. (t)= αi. (t . 1)。在时刻t发生的查询是针对α(t)的。

数据集合

我们首先考虑在进行数据流计算时,有哪些数据被包含在计算范围之内。关于这个问题,主要有三种不同的模型:分别是数据流模型(data stream model)、滑动视窗模型(sliding window model)和n-of-N模型。 数据流模型(data stream model)在数据流模型中,从某个特定时间开始的所有数据都要被纳入计算范围。此时,s=0,即在时刻0,α是0向量。即这是数据流最初和最普遍的模型。 滑动视窗模型(sliding window model ,计算最近的N个数据)滑动视窗模型是指,从计算时算起,向前追溯的N个数据要被纳入计算范围。此时,s = t . N,即在时刻t . N,α是0向量。换句话说,要计算最近的N个数据。由于数据流的数据是不断涌现的,所以直观的看,这种模式就像用一个不变的视窗,数据随时间的推移经过视窗,出现视窗内的数据就是被计算的数据集合。M. Datar等[91]首先提出这一模式,随后得到了广泛回响[92]。 n-of-N模型(计算最近的n个数据,其中0 <n ≤ N) 文献[93] 提出的这种模型建立在滑动视窗模型的基础之上,比滑动视窗模型更为灵活:被纳入计算范围的是从计算时算起,向前追溯的n个数据。此时,s = t . n,即在时刻t . n,α是0向量。注意,其中n ≤ N,而且是可以随查询要求变化的。而在滑动视窗模型中,n = N而且是固定不变的。对于数据流处理系统来说,要能够回答所有长度小于等于N的滑动视窗问题。

数据属性

数据本身的特征: 时间序列(time series model) 数据按照其属性(实际上就是时间)的顺序前来。在这种情况下,i = t,即一个t时刻的更新为(t, ct)。此时对α的更新操作为αt(t)= ct, 且对于i. =.t,αi. (t)= αi. (t . 1)。这种模型适用于时序数据,如某特定IP的传出的数据,或股票的定期更新数据等。 收款机模型(cash register model) 同一属性的数据相加,数据为正。在这种模型中,ct >=0。这意味着对于所有的i和t来说,αi(t)总是不小于零,而且是递增的。实际上,这种模型被认为是最常用的,例如可以用于对收款机(收款机模型由此得名),各个IP的网路传输量,手机用户的通话时长的监控等等。 十字转门模型(turnstile model) 同一属性的数据相加,数据为正或负。在这种模型中,ct可以大于0也可以小于0。这是最通用的模型。S. Muthukrishnan[89]称其为十字转门模型起因于这种模型的功能就象捷运站的十字转门,可以用来计算有多少人到达和离开,从而得出捷运中的人数。

计算类型

对数据流数据的计算可以分为两类:基本计算和复杂计算。基本计算主要包括对点查询、范围查询和内积查询这三种查询的计算。复杂计算包括对分位数的计算、频繁项的计算以及数据挖掘等。 点查询(Point query) 返回αi(t)的值。 范围查询(Range query) 对于范围查询Q(f, t),返回 t . αi(t) i=f 内积(Inner proct) 对于向量β,α与β的内积 α . β =Σni=1αi(t)βi 分位数(Quantile) 给定一个序号r,返回值v,并确保v在α中的真实排序r.符合以下要求: r . εN ≤ r. ≤ r + εN 其中,ε是精度,N =Σni=1αi(t)。 G. S. Manku等[94]提供了对分位数进行一遍扫描进行近似估计的框架结构,将数据集合看成树的节点,这些节点拥有不同的权重(如节点中包含的数据个数)。认为所有的分位数的估计算法都可以被认为由三个对节点的操作组成产生新节点(NEW) 、合并(COLLAPSE)和输出(OUTPUT)。不同的策略构成了不同类型的树。这个框架结构成为后来很多分位数估计算法的基础。 频繁项(Frequent items)有时也称Heavy hitters,即找出在数据流中频繁出现的项。在这种计算中,实际上令ct =1。这样,αi(t)中保存了截至t时刻,维值等于i的数据到达的频率。对这些数据的查询又可分为两种: 找出头k个最频繁出现的项 找出所有出现频率大于1/k的项 对频率项的研究主要集中在后一种计算[95]。 挖掘对数据流数据进行挖掘涉及更复杂的计算。对这方面的研究包括:多维分析[96],分类分析[97, 98],聚类分析[99–102],以及其他one-pass算法[103]。

相关思路

简介

数据流处理过程中的主要难点在于如何将存储数据所花费的空间控制在一定范围之内。查询回响时间问题虽然也很重要,但相对容易解决。作为研究领域的一个热点,数据流处理问题得到了广泛的研究,出现了很多算法。 解决数据流庞大的数据量与有限的存储空间之间的矛盾的一个思路是使用采样,另一个思路是,构造一个小的、能提供近似结果的数据结构存放压缩的数据流数据,这个结构能存放在存储器中。略图(Sketch)、直方图(histogram)和小波(wavelet)实际上就都是这样的数据结构中最重要的三种。 以上方法实际上大都已用于传统资料库领域,问题在于如何将它们套用于数据流的特殊环境。

随机采样

随机采样(Random sampling)可以通过抽取少量样本来捕捉数据集合的基本特性。一个很常见的简单方法就是一致性采样(uniform sample)。作为一个备选的采样方法分层采样(strati.ed sampling)可以减少数据的不均匀分布所带来的误差。不过,对于复杂的分析,普通的采样算法还是需要太大的空间。 对于数据流的一些特殊计算,已经出现了一些有趣的采样算法。粘采样(Sticky sampling)[95]用于频繁项(frequent items)的计算。粘采样使用的方法是,在记忆体中存放二元组(i,f)所构成的集合S,对于每到来的一个数据,如果其键i已经存在于S,则对应的f加1;否则,以1 r 的机率进行采样,如果该项被选中,在S中增加一组(i,1);每过一段时间,对S中的组进行一遍扫描,对其中的值进行更新。然后增加r的值;结束(或用户要求结果)时,输出所有f.(s-e)N的组。 P. Gibbons提出的distinct sampling[104]用于distinct counting ,即找出数据流中不同值的个数。它使用哈希(hash )函式对每一个到来的不同值以2.(i+1)的机率映射到级别i上;如果i ≥记忆体级别L(L的初始值为0),将其加入记忆体,否则抛弃;记忆体满时,将记忆体中级别为L的值删除,并将L加1;最终对distinct count的估计为记忆体中不同的值乘以2L。distinct counting是资料库处理中的一个老问题,这种算法的优点是,通过设定合适的参数,可套用于带谓词的查询(即对数据流的一个子集进行distinct counting)。 采样算法的缺点是:它们对异常数据不够敏感。而且,即使它们可以很好的套用于普通的数据流模型,但如果要用于滑动视窗模型(sliding window model)[91] 或n-of-N模型[93],还需要进行较大的修改。

构造略图

构造略图(sketching)是指使用随机映射(Random projections)将数据流投射在一个小的存储空间内作为整个数据流的概要,这个小空间存储的概要数据称为略图,可用于近似回答特定的查询。不同的略图可用于对数据流的不同Lp范数的估算,进而这些Lp范数可用于回答其它类型的查询。如L0范数可用于估算数据流的不同值(distinct count);L1范数可用于计算分位数(quantile)和频繁项(frequent items);L2范数可用于估算自连线的长度等等。 略图的概念最早由N. Alon在[105]中提出,从此不断涌现出各种略图及其构造算法。 N. Alon 在[105]中提出的随机略图构造(randomized steching)可以用于对不同Lp范数的估算,最多需要O(n 1. lg n)的空间。该文更重要的贡献在于,它还可以以O(log n + log t)的空间需求估算L2。它的主要思路是,使用哈希函式,将数据属性的域D中的每一个元素一致地随机映射到zi ∈ {.1+ 1}上,令随机变数X = .i αizi,X2就可作为对L2范数的估计。 p1 S. Guha 等[88]提出的分位数略图(quantile sketch) 保持一组形如(vi,gi, Δi)的数据结构,rmax(vi) 和rmin(vi)分别是vi可能的排位的最大和最小值。对于i>j 满足: vi >vj gi = rmin(vi) . rmin(vi . 1) Δi = rmax(vi) . rmin(vi) 随着数据的到来,对此略图进行相应的更新操作,使估算保持在一定的精度之内。X. Lin等[93]对于这个问题做出了更形式化的描述。 若令AS为一个从[1..n]中提取的随机集合,每一个元素被提取的机率为1/2。A. Gilbert 等[106]构造若干个AS,将每个集合中元素值的和称为随机和(random sum)。多个随机和构成一个略图。对αi的估算为 2E(||AS|| |αi ∈ AS) . ||A||, 其中||A||为数据流中所有数的和。因此,这种略图可用于估算点查询的结果。使用多个这样的略图,可用于估算范围查询、分位数查询等。略图技术实际上是空间和精度相权衡的结果。为保证点查询结果的误差小于εN, 上述略图需要的空间通常是以ε.2作为系数的。与此相比较,G. Cormode 等提出的计数-最小略图(Count-Min Sketch )[19]只需要ε.1系数的空间。其思路也比较简单,使用若干个哈希函式将分别数据流投射到多个小的略图上,回答点查询时,每个略图分别作答,并选择值最小的作为答案。以点查询为基础,计数-最小略图可以用于其它各种查询和复杂计算。计数-最小略图并不计算Lp范数,而是直接计算出点查询的结果,这是它的时空效率比其它略图高的原因之一。

直方图

直方图(histogram)有两个含义:一个是普通意义上的直方图,是一种用于显示近似统计的视觉手段;另外,它还是一种捕捉数据的近似分布的数据结构/方法。作为后者出现时时,直方图是这样构造的:将数据按其属性分到多个不相交的子集(称为桶)并用某种统一的方式近似表示桶中的值[107]。 直方图 直方图方法主要用于信号处理、统计、图像处理、计算机视觉和资料库。在资料库领域,直方图原先主要用于选择性估计(selectivity estimation),用于选择查询最佳化和近似查询处理。直方图是一种最简单、最灵活的近似处理方法,同时也是最有效的一种。只要解决好数据更新问题,就可以将原有的直方图运用到数据流处理中。这类根据新的数据自动调节的直方图被称为动态(或自适应/自调节)直方图。 L. Fu等[108]提出的直方图主要用于中值函式(Median )和其他分位数函式的计算,可用于近似计算,也可用于精确查询。它通过确定性分桶(Deterministic Bucketing )和随机分桶(Randomized Bucketing )技术,构造多个不同精度的桶(buckets),然后将输入数据逐级分到这些桶中,从而完成了动态直方图的构造。 由于将静态直方图直接套用到数据流处理比较困难。S. Guha等[88]虽然可以动态地构造近最优的V-optimal 直方图,但只能套用于时间序列模型(time series model) 下的数据流。 一个常采用的方法是将整个算法分为两步:首先构造一个数据流数据的略图;然后从这个略图中构造合适的直方图。这种方法可以利用略图数据易于更新的特点,又能实现直方图的动态化。N. Thaper等[109]首先是构造一个近似反映数据流数据的略图,利用略图的优良的更新性能来实现数据的更新,然后从这个略图中导出一个直方图来实现对数据流数据的近似。由于从略图中导出最佳的直方图是一个NP-hard问题,作者提供了一个启发式算法(贪婪算法)来搜寻一个较佳的直方图。 A. Gilbert等[110]构造了一个概要的数据结构,该结构使用一组与文献[106]中类似的随机和结构来保存不同粒度级别的dyadic interval的值。随后,将不同粒度级别的dyadic interval([111])从大到小地加入所要构造的直方图中,这样就将近似误差降到最低(求精)。 A. Gilbert等在文献[112]中主要考虑的是如何降低对数据流中每个输入数据的处理复杂度。他们先将输入数据转化为小波系数(利用小波系数是信号与基向量的内积),然后采用了与文献[110]类似的dyadic interval处理方法。略图与直方图有很密切的联系,从某种方面来说,可以认为直方图是略图的一种特殊情况。

小波变换

小波变换(wavelet transformation)常用于生成数据的概要信息。这是因为通常小波系数只有很少一部分是重要的,大部分系数或者值很小,或者本身不重要。所以,如果忽略数据经过小波变换后生成的不重要系数,就可以使用很少的空间完成对原数据的近似。 Y. Matias等首先针对数据流数据构造一个直方图,使用小波对其进行模拟。随后保留若干最重要的小波系数实现对直方图的模拟。当新的数据出现时,通过对这些小波系数进行更新以实现直方图的更新。 文献提出的实际上是一种直方图方法,只不过使用了小波变换。A. Gilbert等指出小波变换可以认为是信号与一组正交的长度为N的向量集合所作的内积,因此构造一组数据流数据的略图,由于略图可以相当容易和准确地计算信号与一组向量的内积,则可以从略图计算出小波系数,从而用于点查询和范围查询的估计。

新动向

研究人员对数据流处理的研究不断深入,我们认为出现了以下新的动向: 未来略图 引入更多多的的统计 计技技术来构造略图 G. Cormode等主要处理对频繁项的计算。它以前人的主项(majority item ) 算法([116, 117])为基础,使用了error-correcting codes来处理问题。如数据的每一位设立一个计数器,再根据这些计数器的计数结果来推断频繁项集合。 Y. Tao等[118]实质上是对Probabilistic counting (已经广泛地用于资料库领域的distinct counting)在数据流处理的一种套用。 扩展略图 对略图进行扩展,以处理更更复复杂的查询询需需求 Lin等在文献[93]中构造了一个复杂的略图体系,可用于滑动视窗模型(sliding window model )和n-of-N模型的分位数估计,这是简单略图难以做到的。 在滑动视窗模型下,文献[93]将数据按时间顺序分为多个桶,在每个桶中建立略图(精度比要求的高),然后查询时再将这些略图合并(merge),其中对最后一个桶可能需要进行提升(lift )操作。维护时只删除过期的桶,增加新的桶。 在n-of-N model中,文献[93]将数据按EH Partitioning技术分为多个大小不同的桶,在每个桶中建立略图(精度比要求的高),然后查询时再将其中一部分略图合并,可以保证要求的精度,其中对最后一个同可能需要进行提升。 结合时空数据 与时空数据处理的进一步结合: J. Sun等在文献[120]中虽然主要针对时空数据的历史查询和预测处理。然而,文章却强调时空数据是以数据流的形式出现的,处理中也更着重于时空数据的更新性能。 Y. Tao等[118]使用数据流的方法处理时空数据,通过对动态的时空数据构造略图,用于分辨物体是否在多个区域间运动或静止的状态,并估算其数量。而这种问题在原先的时空处理中是很难解决的。

小说流派

网路小说数据流是新兴流派,意思是小说主角实力数据化,和网游属性栏一样的数据显示。

② 数据流的分类

数据的性质、格式不同,则对流的处理方法也不同,因此,在Java的输入/输出类库中,有不同的流类来对应不同性质的输入/输出流。在java.io包中,基本输入/输出流类可按其读写数据的类型之不同分为两种:字节流和字符流。 数据流分为输入流(InputStream)和输出流(OutputStream)两类。输入流只能读不能写,而输出流只能写不能读。通常程序中使用输入流读出数据,输出流写入数据,就好像数据流入到程序并从程序中流出。采用数据流使程序的输入输出操作独立与相关设备。
输入流可从键盘或文件中获得数据,输出流可向显示器、打印机或文件中传输数据。 为了提高数据的传输效率,通常使用缓冲流(Buffered Stream),即为一个流配有一个缓冲区(buffer),一个缓冲区就是专门用于传输数据的内存块。当向一个缓冲流写入数据时,系统不直接发送到外部设备,而是将数据发送到缓冲区。缓冲区自动记录数据,当缓冲区满时,系统将数据全部发送到相应的设备。
当从一个缓冲流中读取数据时,系统实际是从缓冲区中读取数据。当缓冲区空时,系统就会从相关设备自动读取数据,并读取尽可能多的数据充满缓冲区。

③ java 流的分类有哪些

按流向分:
输入流来: 程序可以从中读取源数据的流。
输出流: 程序能向其中写入数据的流。
按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
按功能分:
节点流: 用于直接操作目标设备的流

④ Java中流的分类都有哪些

字节流类
抽象父类: InputStream,OutputStream
实现类包括如下几种:
BufferedInputStream 缓冲流-过虑流
BufferedOutputStream
ByteArrayInputStream 字节数组流-节点流
ByteArrayOutputStream
DataInputStream 处理JAVA标准数据流-过虑流
DataOutputStream
FileInputStream 处理文件IO流-节点流
FileOutputStream
FilterInputStream 实现过虑流-字节过虑流父类
FilterOutputStream
PipedInputStream 管道流
PipedOutputStream
PrintStream 包含print() 和 println()
RandomAccessFile 支持随机文件
字符流
抽象父类:Reader, Writer

⑤ java 输入输出流 (被采纳为答案者加100分)

stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型:

(1)字节流

表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。

(2)字符流

以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。

区别:

Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。

但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。

一.流的层次结构

定义:

(1) java将读取数据对象成为输入流,能向其写入的对象叫输出流。

二.InputStream类

inputstream类和outputstream类都为抽象类,不能创建对象,可以通过子类来实例化。

InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:

(1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。

(2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的

(3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。

(4) public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,

(5) public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取

(6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭.

三.OutputStream类

OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。

1. public void write(byte b[ ]):将参数b中的字节写到输出流。

2. public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。

3. public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。

4. public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。

5. public void close( ) : 关闭输出流并释放与流相关的系统资源。

注意:

1. 上述各方法都有可能引起异常。

2. InputStream和OutputStream都是抽象类,不能创建这种类型的对象。

四.FileInputStream类

FileInputStream类是InputStream类的子类,用来处理以文件作为数据输入源的数据流。使用方法:

方式1:

File fin=new File("d:/abc.txt");

FileInputStream in=new FileInputStream(fin);

方式2:

FileInputStream in=new

FileInputStream("d: /abc.txt");

方式3:

构造函数将 FileDescriptor()对象作为其参数。

FileDescriptor() fd=new FileDescriptor();

FileInputStream f2=new FileInputStream(fd);

五.FileOutputStream类

FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。

创建一个文件流对象有两种方法:

方式1:

File f=new File("d:/abc.txt");

FileOutputStream out=new FileOutputStream (f);

方式2:

FileOutputStream out=new

FileOutputStream("d:/abc.txt");

方式3:构造函数将 FileDescriptor()对象作为其参数。

FileDescriptor() fd=new FileDescriptor();

FileOutputStream f2=new FileOutputStream(fd);

方式4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。

FileOutputStream f=new FileOutputStream("d:/abc.txt",true);

注意:

(1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。

举例:2-1

六.File类

File类与InputStream / OutputStream类同属于一个包,它不允许访问文件内容。

File类主要用于命名文件、查询文件属性和处理文件目录。

举例:2-2

七.从一个流构造另一个流

java的流类提供了结构化方法,如,底层流和高层过滤流。

而高层流不是从输入设备读取,而是从其他流读取。同样高层输出流也不是写入输出设备,而是写入其他流。

使用"分层对象(layered objects)",为单个对象动态地,透明地添加功能的做法,被称为Decorator Pattern。Decorator模式要求所有包覆在原始对象之外的对象,都必须具有与之完全相同的接口。这使得decorator的用法变得非常的透明--无论对象是否被decorate过,传给它的消息总是相同的。这也是Java I/O类库要有"filter(过滤器)"类的原因:抽象的"filter"类是所有decorator的基类。Decorator模式常用于如下的情形:如果用继承来解决各种需求的话,类的数量会多到不切实际的地步。Java的I/O类库需要提供很多功能的组合,于是decorator模式就有了用武之地。

为InputStream和OutputStream定义decorator类接口的类,分别是FilterInputStream和FilterOutputStream。

7.1 FilterInputStream
.......
具体去这里看看把,有很详细的介绍。希望对你有帮助。

⑥ java.io的Java流输入输出原理

Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。
在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流。 按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。
按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
按功能分:
节点流: 用于直接操作目标设备的流
过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。 JDK所提供的所有流类位于java.io包中,都分别继承自以下四种抽象流类。
InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputStream:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader:继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。 BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 BufferedOutputStream 该类实现缓冲的输出流。 BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 ByteArrayInputStream ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。 ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。 CharArrayReader 此类实现一个可用作字符输入流的字符缓冲区。 CharArrayWriter 此类实现一个可用作 Writer 的字符缓冲区。 Console 此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有)。 DataInputStream 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。 DataOutputStream 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。 File 文件和目录路径名的抽象表示形式。 FileDescriptor 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。 FileInputStream FileInputStream 从文件系统中的某个文件中获得输入字节。 FileOutputStream 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。 FilePermission 此类表示对文件和目录的访问。 FileReader 用来读取字符文件的便捷类。 FileWriter 用来写入字符文件的便捷类。 FilterInputStream FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。 FilterOutputStream 此类是过滤输出流的所有类的超类。 FilterReader 用于读取已过滤的字符流的抽象类。 FilterWriter 用于写入已过滤的字符流的抽象类。 InputStream 此抽象类是表示字节输入流的所有类的超类。 InputStreamReader InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。 LineNumberInputStream 已过时。此类错误假定字节能充分表示字符。

阅读全文

与数据流中输出流的都有哪些相关的资料

热点内容
网络维护系统都有哪些 浏览:938
刻绘大师文件格式 浏览:894
app下载是什么软件 浏览:899
编程员面试注意什么 浏览:20
公司备案证号看哪个文件 浏览:622
数据库及表的创建的操作步骤 浏览:87
如何进华为交换机编程 浏览:260
litepal外部数据库 浏览:261
迅雷用描述文件安装失败 浏览:789
app消费账单真的会寄吗 浏览:580
超链接文件名 浏览:770
安利盒子升级 浏览:848
编程stray错误什么意思 浏览:839
江右网络公司有哪些 浏览:314
微信怎么老是要登录 浏览:289
命令行隐藏文件夹 浏览:25
说谎其他版本 浏览:629
如何修改iphone的游戏存档 浏览:839
道客巴巴在哪个文件夹 浏览:918
弹个车app哪里下载 浏览:220

友情链接