JavaIO流详解Word格式文档下载.docx
- 文档编号:19862195
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:16
- 大小:46.24KB
JavaIO流详解Word格式文档下载.docx
《JavaIO流详解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《JavaIO流详解Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
这两个数据流又可以分为许多子类来完成IO功能。
Java1.1版本正式加入了Reader和Writer两个类,支持JavaIO的国际化标准,并通过国际化字符编码(Unicode)将文本存储起来。
如图10.5所示是JavaIO的类图。
如图10.6所示是Java的Reader和Writer类图。
Reader类类似于InputStream类,它是输入类层次中的基础,Reader支持16位的Unicode字符输出,而InputStream只支持8位字符输出。
Reader类有如下所示的6个直接子类。
BufferedReader:
该类支持缓冲字符输入,它的子类LineNumberReader支持缓冲输入并能够追踪行数。
CharArrayReader:
该类能够从一个字符缓冲区中读入一个字符输入流。
FilterReader:
是一个抽象类,是过滤的字符输入数据流的基础。
InputStreamReader:
该类可以把字节输入流转换为字符输入流,子类FileReader用来读取字符文件。
PipedReader:
该类用来从一个管道中读取字符。
StringReader:
该类从一个字符串中读取字符。
面试例题28中,System.out是PrintStream的一个子类,而PrintStream继承了FilterOutputStream类,FilterOutputStream类继承了OutputStream类。
PrintStream对象并没有抛出IOException异常。
答案:
(a)(b)(c)。
10.3.2
使用InputStream和OutputStream
面试例题29:
哪个语句可以建立文件"
file.txt"
的字节输入流?
(a)InputStreamin=newInputStream("
);
(b)InputStreamin=newFileReader("
(c)FileInputStreamin=newFileOutputStream("
(d)FileInputStreamin=newFileInputStream("
考查求职者对InputStream和OutputStream的掌握。
1.InputStream类的常见方法
publicabstractintread()throwsIOException:
从当前输入流中读取数据的下一个字节。
返回的字节值是在0~255范围内的一个int型数。
如果已读到流的末尾,没有再可读的字节时,则返回-1。
该方法将一直阻塞,直到有输入数据,检测到了数据流尾或抛出异常。
子类必须提供当前方法的一个实现。
publicintread(byteb[])throwsIOException:
将当前输入流中b.length个字节的数据读到一个字节数组中。
本方法用b.0和b.length3个参数调用具有3个参数的read()方法。
publicintread(byteb[],intoff,intlen)throwsIOException:
将输入流中len个字节数据读入一个字节数组中。
这个方法将保持阻塞直到有输入数据可用。
如果参数b为null,则将抛出NullPointerException。
本方法使用零个参数的read()方法,一次读取一个字节,并将之放入该数组。
鼓励子类提供一个更有效的当前方法的实现。
publiclongskip(longn)throwsIOException:
从当前输入流中跳过并丢弃n个字节数据,返回实际跳过的字节数。
publicvoidclose()throwsIOException:
关闭当前输入流,并释放与它相关的任一系统资源。
InputStream的close()方法不做任何事。
publicsynchronizedvoidmark(intreadlimit):
在该输入流中标记当前位置。
后续调用reset()方法重新将流定位于最后标记位置,以便后续能重新读取相同字节。
readlimit参数给出当前输入流在标记位置变为非法前允许读取的字节数。
publicsynchronizedvoidreset()throwsIOException:
将该输入流重新定位到上一次调用mark方法时标记的位置。
InputStream的reset()方法抛出一个IOException,因为输入流默认不支持mark()和reset()方法。
可以通过markSupport()方法测试输入流是否支持mark()和reset()方法。
publicbooleanmarkSupported():
测试该输入流是否支持mark()和reset()方法。
InputStream的markSupported方法返回false。
2.OutputStream类的常见方法
publicabstractvoidwrite(intb)throwsIOException:
将指定字节写入当前输出流。
OutputStream的子类必须提供此方法的一个实现。
publicvoidwrite(byteb[])throwsIOException:
将指定的字节数组中b.length字节,写到当前输出流。
OutputStream的write方法,用3个参数b、0和b.length调用具有3个参数的write()方法。
publicvoidwrite(byteb[],intoff,intlen)throwsIOException:
将指定字节数组中从off开始的len个字节写到当前输出流。
OutputStream的write()方法调用一个参数的write()方法,输出每个字节。
子类应覆盖这个方法,并提供更有效的实现方法。
publicvoidflush()throwsIOException:
刷新当前输出流,将任何缓冲输出的字节输出到此流中。
关闭当前输出流,且释放与它相关的任一系统资源。
面试例题39中需要注意的是"
字节流"
,所以(a)是正确的选项。
(a)。
10.3.3
常用的文件操作类
(1)
面试例题30:
选择正确的文件操作。
当前文件系统中已经存在了文件file.txt,该文件包涵有ASCII文本,代码片段如下:
try{
Filef=newFile("
outputStreamout=newFileOutputStream(f,true);
}
catch(IOException){}
结果是什么?
(a)代码不能编译。
(b)代码可以编译并运行,对该文件不会有改变。
(c)代码可以编译并运行,并将该文件的长度设置为0。
(d)抛出异常,因为该文件没有关闭。
(e)代码可以编译运行,并从文件系统中删除该文件。
考查求职者对Java的文件输入输出相关类的熟悉程度。
Java为文件的操作提供了丰富的类,这里主要介绍几个经常用到的类。
1.File类
File类的实例表示主机文件系统中的文件。
一个文件能通过一个路径名指定,此路径名可以是一条绝对路径名,也可以是一条相对于当前工作目录的相对路径名。
路径名必须遵循主机平台的命名约定。
File类提供了一种抽象方式,以与机器无关的方式处理有关文件和路径名的大多数复杂问题。
不管何时使用一个文件名或路径,均假定使用主机的文件命名规范。
File类的构造函数如下所示。
File(File,String):
创建一个File实例,表示指定路径指定名称的文件。
File(String):
创建一个File实例,表示路径名是指定路径参数的文件。
File(String,String):
创建一个File实例,它的路径名是指定的路径名后跟分隔符字符和name参数。
File类的常用方法如下所示。
canRead():
测试应用程序是否能从指定的文件中进行读取。
canWrite():
测试应用程序是否能写当前文件。
delete():
删除当前对象指定的文件。
equals(Object):
比较该对象和指定对象。
exists():
测试当前File是否存在。
getAbsolutePath():
返回由该对象表示的文件的绝对路径名。
getCanonicalPath():
返回当前File对象的路径名的规范格式。
getName():
返回表示当前对象的文件名。
getParent():
返回当前File对象路径名的父路径名,如果此名没有父路径则为null。
getPath():
返回表示当前对象的路径名。
hashCode():
计算此文件的一个哈希码。
isAbsolute():
测试当前File对象表示的文件是否是一个绝对路径名。
isDirectory():
测试当前File对象表示的文件是否是一个路径。
isFile():
测试当前File对象表示的文件是否是一个"
普通"
文件。
lastModified():
返回当前File对象表示的文件最后修改的时间。
length():
返回当前File对象表示的文件长度。
list():
返回当前File对象指定的路径文件列表。
list(FilenameFilter):
返回当前File对象指定的目录中满足指定过滤器的文件列表。
mkdir():
创建一个目录,它的路径名由当前File对象指定。
mkdirs():
创建一个目录,它的路径名由当前File对象指定,包括任一必须的父路径。
renameTo(File):
将当前File对象指定的文件更名为给定参数File指定的路径名。
toString():
返回当前对象的字符串表示。
2.FileInputStream
文件输入流是一个从File或FileDescriptor读取数据的输入流。
输入流以字节为单位(非unicode),二进制数据与编码无关,不存在乱码问题。
构造器如下所示。
FileInputStream(File):
创建一个输入文件流,从指定的File对象读取数据。
FileInputStream(FileDescriptor):
创建一个输入文件流,从指定的文件描述器读取数据。
FileInputStream(String):
创建一个输入文件流,从指定名称的文件读取数据。
常见的方法介绍如下。
available():
返回从当前文件输入流中可无阻塞读取的字节数。
close():
关闭当前文件输入流,并释放与它相关的任一系统资源。
finalize():
当这个文件输入流不再有引用时,确保调用它的close()方法。
getFD():
返回与当前流相关的不透明的文件描述符。
read():
从当前输入流中读取一个字节数据。
read(byte[]):
将当前输入流中b.length个字节数据读到一个字节数组中。
read(byte[],int,int):
skip(long):
跳过并删除输入流中的n字节数据。
说明:
File类与FileInputStream类的区别在于流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。
File不属于文件流,只能代表一个文件或是目录的路径名而已。
如果处理文件或者目录名,就应该使用File对象,而不是字符串。
例如,File类的equals方法知道一些文件系统对大小写是敏感的,目录尾的"
/"
字符无关紧要。
常用的文件操作类
(2)
3.FileReader
FileReader是读取字符文件的方便类。
这个类的构造器假定默认字符编码和默认字节缓冲尺寸是正确的。
为了指定这些值,可创建FileInputStream的一个InputStreamReader对象。
FileReader类是InputStreamReader类的子类,所有方法都从父类InputStreamReader中继承而来。
FileReader类和FileInputStream类的区别如下。
FileInputStream是以字节流方式读取,FileReader是把文件转换为字符流读入。
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。
用Reader读取出来的是char数组或者String,使用InputStream读取出来的是byte数组。
Reader类及其子类提供的字符流读取char(16位,unicode编码),inputStream及其子类提供字节流读取byte(8位),所以FileReader类是将文件按字符流的方式读取,FileInputStream则按字节流的方式读取文件。
InputStreamReader可以将读取如stream转换成字符流方式,是reader和stream之间的桥梁。
最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类。
FileInputStream类以二进制输入/输出,I/O速度快且效率高,但是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读。
而FileReader类弥补了这个缺陷,可以以文本格式输入或输出,非常方便。
例如,可以使用while((ch=filereader.read())!
=-1)循环来读取文件;
可以使用BufferedReader的readLine()方法一行一行的读取文本。
InputStreamReader和BufferedReader。
其中最重要的类是InputStreamReader,它是字节转换为字符的桥梁。
编程者可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。
FileReader与InputStreamReader涉及编码转换(指定编码方式或者采用操作系统默认编码)时,可能在不同的平台上出现乱码现象。
而FileInputStream以二进制方式处理,不会出现乱码现象。
4.FileOutputStream
文件输出流是向File或FileDescriptor输出数据的一个输出流。
FileOutputStream(File):
创建一个文件输出流,向指定的File对象输出数据。
FileOutputStream(FileDescriptor):
创建一个文件输出流,向指定的文件描述器输出数据。
FileOutputStream(String):
创建一个文件输出流,向指定名称的文件输出数据。
FileOutputStream(String,boolean):
创建一个向具有指定名称的文件中写入数据的输出文件流。
如果第2个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。
以下情况将则抛出FileNotFoundException异常:
该文件存在,但它是一个目录,而不是一个常规文件;
该文件不存在,但无法创建它;
因为其他某些原因而无法打开。
常见的方法如下所示。
关闭当前文件输出流,并释放与它相关的任一系统资源。
当这个文件输出流不再有引用时,确保调用它的close()方法。
返回与当前流相关的文件描述符。
write(byte[]):
将指定字节数组中b.length字节写入当前文件输出流。
write(byte[],int,int):
将指定字节数组中以偏移量off开始的len个字节写入当前文件输出流。
write(int):
将指定字节写入当前文件输出流。
5.FilterWriter
输出过滤后的字符流的抽象类。
关闭流。
flush():
刷新流。
write(char[],int,int):
将若干字符写入一个数组中。
写入单一字符。
write(String,int,int):
写入一个字符串的某部分。
FilterWriter和FileOutputStream的区别类似于FileReader类和FileInputStream类的区别,都是字节流和字符流的区别。
面试例题30中,关键是需要求职者掌握FileOutputStream类的构造方法,特别是第2个参数的含义,true说明是打开文件,并在末尾的位置添加内容,并没有破坏已经存在文件的内容。
(b)。
面试例题31:
哪个方法能够获得file.txt文件的父路径?
Whichgetsnameoftheparentdirectoryfile"
?
(下面哪个方法能够获得file.txt文件的父路径?
)
(a)Stringname=File.getParentName("
(b)Stringname=(newFile("
)).getParent();
(c)Stringname=(newFile("
)).getParentName();
(d)Stringname=(newFile("
)).getParentFile();
(e)Directorydir=(newFile("
)).getParentDir();
Stringname=dir.getName();
读者可以参考File类的相关方法介绍。
面试例题32:
将"
hello"
字符写入文件file.txt的末尾。
下面哪个选项可以将"
字符写入文件file.txt的末尾?
(a)OutputStreamout=newFileOutputStream("
Out.writeBytes("
(b)OutputStreamos=newFileOutputStream("
true);
DataOutputStreamout=newDataOutputStream(os);
out.writeBytes("
(c)OutputStreamos=newFileOutputStream("
(d)OutputStreamos=newOutputStream("
(a)使用默认的文件写入方式,重新写入文件,即清除已经存在的文件内容,不符合题目要求;
(c)同(a)是一样的;
(d)的OutputStream并没有上述的构造方法。
所以(b)是正确的。
10.3.4
掌握过滤IO类
(1)
面试例题33:
哪个类是FilterOutputStream类构造器的合法参数?
FilterOutputStream类是BufferedOutputStream类、DataOutputStream类和PrintStream类的父类。
(a)InputStream
(b)OutputStream
(c)File
(d)RandomAccessFile
(e)StreamTokenizer
考查求职者对Java的过滤IO相关类的掌握。
★★★
IO过滤器根据程序的需要来调整数据流,这些过滤器介于一个输入数据流和输出数据流之间,并可以对从输入数据流中传送到输出中的字节进行特殊处理,开发者可以结合过滤器来进行一系列过滤操作,如图10.7所示。
图10.7
过滤器示意图
1.FilterInputStream
这个类是所有输入流过滤器类的父类。
这些流位于一个已存在的输入流(基本的输入流)的上层,但是提供了附加功能。
类FilterInputStream简单地覆盖了InputStream的所有方法,使之用于向基本输入流发出各种请求。
FilterInputStream的子类可以进一步覆盖这些方法中的某些方法,也可提供额外的方法和域。
以下所示是常见的方法和构造器。
FilterInputStream(InputStream):
在指定的输入流之上,创建一个输入流过滤器。
返回从当前输入流中可无阻塞读取的字节数。
mark(int):
markSupported():
测试该输
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaIO 详解