文件名称:
JAVA2核心技术 卷I:基础知识7th(1-2
开发工具:
文件大小: 6mb
下载次数: 0
上传时间: 2019-07-27
详细说明:NULL
博文链接:https://peitixin.iteye.com/blog/727526流与文件
577
参数:b
放置所读数据的数组
off
在b中的偏移量,读取的第一个字节放置在这里
len
读取的字节最大数
long skip(long n)
在输入流中跳过n个字节。返回实际跳过的字节数(如果到了流的结尾这个返回值可能会小
于n)。
int available()
返回可用的未阻塞的字节数。(回忆一下,阻塞意味着目前的线程丧失了它的运行权。
void close()
关闭输入流。
void mark(int readlimit)
在输入流的当前位置放置一个标记。(不是所有流都支持这个特性。)如果从输入流中读取
的字节多于 reallimit字节,那么允许流忽略这个标记。
void reset(
返回最后的标记。在之后调用read方法时将会重读那些字节。如果目前没有标记,则流将不
会被重置。
boolean markSupported()
如果流支持标记则返回true。
AiPL.java.io. OutputStream 1.0
abstract void write(int n)
写入一个字节的数据。
void write byte[]b)
写入数组b的所有字节。
void write(byte[ ]b, int off, int len)
写入数组b某一范围中的数据。
参数:b
指定从哪个数组写入数据
off
指定数组b的一个偏移量,从该位置开始的字节会被写入流中
len
要写入的字节数
void close()
刷新并关闭输出流。
void flush()
刷新输出流,即将缓冲区中的所有数据发送到目的地
122完整的流结构
C语言只需要有一个FE就可以了,与C语言不同,Java有一系列流类型,其数量超过60种
美河
学习在线
视频资料下载
电子图书交流
www.eilohe.coi
578
第12章
(见图12-1和图122)。类库的设计者声称:“有足够的理由为用户提供丰富的流类型的选择:这
样做可以减少程序的错误。”例如,在C语言中,许多人认为“将输出流写入一个只读模式的文
件”是很常见的错误。(事实上,这并不太常见。)
ByteArra
sequen日
String Buffer
Object
input stream
Inputstream
Inputstream
Inputstream
mpuiSlream
Sutured
Checked
Digest
LineNumber
Pushback
Inputstream
p山tstr!m
Inputstream
Inputstrcam
Input Stream
objecthnput
inpu(Stream
npuistre盘m
inputstream
Dataletpul
AccessFile
OutoutsIre
ByteArray
OutputStreamoutputStreamoutpuStreamOutputStream jQutputstream
BuRered
Checked
DeRate
Print stream
Outputstream
Outputstream
OutputStreamOutputStream OutpulStream
Outputstrear
GZP
○ utput Siren
Qutput Stream
图12-1输入和输出流的层次结构
当然,如果真那么做,在运行时将忽略它。在Java和C语言中,编译器会捕捉到这样的错误
因为 nputStream(Java)或 istream(C++)没有具体的输出方法
(我们认为在C艹+语言中,流接口设计者避免程序出错的主要“工具”是小心谨慎的态度。
在Java语言中更是如此。流库的髙度复杂性迫使程序设计人员谨小慎微。)
美河
www.eiloohe.cowm
流与文件
579
Suffered
CharAl
FilterReader
Inputstream
Pipedreader
StrirgReade
Read
Line Number
Pushback
FiieReader
Reade
Reade
write
WhEre
Fiterwrite
Pipedwriter
PrintWrite
StringWriler
Writer
writer
writer
Filer
图12-2 Reader和 Writer层次结构
C+注意: ANSI C十提供的流比实际需要的种类要多,包括 istream, stream, stream
ifstream、 ofstream、 fstream、 istream、 istrstream等(总共18个类)。Java提供的更
多
goes overbear
d),而且还提供了许多独立的类来选择缓冲、预查看
( lookahead)、随机存取、文本格式化( text formatting)和进制数据,
我们根据不同的用法来区分在流类“动物园”中的“动物”。四个抽象类构成了“动物园”的
基础: InputStream、 OutputStream、 Readei和Wmie。不用创建这些类型的对象,而是其他方法返回这些
对象。例如,在第10章中,URL类有个方法为 open stream,它返回一个 nputstream对象。然后再利
用这个 putStream对象来从URL中读取数据。前面已经讲过, InputStream和 utputStream类仅仅读取和
写人单个的宇节和宇节数组;它们没有读取和写入宇符串和数值的方法。需要具有功能更加强大
的子类来实现这些日标。例如, DataInputStream和 DataOutputStream能够读写所有的基本的Java类型
另一方面,对于 Unicode文本来说,前面巳经讲过,可以使用从 Reade「和Wier中派生出来的
类。 Reader和Wter类的基本方法和 Input Stream以及 Outputstrean类非常类似。
ahstract int read(
abstract void write(int b)
它们与在 nputstream以 utputStream类中相应的方法的工作方式基木相同,区别在于,「ead方法
美河
学习在线
视频资料下载
电子图书交流
www.eilohe.coi
58
第12幸
区回的是一个 Unicode字符单元(是一个0~6535中的整数),或是-1(当匕经到达文件的末尾
的时候)
最后,流还提供了其他一些有用的功能,例如, ZipInputstream和 ZipOutputStream能读写常见的
zIP压缩格式的文件。
而且,JDK50介绍了四个新接口: Closeable、 Flushable、 Readable以及 Appendable(见图12-3)。
前两种接很简单,分别有方法
void close()throws IOEXception
和
void flush()
nputStream、 utputstream、 Reader和 Writer类都实现了 Closeable接口。0 tputStream和 Writer实现了
F| usable接口
Strit
trea
Closeable
terra
图12-3 Closeable、 Flushable、 Readable和 Appendable接口
Readable接曰只有一个方法
int read( Char Buffer cb)
CharBuffer类具有能够顺序读/写和随机读/写的方法。它能够表示一个内存缓冲区或者一个内
存映像文件,
Appendable接口有两种方法,追加一个字符或者字符序列:
Appendable append(char c)
Appendable, append(CharSequence s)
Charsequence类型是另一-个接口,它描述了一个char值序列的最基本属性,并被 String
Char Buffe和 String Builder/String Buffer加以实现。
在流“动物园”中,只有 Writer实现 Appendable。
流与文件
581
java. o Closeable 5.0
void close()
关闭这个 Closeable对象。这个方法可能会抛出一个 EXceptio0n异常。
java. io Flushable 5.0
void flush()
刷新这个 Flushable对象。
erdl java. lang Readable 5.0
int read( Char Buffer cb)
试图读取cb能够容纳的足够数目的char值。返回读取的数目,或者-1(当无法再从这个
Readable对象中读取时)。
APnl java. lang Appendable 5.0
Appendable append(char c)
在这个 Appendable对象后面追加代码单元c;返回this
Appendable append( Char Sequence cs)
在这个 Appendable对象后面追加c中所有的代码单元;返回ths。
java. lang CharSequence 1.4
char charAt(int index)
返回位于指定索引上的代码单元。
int length()
返回这个序列中的代码单元的数量。
CharSequence sub Sequence int startIndex, int endIndex
返回一个 CharSequence对象,它由存储在 startIndex到 endIndex-1位置的代码单元组成。
· String to String()
返回一个由该序列的代码单元组成的字符串。
122.1流过滤器的分层
Filelnputstream和 FileOutputstream能够把输入和输出流与磁盘文件关联起来。要想达到这一目
的,只需要在构造器中给出文件名或者文件的具体路径名即可。例如:
FileInputStream fin new FileInputStream("employee. dat"):
将在当前路径下寻找名为" employee.dat"的文件。
警告:因为反斜线符在Java字符串中作为转义符使用,所以要在 Windows格式的路径名
中使用\作为路径分隔符("C: Windows win.ini")。在 Windows系统中,也可以使
用单独的正斜线符号("C:/ Windows/ WIn. InI"),这是因为大多数 Windows文件处理
美河
学习在线
视频资料下载
电子图书交流
www.eilohe.coi
582
第12章
系统将正斜线符号作为文件分隔符。但是,我们不推蒋这么做— windows的系
统功能可能会改变,并且在其他的操作系统上,文件分隔符可能并不相同。相
反,为了程序的可移植性,应该使用正确的文件分隔符。对应的文件分隔符存
放在常量字符串File. separator中。
也可以使用一个Fl对象(稍后介绍更多的关于文件对象的知识):
File t= new File(employee. dat
FilelnputStream fin new Fitelnputstream(f
与抽象类的 netstream和0 utputstream类似,这些类只在字节层次上支持读写。这意味着,只
能从fin对象中读取字节和宇节数组。
byte h=(byte) fin. read():
提示:因为所有在jaa0中的类都是将相对路径名解释为起始于用户的当前工作目录
所以应该清楚当前的目录。可以通过调用 System. getProperty("user.dir")来获得。
马上就可以看到,如果正好有一个 DataInputstream,就可以读取数值类型:
DataInputStream din
double s=din. read double(;
但是,就像 FileInputStream没有读取数值类型的方法一样, DataInputStream也没有从文件中读取
数值的方法。
Java使用了一种很聪明的策略来划分这两种职责。一些流(例如 IFilelnputstream以及URL类中
利用 open Stream方法来返回的输入流)可以从文件以及其他地方接收字节。另一些流(例如
DataInput-Stream和 Printwiter)可以将字节组合成更加有用的数据类型。Java程序员采用将一个已经
存在的流传递给另一个流的构造器方法,将这两种流结合起来,结合后的流被称为过滤沆
( filtered stream)。例如,为了能够从文件中读取数值,首先创建一个 FileInputstream,然后将它传
递给一个 DatalnputStream的构造器。
Fileinput Stream fin= new FileInputStream("employee. dat)
DataInputStream din=new DataInputStream(fin);
double s din read double():
非常重要的一点是:利用上面的代码建立的数据输入流并没有与一个新的磁盘文件对应
新创建的流依然通过访问与文件输入流相联系的文件获取数据。但是,现在可以使用一种功能
更多的接口了。
再看一下图12-1,可以看到其中的 Fileinputstream和 leOutputStream类。可以将它们的子类合
并为一个新的过滤流类,以便构造一个所需要的流。例如,在默认情况下,流是不能进行缓冲
处理的。换句话说,每次对流进行ead读取都会要求操作系统发送一个新字节。如果想要对当前
目录下的名为 employee. dat文件进行缓冲和数据输入操作,就需要使用下面这种有着奇异顺序的
构造器
DataInputStream din new DataInputStream
new BufferedInputstream(
new FileinputStream("employee. dat")))
注意,将 DataInputStream放置在这个构造器链的最后,其原因是要利用 DatalnputStream方法,并
美河
学习在线
视频资料下载
电子图书交流
www.eilohe.coi
沆与文件
583
且希望它们使用有缓冲的read方法。尽管上述代码的格式有些别扭,但是,有必要这样傚:必须
将流构造器连续分层,直到能够使用所需要的功能为止。
有时候,当把中间的流串接在一起时,需要对它们进行跟踪。例如,当读取输入的时候,
经常需要查看下一个字节是否是想要的值。Java为这种需要提供∫ PushbackInputStream
PushbackInputStream pbin= new PushbackInputStream(
new BufferedInputStream(
new FileInputStream( employee. dat))):
现在,可以冒险地读取下一个字节
int b= pbin, read()
如果不是自己想要的,将它扔回去。
if (b! ='c)pbin, unread(b)
但是ea和 unread方法是 pushback输入流所接收的仅有方法。如果既想预查看,又想读入数值,
就需要同时使用一个 pushback输入流和一个数据输入流引用。
DataInputstream din new Datainput stream(
pbin= new PushbackInputstream(
new Bufferedinputstream(
new FileInputStream("employee, dat))))
当然,在其他程序设计语言的流库中,像缓冲和预查看这样的细节都是自动处理的。在Java
中,当出现这些情况时,需要求助于流分层过滤器,这的确有点麻烦。但是,因为能够将过滤
器类进行混和与匹配,从而构造出真正实用的流序列,所以这也带来了很大的灵活性。例如:
利用下面的流序列可以从一个压缩的ZP文件中读取数值,参见图124。
ZiplnputStream zin =new ZipInputStream(new FileInputStream employee. zip
DatalnputStream din= new DataInputStream(zin);
File
netsTream
InputStream
read
read
read
图12-4过滤流的序列
(参考后面的ZP文件流,进一步了解Java如何处理ZP文件。)
总而言之,除了需要使用怪异的构造器对流进行分层之外,能够将流进行混和与匹配是Java
非常实用的特性之一!
584
第12章
java. io FileInputStream 1.0
FileInputStream(String name)
新建一个新的文件输入流,使用由name字符串指定的路径名下的文件
FilelnputStream(File f)
新建一个新的文件输入流,使用封装在Fie对象中的信息。(File类将在本章的最后进行介绍。)
Apt, java. io FileOutputStream 1.0
FileOutputStream( String name)
新建一个由name字符串指定的文件输出流。路径名不是绝对路径,而是相对于当前的工作路
径。警告:该方法会自动删除存在的同名文件
FileoutputStream( String name, boolean append)
新建一个由name字符串指定的文件输出流。路径名不是绝对路径,而是相对于当前的工作路
径。如果 append参数为tue,则将数据追加到文件的结尾。存在的同名文件不会被删除。
· FileoutputStream(Filf
新建一个使用封装在Fie对象中的信息的文件输出流。(File类将在本章的最后进行介绍。)警
告:这个方法会自动删除任何已经存在的且与的同名的文件。
java. ioBufferedInputStream 1.070
BufferedInputStream(InputStream in
新建一个默认大小的缓冲流。缓冲的输入流从一个流中读取字符,而不会每次都引起对设
备的访问。当缓冲区空时,一个新的数据块将会被读入缓冲区。
BufferedInputStream(InputStream in, int n)
根据用户自定义缓冲区大小,新建一个缓冲流
Apd, java. o. BufferedOutputStream 1.0
BufferedOutput Stream(Output Stream out
新建一个默认缓冲大小的缓冲流。缓冲输出流收集写入的字符以避免每次都引起对设备的
访问。当缓存区满或者流被刷新时,数据被写入设备。
Bufferedoutput Stream(OutputStream out, int n)
根据用户自定义的缓冲区大小,新建一个缓冲流。
apdl java. ioPushbackInputStream 1.0
PushbackInputStream(InputStream in
构造一个预查看一个字节的流。
PushbackInputStream(InputStream in, int size
使用指定大小的 pushback缓冲区构造一个流。
roid unread (int b)
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.