java教程9.docx
- 文档编号:3884151
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:12
- 大小:261.48KB
java教程9.docx
《java教程9.docx》由会员分享,可在线阅读,更多相关《java教程9.docx(12页珍藏版)》请在冰豆网上搜索。
java教程9
第九章输入输出
9.1输入输出
流(Stream):
是对输入输出的总称或者叫抽象,可以指任何输入输出设备,如键盘、屏幕、打印机、文件等,数据从一个地方运动到另一个地方就像水的流动一样。
流的分类:
1、从输入输出方面分:
1)输入流:
InputStream、Reader
2)输出流:
OutputStream、Writer
2、按字节分:
1)八位流:
InputStream、OutputStream
2)十六位流:
Reader、Writer
9.2流在功能上的分类
1、节点流(nodestream):
基本的流
直接提供输入输出功能的流是nodestream:
1)用于文件输入输出的流
八位字节流:
FileInputStream、FileOutStream
十六位字节流:
FileReader、FileWriter
2)用于内存数组的流
八位字节流:
ByteArrayInputStream、ByteArrayOutputStream
十六位字节流:
CharArrayReader、CharArrayWriter
3)用于字符串的流
八位字节流:
没有对应的类
十六位字节流:
StringReader、StringWriter
4)管道流
八位字节流:
PipedInputStream、PipedOutputStream
十六位字节流:
PipedReader、PipedWriter
2、处理流(Processingstream)
用于增强节点流的功能,可看作是高级的流。
1)提高输入和输出效率的缓冲流
八位字节流:
BufferedInputStream、BufferedOutStream
十六位字节流:
BufferedReader、BufferedWriter
2)具有过滤功能的流
八位字节流:
FilterInputStream、FilterOutStream
十六位字节流:
FilterReader、FilterWriter
3)对象序列化的流
八位字节流:
ObjectInputStream、ObjectOutStream
十六位字节流:
没有对应的类
4)八位转换十六位的流
八位字节流:
没有对应的类
十六位字节流:
InputStreamReader、OutStreamWriter
5)用于数据转换的流
八位字节流:
DataInputStream、DataOutStream
十六位字节流:
没有对应的类
6)打印流
八位字节流:
PrintStream
十六位字节流:
PrintWriter
除此之外还有计数的流、带有Pushback缓冲的流等。
9.3InputStream类
1、InputSteam类是八位面向字节输入流的父类,他有很多子类。
InputStream方法:
1)三个基本的read()方法
intread()
intread(byte[])
intread(byte[],int,int)
简单读方法返回一个int值,它包含从流里读出的一个字节或者-1,其中后者表明文件结束。
其它两种方法将数据读入到字节数组中,并返回所读的字节数。
第三个方法中的两个int参数指定了所要填入的数组的子范围。
2)其他方法
voidclose():
关闭流。
intavailable():
这个方法报告立刻可以从流中读取的字节数。
skip(long):
这个方法丢弃了流中指定数目的字符。
booleanmarkSupported()
voidmark(int)
voidreset(int)
如果流支持“回放”操作,则这些方法可以用来完成这个操作。
如果mark()和reset()方法可以在特定的流上操作,则markSupported()方法将返回ture。
mark(int)方法用来指明应当标记流的当前点和分配一个足够大的缓冲区,它最少可以容纳参数所指定数量的字符。
在随后的read()操作完成之后,调用reset()方法来返回你标记的输入点。
本节重点介绍其子类FileInputStream。
阅读下面的程序:
建立FileInputStream流对象:
FileInputStreamin=newFileInputStream(“d:
/javacode/source.txt”);
使用FileInputStream类提供的方法read(),他读入一个字节并且返回该字节,其返回值为int型,若到了文件尾,他返回-1
2、注意事项
1)有关输入输出的方法几乎都要捕获异常
2)while的循环条件使用语句b=in.read()判断,因为赋值语句也有返回值
3)由于读入的数据类型是int,所以应该把他们转换为char
4)close方法用于关闭流以释放资源
3、编写输入输出程序的一般过程
1)选择一种适当的流
2)选择一种读或写的方法
3)关闭流
9.4OutputStream类
1、OutputSteam类是八位面向字节输出流的父类,他有很多子类。
类似于InputStream,可以向目的地写入数据。
OutputStream方法:
1)个基本的write()方法
intwrite()
intwrite(byte[])
intwrite(byte[],int,int)
2)其他方法
voidclose()
voidflush():
有时一个输出流在积累了若干次之后才进行真正的写操作。
flush()方法允许你强制执行写操作。
下面的程序利用OutputStream向文件destnation.txt中写入0123456789共10个字符:
注意:
1)48+i的目的是把数字i变成byte类型。
2)DataOutputStreamout=newDataOutputStream
(newFileOutputStream("d:
\\javacode\\destnation.txt"));
2、DataInputStream和DataOutputStream
这些过滤器通过流来读写Java基本类。
例如:
DataInputStream方法
bytereadByte()
longreadLong()
doublereadDouble()
DataOutputStream方法
voidwriteByte(byte)
voidwriteLong(long)
voidwriteDouble(double)
这些流都有读写字符串的方法,如readLine、readChar,但不应当使用这些方法。
3、处理流的应用
处理流提供了更加强大的输入输出功能,提供了比节点流更多的输入输出方法。
因此一般情况下,尽量使用处理流。
如:
DataInputSteam可以读入各种基本类型数据类型的功能。
1)使用处理流时,要用一个节点流作为其构造方法的参数
DataInputStreamin=newDataInputStream
(newFileInputStream("d:
\\javacode\\scource.txt"));
2)使用DataInputStream类提供的方法读文件
9.5Reader和Writer类
Reader和Writer是面向字符输入,他们以字符(十六位)为单位读写,因此效率较InputStream和OutputStream类高,因此尽可能使用Reader和Writer。
他们有自己的子类,如:
1、Unicode
Java技术使用Unicode来表示字符串和字符,而且它提供了16位版本的流,以便用类似的方法来处理字符。
这些16位版本的流称为读者和作者。
和其他流一样,它们都在java.io包中。
读者和作者中最重要的版本是InputStreamReader和OutputStreamWriter。
这些类用来作为字节流与读者和作者之间的接口。
当你构造一个InputStreamReader或OutputStreamWriter时,转换规则定义了16位Unicode和其它平台的特定表示之间的转换。
2、字节和字符转换
缺省情况下,如果你构造了一个连接到流的读者和作者,那么转换规则会在使用缺省平台所定义的字节编码和Unicode之间切换。
在英语国家中,所使用的字节编码是:
ISO8859-1。
你可以使用所支持的另一种编码形式来指定其它的字节编码。
在native2ascii工具中,你可以找到一个关于所支持的编码形式的列表。
使用转换模式,Java技术能够获得本地平台字符集的全部灵活性,同时由于内部使用Unicode,所以还能保持平台独立性。
3、缓冲读者和作者
因为在各种格式之间进行转换和其它I/O操作很类似,所以在处理大块数据时效率最高。
在InputStreamReader和OutputStreamWriter的结尾链接一个BufferedReader和BufferedWriter是一个好主意。
记住对BufferedWriter使用flush()方法。
4、读入字符串输入
下面这个例子说明了从控制台标准输入读取字符串所应当使用的一个技术。
importjava.io.*;
publicclassCharInput
{
publicstaticvoidmain(Stringargs[])throwsjava.io.IOException
{
Strings;
InputStreamReaderir;
BufferedReaderin;
ir=newInputStreamReader(System.in);
in=newBufferedReader(ir);
while((s=in.readLine())!
=null)
{
System.out.println("Read:
"+s);
}
}
}
5、使用其它字符转换
如果你需要从一个非本地(例如,从连接到一个不同类型的机器的网络连接读取)的字符编码读取输入,你可以象下面这个程序那样,使用显式的字符编码构造
ir=newInputStreamReader(System.in,“8859_1”);
6、阅读程序:
1)importjava.io.*;
publicclassReader1
{
publicstaticvoidmain(String[]args)
{
Strings=newString();
intb;
try
{
FileReaderin=newFileReader("d:
\\javacodes\\c09\\source.txt");
while((b=in.read())!
=-1)
{
System.out.print((char)b);
}
in.close();
}
catch(Exceptione){}
}
}
使用处理流BufferedReader和PrintWriter:
2)复制文件
使用FileReader和FileWriter
javaTestNodeStreamsfile1file2
使用BufferedReader和BufferedWriter
javaTestBufferedStreamsfile1file2
7、I/O流的链接
9.6System类提供的输入输出功能
System在java.lang软件包中,他是final类,不能创建其对象。
在该类中有几个与输入输出有关的域:
in、out、err(标准错误输出)
System.out.println(…)是输出到屏幕,System.in.read()则是从键盘输入。
下面的程序用输入流从键盘读入一行数据,然后再把他们输出到屏幕上,并且统计读入的数据个数:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 教程