javaio流实用教案

上传人:辰*** 文档编号:78742001 上传时间:2022-04-22 格式:PPT 页数:100 大小:3.01MB
收藏 版权申诉 举报 下载
javaio流实用教案_第1页
第1页 / 共100页
javaio流实用教案_第2页
第2页 / 共100页
javaio流实用教案_第3页
第3页 / 共100页
资源描述:

《javaio流实用教案》由会员分享,可在线阅读,更多相关《javaio流实用教案(100页珍藏版)》请在装配图网上搜索。

1、课前思考(sko)如何读取硬盘上的某个文件内容(nirng)?如何知道文件系统中有哪些目录和子目录?如何往硬盘上写文件?如何接收键盘输入?第1页/共99页第一页,共100页。教学(jio xu)目标与外部设备和其它计算机进行交流的输入输出操作,尤其是对磁盘的文件操作,是计算机程序重要的功能,任何计算机语言都必须对输入输出提供支持。Java也不例外,它的输入输出类库中包含了丰富的系统工具,这些类被放在java.io包中。在该类库中,除了定义文件输入输出操作外,还定义了许多用来(yn li)和其他外设进行信息交换的类。本章将详细介绍I/O类库中的基本内容,主要侧重于文件的输入输出管理和流的基本概念

2、。 第2页/共99页第二页,共100页。流 在计算机中,“流”的概念是1984年由C语言第一次引入的。 “流”可以看作(kn zu)是一个流动的数据缓冲区,数据从数据源流向数据目的地。第3页/共99页第三页,共100页。I/OI/O与流 I/OI/O是程序设计中的重要问题,大部分的应用程序都需要是程序设计中的重要问题,大部分的应用程序都需要I/OI/O操作,比如从键盘获得操作,比如从键盘获得用户输入、在屏幕输出运行用户输入、在屏幕输出运行(ynxng)(ynxng)结果、对磁盘文件进行读写等等。应用程序结果、对磁盘文件进行读写等等。应用程序只有通过只有通过I/OI/O操作才能实现与用户的交互及

3、数据的处理及存储操作才能实现与用户的交互及数据的处理及存储. . 在在JavaJava语言中,将不同类型的语言中,将不同类型的I/OI/O抽象为流。所谓抽象为流。所谓“流(流(streamstream)”,可以看作是,可以看作是数据在文件或程序之间的传递数据在文件或程序之间的传递 第4页/共99页第四页,共100页。输入(shr)流和输出流 一般来说,流有两种基本形式:输入流和输出流,根据程序一般来说,流有两种基本形式:输入流和输出流,根据程序(chngx)(chngx)是作为数据流的目的端还是源端来是作为数据流的目的端还是源端来划分。程序划分。程序(chngx)(chngx)首先要打开一个流

4、,才能与数据文件进行通信。首先要打开一个流,才能与数据文件进行通信。 通过输入流,程序通过输入流,程序(chngx)(chngx)可以从数据文件读取数据,但不可向输入流中写入数据;反之,通过输出流,可以从数据文件读取数据,但不可向输入流中写入数据;反之,通过输出流,程序程序(chngx)(chngx)可以向数据文件中写入数据。程序可以向数据文件中写入数据。程序(chngx)(chngx)与其他设备间的与其他设备间的I/OI/O也可以使用流,这时可将也可以使用流,这时可将设备看作是一个数据文件。设备看作是一个数据文件。 第5页/共99页第五页,共100页。Java I/OJava I/O流类的组

5、织(zzh)(zzh)模式 第6页/共99页第六页,共100页。java.iojava.io 在在JavaJava开发环境中,主要开发环境中,主要(zhyo)(zhyo)是由包是由包java.iojava.io中提供的一系列的类和中提供的一系列的类和接口来实现输入接口来实现输入/ /输出处理。而标准输入输出处理。而标准输入/ /输出处理则是由包输出处理则是由包java.langjava.lang中提中提供的类来处理的,这些类又都是从包供的类来处理的,这些类又都是从包java.iojava.io中的类继承而来的。中的类继承而来的。 I/OI/O类提供了低层次和高层次的界面。每一种介质都有一对与之

6、相关联的输类提供了低层次和高层次的界面。每一种介质都有一对与之相关联的输入输出类,它们提供低层次的面向数据序列(字符、字节)的界面。与介入输出类,它们提供低层次的面向数据序列(字符、字节)的界面。与介质相关的各个类都分别是输入输出抽象流类的子类,它们通常具有与介质质相关的各个类都分别是输入输出抽象流类的子类,它们通常具有与介质相关的构造器及方法。相关的构造器及方法。 I/OI/O抽象类为所有与介质相关的具体输入输出类提供了一个统一的界面。反抽象类为所有与介质相关的具体输入输出类提供了一个统一的界面。反过来各个具体的与介质相关的输入输出类也扩展了抽象类,通过它们可以过来各个具体的与介质相关的输入

7、输出类也扩展了抽象类,通过它们可以实现在具体介质上的输入输出操作实现在具体介质上的输入输出操作 第7页/共99页第七页,共100页。I/OI/O操作的一般(ybn)(ybn)步骤 构造一个与介质相关的构造一个与介质相关的I/OI/O对象,以提供一种低层次的方法将数据输入或输出对象,以提供一种低层次的方法将数据输入或输出(shch)(shch)到相应的介质;到相应的介质; 将与介质相关的对象强制类型转换为它的父类(即抽象将与介质相关的对象强制类型转换为它的父类(即抽象I/OI/O类),并利用该对象构类),并利用该对象构造一个流对象。这样便建立起了流类对象与介质相关对象的关联;造一个流对象。这样便

8、建立起了流类对象与介质相关对象的关联; 这时就可利用流对象的这时就可利用流对象的I/OI/O方法进行相应介质上的数据读写。方法进行相应介质上的数据读写。第8页/共99页第八页,共100页。字节(z ji)流与字符流 从流中传输的数据单位(dnwi)分为两类: 字节流从InputStream和OutputStream派生出来的一系列类,以字节(byte)为基本处理单位(dnwi)。 字符流从Reader和Writer派生出的一系列类,以16位的Unicode码表示的字符为基本处理单位(dnwi)。第9页/共99页第九页,共100页。字节(z ji)流第10页/共99页第十页,共100页。Inpu

9、tStreamInputStream类 InputStreamInputStream类定义了一套所有字节类定义了一套所有字节(z ji)(z ji)输输入流所需的方法入流所需的方法 方法方法描述描述read()read()将数据读入流中将数据读入流中skip()skip()跳过流中的若干字节跳过流中的若干字节available()available()返回当前流中的可用字节返回当前流中的可用字节mark()mark()在流中标记一个位置在流中标记一个位置reset()reset()返回到流中的标记位置返回到流中的标记位置markSupported()markSupported()返回一个返回一

10、个booleanboolean值,描述流是否支持标记和复位值,描述流是否支持标记和复位close()close()关闭流关闭流第11页/共99页第十一页,共100页。OutputStreamOutputStream类 OutputStreamOutputStream类定义类定义(dngy)(dngy)了一套所有字节了一套所有字节输出流所需的方法。输出流所需的方法。 方法方法描述描述write()写数据到流写数据到流flush()强制将被缓冲的内容写到输出强制将被缓冲的内容写到输出close()关闭流关闭流第12页/共99页第十二页,共100页。字符(z f)流类第13页/共99页第十三页,共1

11、00页。ReaderReader与WriterWriter类 Reader类的相关(xinggun)方法: void close() void mark(int readAheadLimit) boolean markSupported() int read() int read(char cbuf) int read(char cbuf, int off, int len) boolean ready() void reset() long skip(long n) Writer类的相关(xinggun)方法: void close() void flush() void write(cha

12、r cbuf) void write(char cbuf, int off, int len) void write(int c) void write(String str) void write(String str, int off, int len) 第14页/共99页第十四页,共100页。各种流的作用(zuyng)概述I/O类型类型流流作用作用内存CharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStream用来从内存读取数据或向内存写入数据StringReaderStringWriterStringBu

13、fferInputStream从内存里的某个String或StringBuffer读字符或字节管道PipedReaderPipedWriterPipedInputStreamPipedOutputStream实现一个输入、输出管道。管道可用于一个线程的输出连接到另一个线程的输入第15页/共99页第十五页,共100页。各种流的作用(zuyng)概述文件文件FileReaderFileWriterFileInputStreamFileOutputStream用于对本机文件系统上的一个用于对本机文件系统上的一个件行读写件行读写联结联结N/ASequenceInputStream将多个输入流联结成为一

14、个输将多个输入流联结成为一个输入流入流对象串行化对象串行化N/AObjectInputStreamObjectOutputStream将对象串行化将对象串行化数据转换数据转换N/ADataInputStreamDataOutputStream以一种与机器无关的格式读写以一种与机器无关的格式读写原始数据类型原始数据类型第16页/共99页第十六页,共100页。各种流的作用(zuyng)概述计数计数LineNumberReaderLineNumberInputStream在读取时记录行数在读取时记录行数预览预览PushbackReaderPushbackInputStream带有带有“回推回推(pu

15、shback)”缓冲区的输入流缓冲区的输入流打印打印PrintWriterPrintStream包含便捷的打印方法的流。包含便捷的打印方法的流。第17页/共99页第十七页,共100页。各种( zhn)流的作用概述缓冲缓冲BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream缓冲流,用于在读写时进行数据缓冲缓冲流,用于在读写时进行数据缓冲过滤过滤FilterReaderFilterWriterFilterInputStreamFilterOutputStream过滤流的抽象类接口。数据读写时对过滤流的抽象类接口。数据

16、读写时对数据进行过滤数据进行过滤在字节和在字节和字符之间字符之间转换转换InputStreamReaderOutputStreamWriter字节流和字符类间的转换桥梁字节流和字符类间的转换桥梁第18页/共99页第十八页,共100页。文件(wnjin)流 要对本机文件系统上的文件进行读写,需要使用要对本机文件系统上的文件进行读写,需要使用(shyng)(shyng)文件流。文件流。JavaJava的文件流类包括字符流的的文件流类包括字符流的FileReaderFileReader、FileWriterFileWriter和字节流的和字节流的FileInputStreamFileInputStr

17、eam、FileOutputStreamFileOutputStream。第19页/共99页第十九页,共100页。Java中文件(wnjin)的操作 而要进行文件流操作,首先必须清楚(qng chu)java中关于文件的基本操作,下面我们进行详细介绍。第20页/共99页第二十页,共100页。文件与目录的描述类File File类并不用来进行文件的读/写操作,它用来描述文件对象的属性,既可以表示文件,也可以表示目录。使用它提供(tgng)的方法,我们可以得到所指对象的描述信息,包括名称、存在否、读/写权限、路径等等。第21页/共99页第二十一页,共100页。需要注意的是,当我们在Windows环

18、境使用路径时,其分隔符不能是单一的“”符号,因为与C/C+相同,符号“”已经被转意了。例如:c:jbuilder3javabin路径是非法的,系统不会(b hu)识别,正确的应该为c:jbilder3javabin 或者直接使用反斜杠/来作为路径分隔符。如c:/jbilder3/java/bin第22页/共99页第二十二页,共100页。文件(wnjin)描述 类File提供了一种与机器( j q)无关的方式来描述一个文件对象的属性。 文件的生成 public File(String path); public File(String path,String name);public File(

19、File dir,String name);第23页/共99页第二十三页,共100页。文件(wnjin)描述 文件名的处理 String getName( );/*得到一个文件的名称(不包括(boku)路径)*/ String getPath( );/得到一个文件的路径名 String getAbsolutePath( );/*得到一个文件的绝对路径名*/ String getParent( );/*得到一个文件的上一级目录名*/String renameTo(File newName);/*将当前文件名更名为给定文件的完整路径*/第24页/共99页第二十四页,共100页。文件(wnjin)描

20、述 文件属性测试(csh) boolean exists( );/*测试(csh)当前File对象所指示的文件是否存在*/ boolean canWrite( );/测试(csh)当前文件是否可写 boolean canRead( );/测试(csh)当前文件是否可读 boolean isFile( );/*测试(csh)当前文件是否是文件(不是目录)*/boolean isDirectory( );/*测试(csh)当前文件是否是目录*/第25页/共99页第二十五页,共100页。文件(wnjin)描述 普通(ptng)文件信息和工具long lastModified( );/*得到文件最近一

21、次修改的时间*/long length( );/得到文件的长度,以字节为单位boolean delete( );/删除当前文件 目录操作boolean mkdir( );/*根据当前对象生成一个由该对象指定的路径*/String list( );/列出当前目录下的文件第26页/共99页第二十六页,共100页。File类的方法(fngf)及变量方法及变量名功能描述public File(File dir,String name)由指定的目录、名字创建该对象public File(String path,String name)由指定的路径、名字创建该对象public File(String pa

22、th)由指定路径创建该对象public staticfinal String pathSeparator返回系统的路径分隔符public boolean canRead()如果文件可读为真public boolean canWrite()如果文件可写为真public boolean delete()删除文件public boolean equals(Object obj)文件比较,如是同一个文件则为真public boolean exists()指定的文件存在返回真第27页/共99页第二十七页,共100页。public String getAbsolutePath()得到文件的绝对路径publ

23、ic String getName()得到文件名public String getParent()得到父目录的名字public String getPath()返回路径public int hashCode()返回一个哈希码public nativeboolean isAbsolute()如果是绝对路径返回真public boolean isDirectory()如果是目录则返回真public boolean isFile()如果是文件则返回真public long lastModified()返回最近一次修改时间public long length()返回文件长度第28页/共99页第二十八页

24、,共100页。public String list(FilenameFilter filter)返回指定格式的目录中的文件名public String list()返回当前目录中的所有文件名public boolean mkdir()创建目录,成功返回真public boolean mkdirs()创建路径中所有目录,成功则返回真public static final char pathSeparatorChar返回路径分隔符public boolean renameTo(Filedest)文件更名,成功返回真public static final char separatorChar返回文件

25、分隔符public String toString()返回对象的字符串表示第29页/共99页第二十九页,共100页。 下面我们给出几个File类的应用实例。通过例题的使用,希望对File类有更清楚(qng chu)的认识。 例 import java.io.*; public class MyClass1 public static void main(String args) Filef=new File(c:jbuilder3myprojectsuntitled5MyClass1.java); if(!f.exists()第30页/共99页第三十页,共100页。 System.out.pr

26、intln(File MyClass1.java doesnt exist!); else S y s t e m . o u t . p r i n t l n ( T h i s f i l e c a n r e a d +f.canRead(); S y s t e m . o u t . p r i n t l n ( l a s t m o d i f i e d +f.lastModified(); System.out.println(Parent is +f.getParent(); System.out.println(File length is +f.length();

27、 public MyClass1() 第31页/共99页第三十一页,共100页。 图 7.3第32页/共99页第三十二页,共100页。例 import java.io.*;class FileTestpublic static void main(String args)System.out.println(path separator+File.pathSeparator);System.out.println(path separator char+File.pathSeparatorChar);System.out.println(separator+File.separator);Sy

28、stem.out.println(separator char+File.separatorChar);File f=new File(/dong1/test1.class);System.out.println();System.out.println(f);System.out.println(exist?+f.exists();第33页/共99页第三十三页,共100页。System.out.println(name+f.getName();System.out.println(path+f.getPath();System.out.println(absolute path+ f.get

29、AbsolutePath();System.out.println(parent+f.getParent();System.out.println(is a file?+f.isFile();System.out.println(is a directory?+f.isDirectory();System.out.println(length+f.length();System.out.println(can read+f.canRead();System.out.println(can write+f.canWrite();System.out.println(last modified+f

30、.lastModified();第34页/共99页第三十四页,共100页。 File newF=new File(newFile);System.out.println(. Rename +f+.);f.renameTo(newF); System.out.println(name +newF.getName();System.out.println(f+exist?+f.exists();System.out.println(. delete+newF+.);newF.delete(); System.out.println(newF+exist?+newF.exists();第35页/共9

31、9页第三十五页,共100页。运行(ynxng)结果path separator :path separator char:separator /separator char /dong1/test1.classexist? truename test1.classpath /dong1/test1.classabsolute path /dong1/test1.classparent /dong1第36页/共99页第三十六页,共100页。运行(ynxng)结果is a file? trueis a directory? falselength 514can read truecan write

32、 truelast modified 907117020000. Rename /dong1/test1.classname newFile/dong1/test1.class exist? false. delete newFile .newFile exist? false第37页/共99页第三十七页,共100页。文件夹处理(chl) list方法用于列出一个目录中所有的文件(wnjin)或与某个模式相匹配的文件(wnjin)。 列出目录中与某种模式相匹配的文件(wnjin): public String list(FilenameFilter filter); 在接口 FilenameF

33、ilter中定义的方法只有:boolean accept(File dir,String name);第38页/共99页第三十八页,共100页。例:import java.io.*;public class FileFilterTestpublic static void main(String args)File dir=new File(“/dongl”);Filter filter=new Filter(“htm”);System.out.println(“list html files in directory ”+dir); String files=dir.list(filter)

34、;第39页/共99页第三十九页,共100页。for (int i=0;ifiles.length;i+)File f=new File(filesi);if(f.isFile()System.out.println(“file”+f); elseSystem.out.println(“sub directory”+f); 第40页/共99页第四十页,共100页。class Filter implements FilenameFilterString extent;Filter( String extent)this.extent=extent;public boolean accept(Fil

35、e dir,String name)return name.endsWith(“.”+extent);第41页/共99页第四十一页,共100页。运行(ynxng)结果list html files in directoty /donglfile cert_test.htmfile cert_sample.htmfile cert_obj.htm第42页/共99页第四十二页,共100页。 例 import java.io.*; public class MyClass2 public static void main(String args) File f1=new File(c:jbuilde

36、r3myprojects); if(!f1.isDirectory() System.out.println(Error: +f1+isnt a directory!); else String dirList=f1.list(); for(int i=0;idirList.length;i+)System.out.println(dirListi); public MyClass2() 第43页/共99页第四十三页,共100页。 在该例中,我们并没有(mi yu)在调用File类的list方法中传递参数,这样,处在目录c:jbuilder3myprojects下的所有文件及目录将均被输出,结

37、果如图7.4所示。第44页/共99页第四十四页,共100页。图 7.4 第45页/共99页第四十五页,共100页。 1Byte流(字节流)文件的读取 该类的结构如图7.1所示,我们(w men)主要用其中的FileOutputStream和FileInputStream类,它们的父类为InputStream和OutputStream。主要的方法有: InputStream int read() int read(byte buf) int read(byte buf,int offset, int length) close()利用流进行(jnxng)文件I/O处理第46页/共99页第四十六页

38、,共100页。 OutputStream int write(int c) int write(byte buf) int write(byte buf,int offset,int length) close() 下面给出一个(y )应用实例7.4。第47页/共99页第四十七页,共100页。图 7.5第48页/共99页第四十八页,共100页。 例7.4 import java.io.*; public class FileCopy public static void main(String args) throws IOException FileInputStream f1; FileO

39、utputStream f2; f1=new FileInputStream(FileCopy.java); f2=new FileOutputStream(acopy_of_java_file);第49页/共99页第四十九页,共100页。 int temp; while(temp=f1.read()!=-1) f2.write(temp); f1.close(); f1.close(); public FileCopy() 在该例中,我们利用字节流将本程序(chngx)拷贝至另一个文件acopy_of_java_file中,如果指定的文件不存在,则创建一个新文件,否则原文件的内容会被新写入的

40、内容覆盖。当程序(chngx)运行后,将生成一个与原程序(chngx)相同的副本。第50页/共99页第五十页,共100页。 2Character流(字符流)文件(wnjin)的读取 该类如图7.2所示,输入/输出类的父类为Reader、Writer,其基本的方法有: Reader int read() int read(char buf) int read(char buf,int offset,int length) close()第51页/共99页第五十一页,共100页。 Writer int write(int c) int write(char buf) int write(char

41、buf,int offset,int length) close() 读者可与字节流进行( jnxng)比较,注意二者方法的区别。下面我们用字符流来改写例7.4:第52页/共99页第五十二页,共100页。 例7.5 import java.io.*; public class FileCopy public static void main(String args) throws IOException FileReader f1; FileWriter f2; f1=new FileReader(FileCopy.java); f2=new FileWriter(acopy_of_java_

42、file);第53页/共99页第五十三页,共100页。 int temp; while(temp=f1.read()!=-1) f2.write(temp); f1.close(); f2.close(); public FileCopy() 第54页/共99页第五十四页,共100页。 例7.6 import java.io.*; public class ReadFile public static void main (String args) throws IOException F i l e R e a d e r f r = n e w FileReader(ReadFile.ja

43、va);B u f f e r e d R e a d e r b r = n e w BufferedReader(fr);String line = br.readLine( );while (line != null) 第55页/共99页第五十五页,共100页。 System.out.println(line); line = br.readLine( ); br.close( ); 本程序中,我们通过(tnggu)类BufferedReader对文件实现按行读取,达到一行一行输出的目的,结果如图7.6所示。第56页/共99页第五十六页,共100页。图 7.6 第57页/共99页第五十七

44、页,共100页。 3二进制数据流的文件读取 如果要读取与机器无关的基本数据类型的数据,如整型或浮点型的二 进 制 数 , 就 要 用 到 二 进 制 数 据 文 件 流 D a t a I n p u t S t r e a m 、D a t a O u t p u t S t r e a m 。 实 际 使 用 中 , 类 D a t a I n p u t S t r e a m 和DataOutputStream必须和一个输入类(InputStream)或输出(shch)类(OutputStream)联接起来,不能直接用文件名或文件对象(File)对其直接初始化,例如:第58页/共99页

45、第五十八页,共100页。 例7.7 import java.io.*; public class DatastreamDemo public static void main(String args) throws IOException F i l e O u t p u t S t r e a m f 2 = n e w FileOutputStream(data); D a t a O u t p u t S t r e a m d f o = n e w DataOutputStream(f2); dfo.writeBoolean(true);第59页/共99页第五十九页,共100页。

46、 dfo.writeInt(100); dfo.writeFloat(200.2f); f2.close(); dfo.close(); F i l e I n p u t S t r e a m f 1 = n e w FileInputStream(data); D a t a I n p u t S t r e a m d f i = n e w DataInputStream(f1); boolean b=dfi.readBoolean(); int i=dfi.readInt(); float f=dfi.readFloat(); f1.close(); dfi.close(); S

47、ystem.out.println(The value is: );第60页/共99页第六十页,共100页。 System.out.println( +b); System.out.println( +i); System.out.println( +f); public DatastreamDemo() 该例中,我们首先利用类DataOutputStream生成(shn chn)一个二进制文件data,并对它写入三个不同类型的数据:布尔型、整型、浮点型。然后利用DataInputStream读入刚刚输入的数据并显示出来,结果如图7.7所示。可以看出,输出结果与我们的输入是一一对应的。第61页

48、/共99页第六十一页,共100页。图 7.7第62页/共99页第六十二页,共100页。 4随机访问文件的读取 对于InputStream/OutputStream、Reader/Writer类来说,它们都是顺序访问流,只能进行顺序读写。而所谓随机读写,是指读写完上一个字节后,不只能读写其后继的字节,还可以读写文件中任意的字节,就好象文件中有一个随意移动的指针一样。 Java语言提供了类RandomAccessFile来进行随机文件的读取。在生成一个RandomAccessFile对象时,不仅要说明文件对象或文件名,同 时 还 需 指 明 ( z h m n g ) 访 问 模 式 , 即 “

49、只 读 方 式 ” ( r ) 或 “ 读 写 方式”(rw),这类似于C/C+中的fopen() 函数。第63页/共99页第六十三页,共100页。随机文件(wnjin)处理 使用流的形式对文件使用流的形式对文件(wnjin)(wnjin)进行读写必须顺序进行,也就是说进行读写必须顺序进行,也就是说这些文件这些文件(wnjin)(wnjin)流的数据必须按先后次序进行处理。在对某些流的数据必须按先后次序进行处理。在对某些顺序存储访问介质,例如磁带等进行访问时,这样的文件顺序存储访问介质,例如磁带等进行访问时,这样的文件(wnjin)(wnjin)流方式非常有用流方式非常有用 随机文件随机文件(

50、wnjin)(wnjin)存取提供了一种更灵活的文件存取提供了一种更灵活的文件(wnjin)(wnjin)读写读写方式,它允许对文件方式,它允许对文件(wnjin)(wnjin)的内容进行非顺序的访问。在这里,的内容进行非顺序的访问。在这里,“随机随机”是指所存取的数据不需要与以前存取过的历史数据有任何是指所存取的数据不需要与以前存取过的历史数据有任何的关系。使用随即文件的关系。使用随即文件(wnjin)(wnjin)存取方式可以在打开一个文件存取方式可以在打开一个文件(wnjin)(wnjin)后同时进行读写操作,并且可以移动文件后同时进行读写操作,并且可以移动文件(wnjin)(wnjin

51、)指指针使其指向文件针使其指向文件(wnjin)(wnjin)中的任何位置中的任何位置 第64页/共99页第六十四页,共100页。随机存取文件(wnjin)的结构 在文件内部在文件内部(nib),文件被分成固定长度的数据块(记录)。从概念上来说,文,文件被分成固定长度的数据块(记录)。从概念上来说,文件可以看作是一个记录数组。文件指针的移动是以记录为单位的。件可以看作是一个记录数组。文件指针的移动是以记录为单位的。第65页/共99页第六十五页,共100页。RandomAccessFileRandomAccessFile类 RandomAccessFileRandomAccessFile类的构造

52、函数使用了两个参数,第一个参数表示要类的构造函数使用了两个参数,第一个参数表示要操作的文件,可以使用字符串类型的文件名也可以使用一个文件对象;操作的文件,可以使用字符串类型的文件名也可以使用一个文件对象;第二个字符串类型的参数第二个字符串类型的参数modemode表示了对文件的操作方式:表示了对文件的操作方式:modemode为为 ”r” ”r” 时表示可以从文件读取;时表示可以从文件读取;mode mode 为为 ”rw” ”rw” 时表示既可以从文件读取时表示既可以从文件读取也可以向文件写入也可以向文件写入 RandomAccessFileRandomAccessFile类通过实现类通过实

53、现DataInputDataInput和和DataOutPutDataOutPut的方法来实现的方法来实现文件数据的读写,这些方法允许使用二进制编码形式将基本的文件数据的读写,这些方法允许使用二进制编码形式将基本的JavaJava类类型写入或读出文件。在型写入或读出文件。在RandomAccessFileRandomAccessFile类中还提供了一些操作文件类中还提供了一些操作文件指针指针(zhzhn)(zhzhn)的方法,如通过的方法,如通过seekseek方法可以将文件指针方法可以将文件指针(zhzhn)(zhzhn)移动到其参数所制定的位置。移动到其参数所制定的位置。第66页/共99页

54、第六十六页,共100页。 RandomAccessFile类的功能类似于DataOutputStream类和DataInputStream类的功能合并,即实现了在一个流中进行( jnxng)读、写两种功能。其常用的方法如表7.2所示。第67页/共99页第六十七页,共100页。表7.2 RandomAccessFile类的常用(chn yn)方法 方法名功能描述long getFilePointer()返回当前文件指针long length()返回文件长度boolean readBoolean()读入一个布尔值int readInt()读入一个整数string readLine()读入一行字符串

55、void seek(long pos)文件指针移到指定位置int skipBytes(int n)文件指针向前移n个字节void write(byte b)把数组内容写入文件void writeBoolean(boolean v)写入一个布尔值void writeInt(int v)写入一个整数第68页/共99页第六十八页,共100页。例程importjava.io.*;publicclassFileTestpublicstaticvoidmain(Stringargs)throwsIOExceptionRandomAccessFileraf=newRandomAccessFile(foo.t

56、xt,rw);tryWriterout=newOutputStreamWriter(newFileOutputStream(raf.getFD(),UTF-8);out.write(HelloWorld!); out.flush();raf.seek(6);out.write(Java);out.flush();finally raf.close();第69页/共99页第六十九页,共100页。 例7.8的功能与例7.7一样(yyng),只不过是用RandomAccessFile来实现的。 例7.8 import java.io.*; public class RandomDemo public

57、 static void main(String args) throws IOException RandomAccessFilefa=new RandomAccessFile(data,rw);第70页/共99页第七十页,共100页。 fa.writeBoolean(true); fa.writeInt(100); fa.writeFloat(200.2f); fa.seek(0); boolean b=fa.readBoolean(); int i=fa.readInt(); float f=fa.readFloat(); System.out.println(The value rea

58、d from a random file is : ); System.out.println( +b); System.out.println( +i); System.out.println( +f);第71页/共99页第七十一页,共100页。 fa.close(); public RandomDemo() 程序运行结果( ji gu)如图7.8所示。第72页/共99页第七十二页,共100页。图 7.8 第73页/共99页第七十三页,共100页。例程import java.io.*;class Copy private void copy(InputStream in, OutputStr

59、eam out) throws IOException byte buf = new byte4096; int len = in.read(buf); while (len != -1) out.write(buf, 0, len); len = in.read(buf); public void cat(String fsrc, String fdest) try InputStream in = new FileInputStream(fsrc); OutputStream out = new FileOutputStream(fdest, true); copy(in, out); o

60、ut.close(); in.close(); catch (IOException ex) System.err.println(ex); 第74页/共99页第七十四页,共100页。例程-cont.public class UseCopypublic static void main(String args)Copy c=new Copy();c.cat(“in.dat”,”out.dat”);第75页/共99页第七十五页,共100页。 7.3.2 内存的I/O流 表7.3给出了Java支持内存读/写的类,总结起来有以下两类。 ( 1 ) 对 应 字 节 内 存 读 / 写 的 有 B y

61、t e A r r a y I n p u t St r e a m 、ByteArrayOutputStream及String BufferInputStream。它们可以(ky)从字节数组中读取数据或向字节数组中写入数据。例如: 例7.10 import java.io. *; public class MemoryDemo 第76页/共99页第七十六页,共100页。 public static void main(String args)throws IOException byte b=111,100,74,98,80,69; byte temp=new byte10; B y t e

62、 A r r a y I n p u t S t r e a m b i = n e w ByteArrayInputStream(b); B y t e A r r a y O u t p u t S t r e a m b o = n e w ByteArrayOutputStream(); StringBufferInputStream bs= new StringBufferInputStream(A demo for memory input!); int x; while(x=bi.read()!=-1)第77页/共99页第七十七页,共100页。 bo.write(x); Syst

63、em.out.println(The result of ByteArrayOutputStream is: +bo); bs.read(temp,0,4); System.out.print(The result of StringBufferOutputStream is: ); for(int i=0;i=3;i+) System.out.print( +tempi); System.out.println(); System.out.print( +bs); 运行(ynxng)结果如图7.9所示。第78页/共99页第七十八页,共100页。图 7.9 第79页/共99页第七十九页,共10

64、0页。 对于(duy)ByteArrayOutputStream来说,我们先从ByteArrayInputStream类中把字节流读入bo的缓冲区中,然后直接进行输出,该对象调用自己的toString()进行输出格式转换。 (2) 对应字符内存读/写的有CharArrayReader、CharArrayWriter、StringReader及StringWriter。它们可以从字符数组中读取数据或向字符数组中写入数据。例如: 例7.11 import java.io.*; public class MemoryDemo 第80页/共99页第八十页,共100页。 public static vo

65、id main(String args)throws IOException char b=a,t,e,s,t,d,e,m,o; char temp=new char10; CharArrayReader br= new CharArrayReader(b); CharArrayWriter bw=new CharArrayWriter(); StringReader bsr= new StringReader(test demo!); StringWriter bsw= new StringWriter(); int x; while(x=br.read()!=-1) bw.write(x)

66、;第81页/共99页第八十一页,共100页。 System.out.println(The result of CharArrayReader is: +bw); bsr.read(temp,0,4); System.out.print(The result of StringReader is: ); for(int i=0;i=3;i+) System.out.print( +tempi); System.out.println(); bsw.write(hello,everybody!); System.out.print(The result of StringWriter is: ); System.out.println( +bsw); 程序运行结果( ji gu)如图7.10所示。第82页/共99页第八十二页,共100页。图 7.10 第83页/共99页第八十三页,共100页。 我们可以发现以上两个程序的基本架构无大的区别(qbi),只是对不同内存流,构造方法有所不同。上述的几种输出内存流,它们在初始化的时候,缺省的缓冲区的大小均为32个字节。当然,实际操作过程中,缓冲区

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!