《JAVA语言程序设计教程》课件第8章_第1页
《JAVA语言程序设计教程》课件第8章_第2页
《JAVA语言程序设计教程》课件第8章_第3页
《JAVA语言程序设计教程》课件第8章_第4页
《JAVA语言程序设计教程》课件第8章_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章File类与输入输出流8.1File类8.2输入输出流概述8.3字节流类8.4字符流类8.1File类

无论学习那种语言,都不免要接触到文件系统,要经常和文件打交道,Java当然也不例外。在介绍JavaIO之前首先介绍一个非常重要的类File。在Java整个io包中,File类是唯一表示与文件本身有关的类。使用File类可以进行创建或删除文件等常规操作。File类的常用构造方法如下:

File(Stringparent,Stringchild)

File(Fileparent,Stringchild)

File(URIuri)

File(Stringpathname)

其中前面两种方法可以在某个已知特定的目录下新建文件或者目录,后面两种可以通过pathname或者URI新建文件或者目录。将File类中的主要方法按如下方式分类:

(1)文件名的处理:

StringgetName():得到一个文件的名称(不包括路径)。

StringgetParent():得到一个文件的上一级目录名。

StringgetPath():得到一个文件的路径名。

StringgetAbsolutePath():得到一个文件的绝对路径名。

StringrenameTo(FilenewName):将当前文件名更名为给定文件的完整路径。

(2)文件属性测试:

booleanisAbsolute():测试此抽象路径名是否为绝对路径名。

booleancanRead():测试当前文件是否可读。

booleancanWrite():测试当前文件是否可写。

booleanexists():测试当前File对象所指示的文件是否存在。

booleanisFile():测试当前文件是否是文件(不是目录)。

booleanisDirectory();测试当前文件是否是目录。

booleanisHidden():测试当前文件是否是一个隐藏文件。

(3)普通文件信息和工具:

longlastModified():得到文件最近一次修改的时间。

longlength():得到文件的长度,以字节为单位。

booleandelete():删除当前文件。

(4)目录操作:

booleanmkdir():根据当前对象生成一个由该对象指定的路径。

String[]list():返回一个字符串数组,列出当前目录中的文件和目录。本示例程序首先检查“d:/test”文件夹是否存在文件a.txt,若不存在则创建一个新文件。然后,将该文件夹下的所有文件和目录遍历以后,分类打印出来。程序运行结果如图8.1所示。图8.1例8-1运行结果8.2输入输出流概述

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件、内存、或网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。输入和输出流可形象地描述为如图8.2和图8.3所示的形状。图8.2输入流图示图8.3输出流图示

Java中的输入输出流可以按如下方式进行划分。典型的输入输出流由四个抽象类来表示:InputStream、OutputStream、Reader、Writer。Java中其他多种多样变化的流均是从它们派生出来的。

(1)按数据流动方向分:

输入流:只能从中读取字节数据,而不能向其写入数据。

输出流:只能向其写入字节数据,而不能从中读取数据。

(2)按照流所处理的数据类型分:

字节流:用于处理字节数据。

字符流:用于处理Unicode字符数据。

(3)按照流所处理的源分:

节点流(低级流):从/向一个特定的IO设备读/写数据的流。

处理流(高级流):对已存在的流进行连接和封装的流。标准输入/输出指在字符方式下(如DOS),程序与系统进行交互的方式,分为三种:

(1)标准输入studin,对象是键盘。

(2)标准输出stdout,对象是屏幕。

(3)标准错误输出stderr,对象也是屏幕。在例8-2中,用“System.in.read(buffer)”从键盘输入一行字符,存储在缓冲区buffer中,count保存实际读入的字节个数,再以整数和字符两种方式输出buffer中的值。Read方法在java.io包中,而且要抛出IOException异常。

程序输出结果如图8.4所示。图8.4例8-2输出流图示8.3字节流类

8.3.1字节输入输出流

字节流是从InputStream和OutputStream派生出来的一系列类,这类流以字节(byte)为基本处理单位。

1. InputStream类

字节输入流类InputStream的主要方法描述如下:

(1) publicabstractintread():返回读取的一个字节;如果到达流的末尾,则返回 -1。

(2) publicintread(byte[]b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。

(3) publicintread(byte[]b,intoff,intlen):将输入流中最多len个数据字节读入byte数组。

(4) publiclongskip(longn):跳过和丢弃此输入流中数据的n个字节。

(5) publicintavailable():可以不受限制地从此输入流读取(或跳过)估计的字节数;如果到达输入流末尾,则返回0。

(6) publicvoidmark(intreadlimit):在此输入流中标记当前的位置,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数。

(7) publicvoidreset():将此流重新定位到最后一次对此输入流调用mark方法时的位置。

(8) publicbooleanmarkSupported():如果此输入流实例会支持mark和reset方法,则返回true;否则返回false。

(9) publicvoidclose():关闭此输入流并释放与该流关联的所有系统资源。

字节输入流类InputStream的类层次如图8.5所示。图8.5InputStream类层次

2. OutputStream类

字节输出流类OutputStream的主要方法描述如下:

(1) publicabstractvoidwrite(intb):将指定的字节写入此输出流,要写入的字节是参数b的八个低位。

(2) publicvoidwrite(byte[]b):将b.length个字节从指定的byte数组写入此输出流。

(3) publicvoidwrite(byte[]b,intoff,intlen):将指定的byte数组中从偏移量off开始的len个字节写入此输出流。

(4) publicvoidflush():刷新此输出流并强制写出所有缓冲的输出字节。

(5) publicvoidclose():关闭此输出流并释放与此流有关的所有系统资源。字节输出流类OutputStream的类层次如图8.6所示。图8.6OutputStream类层次8.3.2文件字节流

1. FileInputStream类

文件字节输入流FileInputStream类按字节读取文件中的数据。在生成FileInputStream类的对象时,若指定文件找不到,则抛出FileNotFoundException异常,该异常必须声明捕获或抛出。该类的所有方法都是从InputStream类继承来的,其构造方法主要有如下两种:

publicFileInputStream(Stringname)throws

FileNotFoundException

publicFileInputStream(Filefile)throwsFileNotFoundException

前者使用给定的文件名name创建对象,后者使用File对象file创建对象。构造方法参数所指定的文件成为输入流的源。

【例8-3】使用FileInputStream类打开并读取文件

Example8_3.Java。

importjava.io.*;

publicclassExample8_3

{

publicstaticvoidmain(Stringargs[])

{

try{

//创建文件输入流对象FileInputStreamin=newFileInputStream("Example8_3.Java");

intn=2;

bytebuffer[]=newbyte[n];

//读取输入流

while(in.read(buffer,0,n)!=-1){

Stringstr=newString(buffer,0,n);

System.out.print(str);

}

System.out.println();

//关闭输入流

in.close();图8.7例8-3运行结果例8-3以文件名Example8_3.Java创建FileInputStream对象,调用InputStream类的read(byte[]buffer,0,n)方法,每次从源程序文件Example8_3.Java中读取n个字节,存储在缓冲区buffer中,再将以buffer中的值构造的字符串str显示在屏幕上。流操作执行完后需要调用close()方法将输入流关闭。程序必须使用一个try-catch块捕获并处理异常。

2. FileOutputStream类

文件字节输出流FileOutputStream类按字节将数据写入到文件中。在生成FileOutputStream类的对象时,若指定文件不存在,则创建一个新文件;若指定文件存在,但它是一个目录,则会产生FileNotFoundException异常。在进行文件读写操作时会产生IOException异常,该异常必须声明捕获或抛出。FileOutputStream类的构造方法主要有如下几种:

publicFileOutputStream(Stringname)throws

FileNotFoundException

publicFileOutputStream(Filefile)throwsFileNotFoundException

前者使用给定的文件名name创建对象,后者使用File对象file创建对象。构造方法参数所指定的文件成为输出流的目的地。

publicFileOutputStream(Stringname,Booleanappend)throwsFileNotFoundException

publicFileOutputStream(Filefile,Booleanappend)throwsFileNotFoundException

当用构造方法创建指向一个文件的输出流时,如果参数append取值true,若文件已存在,输出流不会刷新所指向的文件,顺序地向该文件输入数据。例8-4首先采用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,再以FileOutputStream类的write(buffer)方法,将buffer中内容写入文件write.txt中。流操作执行完后需要调用close()方法将输出流关闭,执行结果如图8.8所示。图8.8例8-4运行结果8.3.3管道流

管道用来把一个程序、线程和代码块的输出连接到另一个程序、线程和代码块的输入。java.io中提供了类PipedInputStream和PipedOutputStream作为管道的输入和输出流。管道输入流作为一个通信管道的接收端,管道输出流则作为发送端。管道流必须是输入输出并用,即在使用管道前,两者必须进行连接。管道输入/输出流可以用两种方式进行连接。

(1)在构造方法中进行连接:

PipedInputStream(PipedOutputStreampos);

PipedOutputStream(PipedInputStreampis);

(2)通过各自的connect()方法连接:

在类PipedInputStream中,

connect(PipedOutputStreampos);

在类PipedOutputStream中,

connect(PipedInputStreampis);例8-5中首先连接输入管道in与输出管道out,Send线程向输出管道out发送数据,Receive线程从输入管道in中接收数据。程序运行结果如图8.9所示。图8.9例8-5输出流图示8.3.4数据流

数据输入流DataInputStream和数据输出流DataOutputStream在提供了字节流的读写手段的同时,以统一的通用形式向输入流写入boolean、int、long、double等基本数据类型,并可以再次把基本数据类型的值读取回来。

DataInputStream类的构造方法描述为:

publicDataInputStream(InputStreamin)

DataOutputStream类的构造方法描述为:

publicDataOutputStream(OutputStreamout)例8-6中使用DataInputStream类逐一将Student对象的相关参数存入student.txt文件中,随后使用DataOutputStream类将student.txt文件中的数据逐一读出。程序运行结果如图8.10所示。图8.10例8-6输出流图示8.4字符流类

字节流不能操作Unicode字符,由于Java采用16位的Unicode字符,即一个字符占16位,所以要使用字符流,以提供直接的字符输入输出支持。在Unicode字符中,一个汉字被看成一个字符,占用2个字节,若使用字节流,读取不当会出现乱码,若采用字符流,则不会出现类似情形。8.4.1字符流类层次

字符流是从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。

1. Reader类

字符输入流类Reader的主要方法描述如下:

(1) publicintread(CharBuffertarget):试图将字符读入指定的字符缓冲区。

(2) publicintread():读取单个字符。

(3) publicintread(char[]cbuf):将字符读入数组。

(4) publicabstractintread(char[]cbuf,intoff,intlen):将字符读入数组的某一部分。

(5) publiclongskip(longn):跳过n个字符。

(6) publicbooleanready():判断是否准备读取此流。

(7) publicbooleanmarkSupported():判断此流是否支持mark()操作。

(8) publicvoidmark(intreadAheadLimit):标记流中的当前位置。

(9) publicvoidreset():重置该流。

(10) publicabstractvoidclose():关闭该流并释放与之关联的所有资源。

字符输入流类Reader的类层次如图8.11所示。图8.11Reader类层次

2. Writer类

字符输出流类Writer的主要方法描述如下:

(1) publicvoidwrite(intc):写入单个字符。

(2) publicvoidwrite(char[]cbuf):写入字符数组。

(3) publicabstractvoidwrite(char[]cbuf,intoff,intlen):写入字符数组的某一部分。

(4) publicvoidwrite(Stringstr):写入字符串。

(5) publicvoidwrite(Stringstr,intoff,intlen):写入字符串的某一部分。

(6) publicWriterappend(CharSequencecsq):将指定字符序列添加到此writer。

(7) publicWriterappend(CharSequencecsq,intstart,intend):将指定字符序列的子序列添加到此writer。

(8) publicWriterappend(charc):将指定字符添加到此writer。

(9) publicabstractvoidflush():刷新该流的缓冲。

(10) publicabstractvoidclose():关闭此流,但要先刷新它。字符输出流类Writer的类层次如图8.12所示。图8.12Writer类层次8.4.2文件字符流

1. FileReader类

文件字符输入流FileReader类按字符读取文件中的数据。在生成FileReader类的对象时,若指定文件找不到,则抛出FileNotFoundException异常,该异常必须声明捕获或抛出。该类的所有方法都通过继承得来,其构造方法主要有如下两种:

publicFileReader(Stringname)throwsFileNotFoundException

publicFileReader(Filefile)throwsFileNotFoundExce

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论