JAVA语言与编程第8章Java输入输出系统.ppt
《JAVA语言与编程第8章Java输入输出系统.ppt》由会员分享,可在线阅读,更多相关《JAVA语言与编程第8章Java输入输出系统.ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java实用教程(第3版)第第8章章 Java 输入输出系统输入输出系统T8.1 字节流字节流T8.2 过滤流过滤流T8.3 字符流字符流T8.6 对象序列化对象序列化T8.7 File类类T8.8 综合实例综合实例T8.4 标准标准I/OT8.5 随机访问文件类随机访问文件类Java实用教程(第3版)8.1 字节流字节流在java.io包中,java.io.InputStream表示字节输入流,它是抽象类,不能实例化。InputStream类的作用是用来表示那些从不同数据源产生输入的类。这些数据源有:字节数组、String对象、文件、管道及其他数据源。每一种数据源都有相应的InputStre
2、am子类。输入流的类层次结构如图8.1所示。图图8.1 输输入流的入流的类层类层次次结结构构Java实用教程(第3版)8.1 字节流字节流InputStream中的读取数据的方法如下:labstractintread()throwsIOException功能:读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。lintread(byteb)throwsIOException功能:从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中,并以整数形式返回实际读取的字节数,如果返回-1,表示读到了输入流的末尾。lintread(byteb,intoff,intlen)thro
3、wsIOException:功能:将数据读入一个字节数组,同时返回实际读取字节数,如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置,len指定读取的最大字节数。如果返回-1,表示读到了输入流的末尾。llongskip(longn)throwsIOException:功能:跳过和放弃此输入流中的n个字节,返回跳过的实际字节数。如果n为负,则不跳过任何字节。默认实现是此类的skip方法创建一个byte数组,然后重复将字节读入其中,直到读够n个字节或已到达流末尾为止。Java实用教程(第3版)8.1 字节流字节流lintavailable()throwsIOExcep
4、tion:功能:返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。lvoidclose():功能:关闭输入流,释放和这个流相关的系统资源。java.io.OutputStream表示字节输出流,它也是抽象类,不能被实例化。字节输出流的种类和字节输入流是大致对应的。输出流的类层次结构如图8.2所示。图图8.2 输输出流的出流的类层类层次次结结构构Java实用教程(第3版)8.1 字节流字节流OutputStream中的写入数据的方法如下:labstractvoidwrite(intb)throwsIOException:将b的最低的一个字节写入此输出流,b的高位字节(
5、3个)丢弃。lvoidwrite(byteb)throwsIOException:将b.length个字节从指定的byte数组写入此输出流。lvoidwrite(byteb,intoff,intlen)throwsIOException:将指定byte数组中从偏移量off开始的len个字节写入此输出流。lvoidflush()throwsIOException:刷新此输出流并强制写出所有缓冲的输出字节。lvoidclose()throwsIOException:关闭此输出流并释放与此流有关的所有系统资源。Java实用教程(第3版)8.1.1 字节数组输入流字节数组输入流ByteArrayInp
6、utStream类从内存中的字节数组中读取数据,因此它的数据源是一个字节数组。ByteArrayInputStream类本身采用了适配器设计模式,它把字节数组转换为输入流类型,使得程序能够对字节数组进行读操作。【例例8.1】使用字节数组输入流读取数组中的字节。Java实用教程(第3版)8.1.2 字节数组输出流字节数组输出流ByteArrayOutputStream类的构造方法如下:ByteArrayOutputStream():创建一个新的字节数组输出流。缓冲区的容量最初是32字节,如有必要可增加其大小。ByteArrayOutputStream(intsize):创建一个新的byte数组输
7、出流,它具有指定大小的缓冲区容量(以字节为单位)。Java实用教程(第3版)8.1.2 字节数组输出流字节数组输出流【例例8.2】把字符串转换为字节数组再写入到字节数据输出流中。ByteArrayOutputStreamDemo.javapackageorg.iostream;importjava.io.*;classByteArrayOutputStreamDemopublicstaticvoidmain(Stringargs)throwsIOExceptionByteArrayOutputStreambaos=newByteArrayOutputStream();Strings=welco
8、metouseByteArrayOutputStream.;bytebuf=s.getBytes();baos.write(buf);/将指定byte数组中的字节写入此byte数组输出流System.out.println(baos.toString();/通过解码字节将缓冲区内容转换为字符串输出/创建一个新分配的byte数组,并将缓冲流中的内容复制到该数组中byteb=baos.toByteArray();for(inti=0;ib.length;i+)System.out.print(char)bi);程序运行结果:welcometouseByteArrayOutputStream.wel
9、cometouseByteArrayOutputStream.Java实用教程(第3版)8.1.3 文件输入流文件输入流FileInputStream类用于从文件读取数据,主要用于二进制文件的读(如:读取图像数据之类的原始字节流,要读取文本文件,可考虑使用FileReader),它的构造方法如下:lFileInputStream(Filefile)throwsFileNotFoundException:功能:通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象指定。lFileInputStream(Stringname)throwsFileN
10、otFoundException:功能:通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。【例例8.3】使用文件输入流把文本文件t1.txt中的三角形图案输出到屏幕上。Java实用教程(第3版)8.1.4 文件输出流文件输出流FileOutputStream类用于向文件写数据,主要用于二进制文件的写(如:用于写入图像数据之类的原始字节流,要写入文本文件,可考虑使用FileWriter),它的构造方法如下:lFileOutputStream(Stringname)throwsFileNotFoundException功能:创建一个向具
11、有指定名称的文件中写入数据的输出文件流,若文件已存在,则文件中的内容被清除。lFileOutputStream(Stringname,booleanappend)throwsFileNotFoundException功能:创建一个向具有指定name的文件中写入数据的输出文件流。如果第二个参数为true,则以添加方式写入字节,文件中的原有内容不会被清除。lFileOutputStream(Filefile)throwsFileNotFoundException功能:创建一个向指定File对象表示的文件中写入数据的文件输出流。lFileOutputStream(Filefile,booleanap
12、pend)throwsFileNotFoundException功能:创建一个向指定File对象表示的文件中写入数据的文件输出流。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。【例例8.4】使用文件输出流将100200之间能被3整除的数写入到文本文件中,要求每10个数一行。Java实用教程(第3版)8.1.5 管道流管道流一个PipedInputStream对象必须和一个PipedOutputStream对象进行连接从而产生一个通信管道。PipedOutputStream可以向管道中写入数据,通常一个线程向管道输出流写入数据,另一个线程从管道输入流中读取数据,Pipe
13、dInputStream可以从管道中读取PipedOutputStream写入的数据。这两个类主要用来完成线程之间的通信。当线程A执行管道输入流的read()方法时,如果暂时还没有数据,这个线程就会被阻塞,只有当线程B向管道输出流写了新的数据后,线程A才会恢复运行。有关线程的详细内容请参考第11章。【例例8.5】用管道输出流向管道中写入字节,再用管道输入流读取管道中的字节。Java实用教程(第3版)8.2 过滤流过滤流8.2.1 缓冲流类缓冲流类对于BufferedlnputStream,当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区。在使用BufferedOutputStre
14、am进行输出时,数据首先写入缓冲区,当缓冲区满时,其中的数据写入所串接的输出流。用该类所提供的方法flush()可以强制将缓冲区的内容全部写入输出流。BufferedlnputStream类的构造方法如下:lBufferedInputStream(InputStreamin)功能:创建一个BufferedInputStream并保存其参数,创建一个内部缓冲区数组并将其存储在buf中。lBufferedInputStream(InputStreamin,intsize):功能:创建具有指定缓冲区大小的BufferedInputStream并保存其参数,创建一个长度为size的内部缓冲区数组并将其
15、存储在buf中。BufferedOutputStream类的构造方法如下:lBufferedOutputStream(OutputStreamout):功能:创建一个新的缓冲输出流,以将数据写入指定的底层输出流。lBufferedOutputStream(OutputStreamout,intsize):功能:创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。【例例8.6】设计一个Java程序,将数p之内的所有质数写入文本文件中,要求s个数一行。Java实用教程(第3版)8.2.1 缓冲流类缓冲流类右击“TestPrime.java”,选择“RunAs”“RunConf
16、igurations”,如图8.3所示,选择Main标签页,在“Project”栏中选择“MyProject_08”,在“Mainclass”栏中选择“TestPrime”,选择“Arguments”标签页,在“Programargumentds”栏中输入“10010”,然后单击“Run”按钮,运行程序。100之内的所有质数将被写入到文本文件中t3.txt中。再通过输入流将刚才写入的质数打印到控制台上。文本文件t3.txt中的内容如下:2357111317192329313741434753596167717379838997图图8.3 打印打印100之内的所有之内的所有质质数数Java实用教
17、程(第3版)8.2.2 数据流类数据流类DataInputStream和DataOutputStream提供了读/写各种基本数据类型以及String对象的方法。DataInputStream类的所有读方法都以“read”开头,例如下面的方法:lreadByte():从输入流中读取1个字节,把它转换为byte类型的数据。lreadFloat():从输入流中读取4个字节,把它转换为float类型的数据。lreadLong():从输入流中读取8个字节,把它转换为long类型的数据。lreadUTF():从输入流中读取若干个字节,把它转换为采用UTF-8字符编码的字符串。DataOutputStrea
18、m类的所有方法都以“write”开头,例如下面的方法:lwriteByte():向输出流中写入byte类型的数据。lwriteLong():向输出流中写入long类型的数据。lwriteFloat():向输出流中写入float类型的数据。lwriteUTF():向输出流中写入按UTF编码的数据。【例例8.7】用DataInputStream读取DataOutputStream写入的数据,保证正确读取格式化数据。Java实用教程(第3版)8.2.2 数据流类数据流类该程序的数据流向如图8.4所示。图图8.4 数据流数据流Java实用教程(第3版)8.2.3 PrintStream类类PrintS
19、tream为其他输出流添加了功能,使它们能够方便地显示各种数据值表示形式。PrintStream支持自动刷新功能,这意味着可在写入byte数组之后自动调用flush()方法,可调用其中一个println()方法,或写入一个换行符或字节(n)。PrintStream显示的所有字符都是使用平台的默认字符编码转换为字节。PinttStream的写数据方法都以“print”开头,例如下面的方法:lprint(inti):向输出流写入一个int类型的数据,按照平台默认的字节编码,将String.valueOf(inti)并全部写入这些字节。lprint(Strings):向输出流写入一个String类型
20、的数据,采用本地操作系统的默认字符编码。lprintln(inti):向输出流写入一个int类型的数据和换行符。lprinlnt(Strings):向输出流写入一个String类型的数据,采用本地操作系统的默认字符编码和换行符。【例例8.8】把PrintStream流串接到FileOutputStream流,向t5.txt文件中写入杨辉三角形,要求写入10行。Java实用教程(第3版)8.3 字符流字符流在读写文本文件时,最主要的问题是进行字符编码的转换。在文本文件中,字符有可能采用各种类型的编码,如GBK和UTF-8字符编码等。String类的getBytes(Stringencode)方法
21、返回字符串的特定类型的编码,encode参数指定编码类型。String类的不带参数的getBytes()方法则使用本地操作系统的默认字符编码。在Java程序中,以下两种方式都能获得本地平台的字符编码类型。lSystem.getProperty(“file.encoding”);/在中文操作系统中显示GBKlCharsetcs=Charset.defaultCharset();System.out.println(cs);/在中文操作系统中显示GBK如果操作系统为中文Windows操作系统,以上代码一般会显示“GBK”,在中文Linux平台上,通常会显示“UTF-8”。Charset类位于jav
22、a.nio.charset包中。Reader类能够将输出流中采用其他编码类型的字节流转换为Unicode字符,然后在内存中为这些Unicode字符分配内存。Writer类能够把内存中的Unicode字符转换为其他编码类型的字节流,再写到输出流中。在默认的情况下,Reader和Writer会在本地平台的字符编码和Unicode字符编码之间进行编码转换。Java实用教程(第3版)8.3.1 转换流类转换流类字符流是建立在字节流基础之上的,Java内部可将字节流与字符流互相转换。InputStreamReader可以将一个字节流中的若干字节解码成字符,OutputStreamWrite将写入的字符编
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 语言 编程 输入输出 系统
限制150内