购买

¥ 30.0

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 java教程-第8章-文件、流和输入输出技术

java教程-第8章-文件、流和输入输出技术.ppt

java教程-第8章-文件、流和输入输出技术

烟雨梦兮
2018-10-14 0人阅读 举报 0 0 暂无简介

简介:本文档为《java教程-第8章-文件、流和输入输出技术ppt》,可适用于IT/计算机领域

第章文件、流和输入输出技术主要内容IO流概述什么是流IO流类IO流的层次:字符流、字节流、标准输入输出流过滤流与流的串接文件流类与文件操作对象串行化作业IO流概述 输入输出处理是程序设计中非常重要的一部分比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。Java把这些不同类型的输入、输出源抽象为流(stream)用统一接口来表示从而使程序简单明了。在java中跟IO操作相关的类放在javaio包中其中包括一系列的类来实现输入输出处理。进行IO操作时可能会产生IO例外属于非运行时例外应该在程序中处理。如:FileNotFoundException,EOFException,IOException在java语言中所完成的输入和输出操作都是以”流”的形式来实现。数据流:实际上是一个数据序列即数据备有次序地组织在一起。如下图所示:程序以流的形式从数据源中顺序读出数据同样数据以数据流的形式被程序顺序写入目的端。�������������input����������Java��������������������������output����������Java���������������IO的类型:通常Java程序的输入输出操作主要针对三种不同的类型:控制台:屏幕的输出(在windows系统下制的是DOS窗口)和键盘输入。文件:针对磁盘文件的读写操作网络:通过网络套接字所实现的数据访问IO流类Java有各种各样的执行IO的流在javaio包中定义了这些流其层次结构图如图所示。编写程序时javaio包必须被执行输入输出的程序导入。输入输出流可以从以下几个方面进行分类:从流的方向划分:输入流和输出流从流的内容划分:面向字符的流和面向字节的流。从流的分工划分:节点流和处理流图�javaio�BufferedReader�LineNumberReader�FileReader�Reader�Writer�javalang�Object��CharArrayReader�InputStreamReader�FilterReader�PipedReader�StringReader�BufferedWriter�CharArrayWriter�OutputStreamWriter�FilterWriter�PipedWriter�PrintWriter�StringWri们通过接点流只能往文件中读写字节或字符。在实际应用中需要向文件中读写各种类型的数据我们就必须将共他类型的数据转换成字节数组后写入文件或是将从文件中读取到的字节数组转换成其他类型这给我们的程序带来了一些困难和麻烦。过滤流:Java给我们提供了一种中间类它提供了读写各种数据类型的各种方法通常给已经存在的流增强一些功能在向文件中写数据时这种中间类的方法内部将程序其他数据类型转换成字节数组然后调用底层的节点流将这个字节数组写入目标设备。在从文件中读数据时调用底层节点流从数据源设备接收字节数组并将字节数组转换成指定数据类型读入到程序中。我们将这个中间类叫做过滤流类这种对数据的转换类似于商品的包装因此也有人称它为包装类。基于上述流的概念通过java程序实现输入输出操作必须遵循下列流程(这里将输入操作定义为”读”读操作针对的输入流将输出操作定义为”写”写针对的是输出流)读写流的一般流程读(Reading)openastream打开读出流whilemoreinformation判断readinformation读closethestream关闭流写(Writing)openastream打开写入流whilemoreinformation判断writeinformation写closethestream关闭流该流程适用于上述所提到的文件和网络输入输出字节流的读写操作(来自JDK),字节流类是从抽象类InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。基本类介绍基本字节输入流-InputStream基本字节输出流-OutputStream基本字节流类介绍基本输入流-InputStream是一个抽象类定义了字节输入流类的共同特性。该类中的方法首部一般都有throwsIOException短语。因此在调用这些方法的时候应该捕获或继续抛出异常。常用方法如下:publicabstractintread()从输入流读取下一个数据字节。返回到范围内的int字节值。如果因已到达流末尾而没有可用的字节则返回值。在输入数据可用、检测到流的末尾或者抛出异常前此方法一直阻塞。publicintread(byte b)throwsIOException从输入流中读取一定数量的字节并将其存储在缓冲区数组b中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前此方法一直阻塞。intread(byteb,intoff,intlen)将输入流中最多len个数据字节读入字节数组。尝试读取多达len字节但可能读取较少数量。以整数形式返回实际读取的字节数。在输入数据可用、检测到流的末尾或者抛出异常前此方法一直阻塞。longskip(longn)跳过和放弃此输入流中的n个数据字节并返回时机跳过的字节数。voidclose()关闭此输入流并释放与该流关联的所有系统资源。、基本输入流-InputStream基本输入流-InputStream是一个抽象类定义了字节输入流类的共同特性。该类中的方法首部一般都有throwsIOException短语。因此在调用这些方法的时候应该捕获或继续抛出异常。常用方法如下:publicabstractintread()从输入流读取下一个数据字节。返回到范围内的int字节值。如果因已到达流末尾而没有可用的字节则返回值。在输入数据可用、检测到流的末尾或者抛出异常前此方法一直阻塞。publicintread(byte b)throwsIOException从输入流中读取一定数量的字节并将其存储在缓冲区数组b中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前此方法一直阻塞。intread(byteb,intoff,intlen)将输入流中最多len个数据字节读入字节数组。尝试读取多达len字节但可能读取较少数量。以整数形式返回实际读取的字节数。在输入数据可用、检测到流的末尾或者抛出异常前此方法一直阻塞。longskip(longn)跳过和放弃此输入流中的n个数据字节并返回时机跳过的字节数。voidclose()关闭此输入流并释放与该流关联的所有系统资源。InputStream的其它方法其它方法:一般在它的子类中改写intavailable()返回可以不受阻塞地从此输入流读取的字节数。voidmark(intreadlimit)在此输入流中标记当前的位置。voidreset()将此流重新定位到对此输入流最后调用mark方法时的位置。booleanmarkSupported()测试此输入流是否支持mark和reset方法。InputStream类层次、基本字节输出流-OutputStreamOutputStream是所有字节输入流的父类常用的方法voidwrite(intb)将指定的字节写入此输出流。voidwrite(byteb)将blength个字节从指定的字节数组写入此输出流。voidwrite(byteb,intoff,intlen)将指定字节数组中从偏移量off开始的len个字节写入此输出流。voidclose()关闭此输出流并释放与此流有关的所有系统资源。其它方法voidflush()刷新此输出流并强制写出所有缓冲的输出字节。一般缓冲区中的数据是当缓冲区中的数据满了后一次写入或者读出利用该方法将需要及时写入或独处的数据进行处理字符流字符流的读写操作Reader和Writer是javaio包中所有字符流的抽象基类。提供了输出字符的API及其部分实现。ReaderReader类是处理所有字符流输入类的父类。主要有以下方法:读取字符  publicintread()throwsIOException*读取一个字符返回值为读取的字符*  publicintread(charcbuf)throwsIOException*读取一系列字符到数组cbuf中返回值为实际读取的字符的数量*  publicabstractintread(charcbuf,intoff,intlen)throwsIOException  *读取len个字符从数组cbuf的下标off处开始存放返回值为实际读取的字符数量该方法必须由子类实现*标记流 publicbooleanmarkSupported()*判断当前流是否支持做标记*  publicvoidmark(intreadAheadLimit)throwsIOException  *给当前流作标记最多支持readAheadLimit个字符的回溯。* publicvoidreset()throwsIOException*将当前流重置到做标记处*关闭流  publicabstractvoidclose()throwsIOExceptionReader类层次Writer向输出流写入字符publicvoidwrite(intc)throwsIOException  将整型值c的低位写入输出流publicvoidwrite(charcbuf)throwsIOException 将字符数组cbuf写入输出流publicabstractvoidwrite(charcbuf,intoff,intlen)throwsIOException  *将字符数组cbuf中的从索引为off的位置处开始的len个字符写入输出流*publicvoidwrite(Stringstr)throwsIOException将字符串str中的字符写入输出流publicvoidwrite(Stringstr,intoff,intlen)throwsIOException*将字符串str中从索引off开始处的len个字符写入输出流*flush()  刷空输出流并输出所有被缓存的字节。关闭流  publicabstractvoidclose()throwsIOExceptionWriter类层次IO流的分类(个功能类)IO类型所用到的类(字节字符)描述文件FileReaderFileWriterFileInputStreamFileOutputStream节点流用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时文件已经存在则覆盖这个文件。缓冲BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream过滤流,为提高读写效率而提供缓冲数据区需要使用已经存在的节点流来构造提供带缓冲的读写打印PrintWriterPrintStream(Systemoutprintln())提供打印功能即printer()和println()方法内存CharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStreamStringReaderStringWriterStringBufferInputStream内存中字节字符数组的读写操作IO流的分类(个功能类)IO类型所用到的类(字节字符)描述字节流和字符流的转换InputStreamReaderOutputStreamWriter将InputStream中读入的字节转为字符将字符转为字节写入OutputStream管道pipePipedReaderPipedWriterPipedInputStreamPipedOutputStream管道流用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用必须同时构造管道输入流和管道输出流。连接ConcatenationSequenceInputStream多个输入流连接为一个输入流对象串行化ObjectInputStreamObjectOutputStreamObjectSerializationIO流的分类(个功能类)IO类型所用到的类(字节字符)描述基本数据转化DataInputStreamDataOutputStream过滤流需要使用已经存在的节点流来构造提供了读写Java中的基本数据类型的功能。计数LineNumberReaderLineNumberInputStream读操作时记录行数PeekingAheadPushbackReaderPushbackInputStream可回退缓存(pushbackbuffer)过滤FilterReaderFilterWriterFilterInputStreamFilterOutputStream在读写操作时对数据进行过滤IO流的分类(字节流类)数据源节点流文件FileInputStreamFileOutputStreamFileReaderFileWriter内存CharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStreamStringReaderStringWriterStringBufferInputStream管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriterIO流的分类(处理流类)处理类型处理流缓冲BufferedInputStreamBufferedOutputStream过滤FilterInputStreamFilterOutputStreamFilterReaderFilterWriter字节流与字符流转换InputStreamReaderOutputStreamWriter基本数据类型DataInputStreamDataOutputStream打印PrintStreamPrintWriter回退PushbackReaderPushbackInputStream记录行数LineNumberInputStreamLineNumberReader标准输入输出Java程序所进行的标准输入输出操作指的是向控制台屏幕打印和读取键盘读入这些操作完成都是通过javalangsystem类所定义的三个流变量(in,out,err)来实现的。在Java应用程序开始执行时(也就是当main方法被执行时)Java就会自动创建个与设备关联的流对象:Systemin、Systemout和Systemerr。Systemin对象(标准输入流对象)是InputStream类型的是连接程序与标准输入设备(通常是键盘)的一个输入流对象当执行Systeminread()操作时从键盘得到的信息通过Systemin流到了程序中。Systemout对象(标准输出流对象)是PrintStream类型的是连接程序和标准输出设备(通常是显示器)的一个输出流对象当执行Systemoutprintln()语句时信息流从程序通过Systemout流到了屏幕上。importjavalang*classHelloJava{publicstaticvoidmain(Stringargs){Systemoutprintln("HelloJava")}}示例HelloJavajava字节流的标准输出程序运行的结果是向标准的控制台打印"HelloJava"字符串引用了systemout变量并使用了PrintSream类的方法println()方法printStream类是属于字节流的输出类他在进行输出时是将需要打印的字符按当前系统的默认字符编码格式转变为字节在进行打印的。因此当需要打印字符时推荐使用printWriter类printWriter类是基于字符的输出类。importjavaioPrintWriterclassHelloWorld{publicstaticvoidmain(Stringargs){PrintWriterpw=newPrintWriter(Systemout,true)boolean的值控制是否自动换行刷新。pwprintln("HelloWorld!")pwprintln("你好!")}}示例PrintWriterjava字符流的标准输出以下程序是自标准输入(键盘)读取所敲入的若干个字节。importjavaioIOExceptionclassInputTest{publicstaticvoidmain(Stringargs)throwsIOException{byteb=newbyteSystemoutprintln("Receivednumber="Systeminread(b))systemin变量的read()方法抛出IOExecption异常并在第三行作了处理}}程序执行结果:D:javaInputTestabReceivednumber=,包含有”回车”和”换行”两个字符所以当输入的字符的个数大于数组的长度时字符数是对的小于的时候就不对了示例InputTestjavaInputStream类中所提供的read()方法都是以字节的方式进行读操作除此之外在Java语言中也提供了通过字符流的方式来读取键盘输入这就需要对标准输入流进行重新定向。为了获得针对键盘输入的字符流需要用到这样两个类:一个是InputStreamReader类它是将字节流转变为字符流另外一个就是BufferedReader类他是一个缓冲输入流提供了一些有用的针对字符的操作方法。importjavaioIOExceptionimportjavaioInputStreamReaderimportjavaioBufferedReaderclassInputTest{publicstaticvoidmain(Stringargs)throwsIOException{InputStreamReaderisr=newInputStreamReader(Systemin)BufferedReaderbuf=newBufferedReader(isr)Strings=bufreadLine()while(!sequals("end")){Systemoutprintln("Echo:"s)s=bufreadLine()}}}示例InputTestjava文件流类与文件操作IO处理中最常见的是对文件的操作javaio包中有关文件处理的类有:File、FileDescriptor、FileInputStream、FileOutputStream、RamdomAccessFile和处理字符文件的FileReader、FileWriter接口有:FilenameFilter。在进行文件的读写操作时会产生非运行时异常IOException必须捕获或声明抛弃。文件的操作步骤对于文件的操作也就是实现对文件的读写而不管是文本文件还是二进制文件都可采用相同的步骤:把一个合适的流连接到文件使用循环读或写数据关闭流。File类File类主要用于获取磁盘中文件或目录的信息。File类的对象并不打开文件也不提供任何文件处理功能。然而javaio包中的其它类经常使用File对象来指定所要操作的文件或目录。File类的实例表示主机文件系统中的文件名或路径名。File类提供个构造函数。publicFile(Stringname)*指定与File对象关联的文件或目录的名称,name可以包含路径信息及文件或目录名*publicFile(StringpathToName,Stringname)*使用参数pathToName(绝对路径或相对路径)来定位参数name所指定的文件夹或目录*publicFile(Filedirectory,Stringname)*使用现有的File对象directory(绝对路径或相对路径)来定位参数name所指定的文件夹或目录*publicFile(URIuri)*使用给定的统一资源定位符URI对象来定位文件*概述javaioFile类:文件和目录的路径名路径名(pathname)UNIX平台上绝对路径的前缀“”相对路径无前缀例“etcinetdconf”、“inetdconf”Windows平台绝对路径名的前缀由“盘符:”组成UNC路径名前缀为“”然后是主机名和共享名相对路径名无盘符例“c:windowsnotepadexe”、“notepadexe”方法publicbooleancanWrite()canRead()publicbooleanexists()publicbooleandelete()删除文件或目录若删除目录要求该目录必须为空publicbooleancreateNewFile()创建一个空文件当且仅当该文件不存在publicbooleanisDirectory()isFile()isHidden()publiclonglastModified()publicbooleansetLastModified(longtime)publicStringlist()得到当前目录下的所有文件名和目录名若该File对象不是表示目录则返回publicbooleanmkdir()mkdirs()创建一个目录publicbooleanrenameTo(Filedest)publicbooleansetReadOnly()通过调用File类提供的各种方法(见表)能够创建、删除文件、重命名文件、判断文件的读写权限及是否存在设置和查询文件的最近修改时间等。示例:参看例、、importjavaio*publicclassFileDemo{publicstaticvoidmain(Stringargs){Filefile=newFile("d:"Fileseparator"iotesttxt")new一个文件类对象if(fileexists())filedelete()如果此次存在该文件现将该文件删除elsetry{filecreateNewFile()创建新文件}catch(Exceptione){Systemoutprintln(egetMessage())}}}示例FileDemojavaimportjavaio*classListAllFile{publicstaticvoidmain(Stringargs)throwsException{Filedir=newFile("G:"Fileseparator)Strings=dirlist()列出e:下所有文件夹及文件并将若干个对象保存在一个string类的对象数组中for(inti=i<slengthi)将数组中的所有对象都输出到标准的输出设备上Systemoutprintln(si)屏幕上打印出来}}示例ListAllFilejava列出某个盘符下的所有文件及文件夹importjavaio*classFileNameFilterimplementsFilenameFilter实现FilenameFilter接口{privateStringprefix=""前缀子串publicFileNameFilter(Strings){prefix=s}publicbooleanaccept(Filedir,Stringname){若name不是以prefix开始则false否则返回truereturnnamestartsWith(prefix)}}列出某个盘符下的指定文件名的所有文件及文件夹示例ListAllFilejavapublicclassListFileName{publicstaticvoidmain(Stringargs)throwsException{Filedir=newFile("g:"Fileseparator)Strings=dirlist(newFileNameFilter("t"))生成一个前缀是字符a的文件名过滤器对象并传给list()方法。列出c:下所有文件名以a开头的文件或目录for(inti=i<slengthi)Systemoutprintln(si)屏幕上打印出来}}列出某个盘符下的指定文件名的所有文件及文件夹示例ListAllFilejavaimportjavaioFileclassFileType{publicstaticvoidmain(Stringargs){if(argslength<=){Systemoutprintln("nofilenameargumentspecified")Systemexit()}StringfileName=argsFilef=newFile(fileName)if(!fexists()){Systemoutprintln("can'tfind"fileName)Systemexit()}Systemoutprintln("File"fileName"is"flength()"byteslong")if(fisDirectory())Systemoutprintln("File"fileName"isadirectory")elseSystemoutprintln("File"fileName"isnotadirectory")}}示例FileTypejava判断指定文件的类型与长度importjavaioFileimportjavaioIOExceptionclassFileDemo{publicstaticvoidmain(Stringargs)throwsIOException{Filetestfile=newFile("testfiletxt")testfiledelete()testfilecreateNewFile()if(testfilecanRead())Systemoutprintln("filecanberead#")if(testfilecanWrite())Systemoutprintln("filecanbewritten#")testfilesetReadOnly()if(testfilecanRead())Systemoutprintln("filecanberead#")if(testfilecanWrite())Systemoutprintln("filecanbewritten#")}}示例FileReadWritejava测试文件的读写权限importjavaioFileimportjavaioFilenameFilterpublicclassDirList{publicstaticvoidmain(Stringargs){Filepath=newFile("")Stringlist=pathlist(newDirFilter(args))for(inti=i<listlengthi)Systemoutprintln(listi)}}classDirFilterimplementsFilenameFilter{StringkeyDirFilter(Stringkey){thiskey=key}publicbooleanaccept(Filedir,Stringname){Stringf=newFile(name)getName()returnfindexOf(key)!=}}javautilFilenameFilter接口publicbooleanaccept(Filedir,Stringname)是否指定的文件应包含在文件列表中文件读写流程打开文件流条件判断读出写入关闭文件流两种类型文件FileInputStreamFileOutputStream(字节流文件读写)FileReaderFileWriter(字符流文件读写)文件操作文件读写操作FileInputStream和FileOutputStream分别是InputStream和OutputStream的子类用于处理文件字节流每次一个字节。FileInputStream类用来打开一个输入文件若要打开的文件不存在则会产生例外FileNotFoundException这是一个非运行时例外必须捕获或声明抛弃FileOutputStream类用来打开一个输出文件若要打开的文件不存在则会创建一个新的文件否则原文件的内容会被新写入的内容所覆盖。文件读写操作(字节流)字节流构造方法publicFileInputStream(Filefile)throwsFileNotFoundExceptionpublicFileInputStream(Stringname)throwsFileNotFoundExceptionpublicFile(Stringpathname)publicFileOutputStream(Filefile)throwsFileNotFoundExceptionpublicFileOutputStream(Filefile,booleanappend)throwsFileNotFoundException是否向已存在的文件后添加publicFileOutputStream(Stringname)throwsFileNotFoundExceptionpublicFileOutputStream(Stringname,booleanappend)throwsFileNotFoundException文件读写操作示例Inpilestreamjava文件读写实例:见文件中的字符以字节流的形式读出标准输出设备上importjavaioIOExceptionimportjavaio*importjavaioFileInputStreamclassInpilestream{publicstaticvoidmain(Stringargs)throwsIOException{Fileft=newFile("testtxt")FileInputStreamfile=newFileInputStream(ft)intcwhile((c=fileread())!=)Systemoutprint((char)c)Systemoutprintln()fileclose()}}importjavaioFileimportjavaioFileInputStreamimportjavaioFileOutputStreamimportjavaioIOExceptionclassInputOutpileStream{publicstaticvoidmain(Stringargs)throwsIOException{Fileinpile=newFile("testtxt")Fileoutpile=newFile("testtxt")FileInputStreamin=newFileInputStream(inpile)FileOutputStreamout=newFileOutputStream(outpile)intcwhile((c=inread())!=)outwrite(c)inclose()outclose()}}示例InputOutpileStreamjava文件读写实例:将文件中的字符以字节流的形式读出然后再写入另一个文件中文件读写操作(字符流)FileReader类和FileWriter类作为输入输出类他们以字符为单位从文件中读数据或向文件中写数据。既然用到了字符就离不开字符的编码格式一般情况下以操作系统所默认的字符编码格式为准如中文版的windows系统下的字符编码格式为”GB”或“GBK”字符流构造方法publicFileReader(Filefile)throwsFileNotFoundExceptionpublicFileReader(StringfileName)throwsFileNotFoundExceptionpublicFile(Stringpathname)publicFileWriter(Filefile)throwsIOExceptionpublicFileWriter(Filefile,booleanappend)throwsIOExceptionpublicFileWriter(StringfileName)throwsIOExceptionpublicFileWriter(StringfileName,booleanappend)throwsIOExceptionimportjavaioIOExceptionimportjavaioFileReaderclassInpileReader{publicstaticvoidmain(Stringargs)throwsIOException{FileReaderfile=newFileReader("testtxt")intcwhile((c=fileread())!=)Systemoutprint((char)c)fileclose()}}示例InpileReaderjava以字符的形式读取文件中的内容并打印着标准输出设备上。importjavaioFileimportjavaioFileReaderimportjavaioFileWriterimportjavaioIOExceptionclassInputOutpilechar{publicstaticvoidmain(Stringargs)throwsIOException{Fileinpile=newFile("testtxt")Fileoutpile=newFile("testtxt")FileReaderin=newFileReader(inpile)FileWriterout=newFileWriter(outpile,true)intcwhile((c=inread())!=)outwrite(c)inclose()outclose()}}示例InputOutpilecharjava将文件中的字符以字符流的形式实现文件的拷贝文件缓冲类如何提高文件读写效率?读写操作是经常需要处理的操作但所要操作的文件过大时需要借助于缓冲方法以提高读写速度。缓冲操作:在执行缓冲输入时每次从输入中读取较大的数据量这在内存中构成了一个缓冲区而具体的读操作时针对缓冲区进行。在执行缓冲输出时每次向输出流所写出的数据时写到内存中的一个就较大的数据块中这也是一个缓冲区知道缓冲区写满才将数据真正写入到最终的介质中比如硬盘中。通过缓冲区操作降低了实际IO的操作次数提高读写效率两类缓冲流针对字节流javaioBufferedInputStream类javaioBufferedOutputStream类针对字符流javaioBufferedReader类javaioBufferedWriter类构造方法publicBufferedInputStream(InputStreamin)bytespublicBufferedInputStream(InputStreamin,intsize)publicBufferedOutputStream(OutputStreamout)bytespublicBufferedOutputStream(OutputStreamout,intsize)publicBufferedReader(Readerin)bytespublicBufferedReader(Readerin,intsz)publicBufferedWriter(Writerout)bytepublicBufferedWriter(Writerout,intsz)示例FileBufferedjavaimportjavaio*class{publicstaticvoidmain(Stringargs)throwsIOException{Stringstr=newString()try{FileReaderfin=newFileReader("g:testtxt")FileWriterfout=newFileWriter("g:testtxt")BufferedReaderin=newBufferedReader(fin)BufferedWriterout=newBufferedWriter(fout)while((str=inreadLine())!=){Systemoutprintln(str)在显示器上输出outwrite(str)将读取到的一行数据写入到输出流中outnewLine()写入换行符}outflush()将缓冲区中的数据全部写入到文件中inclose()outclose()}catch(IOExceptionioe){Systemoutprintln("错误!"ioe)}}}利用缓冲区输入输出流进行文件拷贝。RandomAccessFile随机访问文件(RandomAccessFile)javaioRandomAccessFile类随机访问文件即由RandomAccessFile类所实例化的对象可以在文件的任意位置进行读写。与前面介绍的文件操作类不同点在于RandomAccessFile类中同时定义有读和写方法即读写操作可以有一个类的对象完成但需要在构造RandomAccessFile对象时指定文件的读写模式。RandomAccessFile类对文件的访问时通过移动文件指针(filepointer)来实现的可以再文件中指定位置进行读写操作它直接继承object并且同时实现了接口DataInput和DataOutput提供了支持随机文件操作的方法:readXXX()或writeXXX():如ReadInt(),ReadLine(),WriteChar(),WriteDouble()等。构造方法publicRandomAccessFile(Stringname,Stringmode)throwsFileNotFoundExceptionpublicRandomAccessFile(Filefile,Stringmode)throwsFileNotFoundExceptionmode:“r”,“rw”方法publicvoidseek(longpos)publicintread()publicintread(byteb)publicintread(byteb,intoff,intlen)publicfinalbooleanreadBoolean()readByte()readChar()readShort()readInt()readDouble()readFloat()publicfinalStringreadLine()publicvoidwrite(intb)publicvoidwrite(byteb)publicvoidwrite(byteb,intoff,intlen)publicfinalvoidwriteBoolean()writeByte()writeChar()writeShort()writeInt()writeDouble()writeFloat()示例RandomAccessFileDemojavaimportjavaioRandomAccessFileimportjavaioIOExceptionimportjavaioFileNotFoundExceptionpublicclassRandomAccessFileDemo{publicstaticvoidmain(Stringargs){try{RandomAccessFilerf=newRandomAccessFile("testdat","rw")for(inti=i<i)rfwriteDouble(i*)rfclose()rf=newRandomAccessFile("testdat","rw")rfseek(*)rfwriteDouble()rfclose()rf=newRandomAccessFile("testdat","r")for(inti=i<i)Systemoutprintln("Value"i":"rfreadDouble())rfclose()}catch(FileNotFoundExceptione){Systemoutprintln(e)}catch(IOExceptione){Systemoutprintln(e)}}}向二进制文件中写入数据然后读出流的包装流的包装:记在已有的输入或输出流的基础上再“套上”一个相关的输入或输出流。可以利用不同流的特点寻找程序所需要的最适合的方法对已有的流进行再处理。如BufferedReaderin=newBuffered(newFileInputStream(“testtxt”))printWriterout=newPrintWriter(systemout)概念从流的包装角度来判断文件是否包含特定的字符串importjavaio*publicclassGrep{publicstaticvoidmain(Stringargs){try{FileInputStreamfile=newFileInputStream(args)指定输入流文件InputStreamReaderisr=newInputStreamReader(file)BufferedReaderbuf=newBufferedReader(isr)LineNumberReaderline=newLineNumberReader(buf)跟踪行号的缓冲字符输入流。StringtmpStringkey=args指定要查找的字符串while((tmp=linereadLine())!=){if(tmpindexOf(key)>=)返回指定字符在此字符串中第一次出现处的索引。Systemoutprintln((linegetLineNumber())":"tmp)}lineclose()}catch(FileNotFoundExceptione){Systemoutprintln(e)}catch(IOExceptione){Systemoutprintln(e)}}}示例Grepjava连接多个输入流在Java中输入输出类中SequenceInputStream类是用来将两个或多个输入流有序地租合为一个输入流由于SequenceInputStream类是继承自InputStream类所以其是以字节为单位从输入流中读取数据SequenceInputStream类本身没有定义特殊的读法其方法定义主要来自父类构造方法:参考API示例SequenceInputStreamjavaimportjavaioFileInputStreamimportjavaioSequenceInputStreamimportjavaioIOExceptionpublicclassSequenceDemo{publicstaticvoidmain(Stringargs)throwsIOException{FileInputStreamfile=newFileInputStream(args)FileInputStreamfile=newFileInputStream(args)SequenceInputStreamin=newSequenceInputStream(file,file)连接成一个输入流intiwhile((i=inread())!=)Systemoutprint((char)i)inclose()fileclose()fileclose()}}将两个输入流连接后再读出概述在java中的输入输出类中DataInputStream类和DataOutputStream类提供了针对基本数据类型进行读写操作的方法并且他们是对已有的输入输出流的一种包装。通过这两个类所提供的方法可实现具有”可移植性”(独立于操作系统)的输入与输出流。注意:这两个类对字符的处理都是以字符编码格式来进行即将字符按照的格式编码后写入输出流或是自输入流中读取编码的字符只是实现可移植的关键。基本数据转换流javaioDataInputStream类主要方法publicDataInputStream(InputStreamin)构造方法publicfinalbooleanreadBoolean()publicfinalbytereadByte()publicfinalcharreadChar()publicfinalintreadInt()javaioDataOutputStream类主要方法publicDataOutputStream(OutputStreamout)构造方法publicfinalvoidwriteBoolean(booleanv)publicfinalvoidwriteByte(intv)publicfinalvoidwriteChar(intv)publicfinalvoidwriteInt(intv)主要方法基本数据流的转换实例下面我们介绍如何用DataInputStream类生成一个文件。importjavaioFileOutputStreamimportjavaioDataOutputStreamimportjavaioIOExceptionpublicclassDataOutputDemo{publicstaticvoidmain(Stringargs)throwsIOException{FileOutputStreamfile=newFileOutputStream("testntxt")DataOutputStreamout=newDataOutputStream(file)Stringdescs={"衬衫","背包"}doubleprices={,}intunits={,}for(inti=i<priceslengthi){outwrite(descsi)outwriteChar('t')outwriteDouble(pricesi)outwriteChar('t')outwriteInt(unitsi)outwriteChar('n')}outclose()}}示例DataOutputDemojava下面我们再通过DataInputStream类来读取上述程序所生成的"testntxt"文件。importjavaioFileInputStreamimportjavaioDataInputStreamimportjavaioIOExceptionimportjavaioEOFExceptionpublicclassDataInputDemo{publicstaticvoidmain(Stringargs)throwsIOException{DataInputStreamin=newDataInputStream(newFileInputStream("testntxt"))doubletotal=try{while(true){Stringdesc=inread()inreadChar()doubleprice=inreadDouble()inreadChar()intunit=inreadInt()inreadChar()Systemoutprintln(desc""price""unit)total=totalunit*price}}catch(EOFExceptione){}Systemoutprintln("合计:"total"元")inclose()}}示例DataInputDemojava管道操作管道流:用于线程间的通信一个线程的PipedInputStream对象从另一个PipedOutputStream对象读取输入要使用管道流有用必须同时构造管道输入流和管道输出流。管道流是成对使用的。注意构造方法的使用。参考API作业与练习编程:求a到b之间的所有素数结果保存到数据文件中。其中a和b的值和文件名在程序运行时通过键盘输入并加必要的提示信息。(也可设计为GUI程序a,b的值由输入对话框输入

VIP尊享8折文档

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/81

java教程-第8章-文件、流和输入输出技术

¥30.0

会员价¥24.0

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利