Java 2实用教程第4版_第10章_输入流与输出流.ppt
注意:开始用功了注意:开始用功了!第 页Java2实用教程实用教程(第第4版版)第第10章章配合例子源代码一起使用例子源代码一起使用Power point 制作:耿祥义 张跃平输入、输出流输入、输出流第 页导读导读主要内容主要内容File类类文件字节输入、输出流文件字节输入、输出流文件字符输入、输出流文件字符输入、输出流缓冲流缓冲流随机流随机流数组流数组流数据流数据流对象流对象流序列化与对象可隆序列化与对象可隆使用使用Scanner解析文件解析文件文件锁文件锁第 页输输入入、输输出出流流提提供供一一条条通通道道程程序序,可可以以使使用用这这条条通通道道读读取取源源中中的的数数据据或或把把数数据据传传送送到到目目的的地地。把把输输入入流流的的指指向向称称作作源源,程程序序从从指指向向源源的的输输入入流流中中读读取取源源中中的的数数据据;而而输输出出流流的的指指向向是是数数据据要要去去的的一一个个目目的的地地,程程序序通通过过向向输出流中写入数据把数据传送到目的地。输出流中写入数据把数据传送到目的地。概述概述第 页10.1 FileFile类类 FileFile对对象象主主要要用用来来获获取取文文件件本本身身的的一一些些信信息息,不涉及对文件的读写操作。不涉及对文件的读写操作。创建一个创建一个FileFile对象的构造方法有对象的构造方法有3 3个:个:File(String filename);File(String filename);File(String File(String directoryPath,StringdirectoryPath,String filename);filename);File(File f,String filename);File(File f,String filename);第 页10.1.1 文件的属性文件的属性 File类的下列方法获取文件本身的一些信息。类的下列方法获取文件本身的一些信息。public String getName()获取文件的名字。获取文件的名字。public boolean canRead()判断文件是否是可读的。判断文件是否是可读的。public boolean canWrite()判断文件是否可被写入。判断文件是否可被写入。public boolean exits()判断文件是否存在。判断文件是否存在。public long length()获取文件的长度(单位是字节)。获取文件的长度(单位是字节)。public String getAbsolutePath()获取获取文件的绝对路径。文件的绝对路径。public String getParent()获取文件的父目录。获取文件的父目录。public boolean isFile()判断文件是否是一个普通文件,而不是目录。判断文件是否是一个普通文件,而不是目录。public boolean isDirectroy()判断文件是否是一个目录。判断文件是否是一个目录。public boolean isHidden()判断文件是否是隐藏文件。判断文件是否是隐藏文件。public long lastModified()获取文件最后修改的时间。获取文件最后修改的时间。例子例子1 1(例子例子1 1使用上述的一些方法,获取某些文件的信息使用上述的一些方法,获取某些文件的信息)第 页10.1.2 目录目录 1 1创建目录创建目录 public boolean mkdir()2 2列出目录中的文件列出目录中的文件 public String list()用字符串形式返回目录下的全部文件。用字符串形式返回目录下的全部文件。public File listFiles()用用FileFile对对象象形形式式返返回回目目录录下下的的全全部部文件。文件。public String list(FilenameFilter obj)用用字字符符串串形形式式返回目录下的指定类型的所有文件。返回目录下的指定类型的所有文件。public File listFiles(FilenameFilter obj)用用FileFile对对象形式返回目录下的指定类型所有文件。象形式返回目录下的指定类型所有文件。上述两方法的参数上述两方法的参数FilenameFilterFilenameFilter是一个接口是一个接口,该接口有一个方法:,该接口有一个方法:public boolean accept(File dir,String name);例例子子2 2(Example10_2.javaExample10_2.java ,FileAccept.javaFileAccept.java ),),例例子子2 2列列出出当当前目录(应用程序所在的目录)下全部前目录(应用程序所在的目录)下全部javajava文件的名字文件的名字)第 页10.1.3 文件的创建与删除文件的创建与删除 当使用当使用FileFile类创建一个文件对象后,例如类创建一个文件对象后,例如 File file=new File file=new File(c:myletter,letter.txtFile(c:myletter,letter.txt););如果如果c:myletterc:myletter目录中没有名字为目录中没有名字为letter.txtletter.txt文件文件,文件对象文件对象filefile调用方法调用方法 public public booleanboolean createNewFilecreateNewFile();();可以在可以在c:myletterc:myletter目录中建立一个名字为目录中建立一个名字为letter.txtletter.txt的文件的文件。文件对象调用方法文件对象调用方法 public public booleanboolean delete()delete()可以删除当前文件,例如:可以删除当前文件,例如:file.delete();file.delete();第 页10.1.4 运行可执行文件运行可执行文件 用用Runtime Runtime 类类声明一个对象声明一个对象(RuntimeRuntime类在类在java.langjava.lang包包)Runtime Runtime ecec;然后使用该类的然后使用该类的getRuntimegetRuntime()()静态方法创建这个对象:静态方法创建这个对象:ecec=Runtime.getRuntimeRuntime.getRuntime();();ecec可以调用可以调用 exec(String command)exec(String command)方法方法打开本地机的可执行文件或执行一个操作。打开本地机的可执行文件或执行一个操作。例例子子3 3(例例子子3 3中中,RuntimeRuntime对对象象打打开开windowswindows平平台台上上的的记记事事本程序和浏览器本程序和浏览器)第 页10.2 文件字节输入流文件字节输入流 java.iojava.io包包 提提 供供 了了 大大 量量 的的 流流 类类,JavaJava把把InputStreamInputStream抽抽象象类类的的子子类类创创建建的的流流对对象象称称作作字字节节输输入入流流、OutputStreamOutputStream抽抽象象类类的的子子类类创创建建的的流流对对象象称称作作字字节节输输出出流流,JavaJava把把ReaderReader抽抽象象类类的的子子类类创创建建的的流流对对象象称称作作字字符符输输入入流流、WriterWriter抽象类的子类创建的流对象称作字符输出流。抽象类的子类创建的流对象称作字符输出流。针针对对不不同同的的源源或或目目的的地地,java.iojava.io包包为为程程序序提提供供了了相相应应的的输输入入流流或或输输出出流流,这这些些输输入入、输输出出流流绝绝大大部部分分都都是是InputStreamInputStream、OutputStreamOutputStream、ReaderReader或或WriterWriter的子类。的子类。第 页使用输入流通常包括4个基本步骤:(1)设定输入流的源(2)创建指向源的输入流(3)让输入流读取源中的数据(4)关闭输入流。1构造方法构造方法 使用FileInputStream类的下列构造方法创建指向文件的输入流。FileInputStream(String name);FileInputStream(File file);参数name和和file指定的文件指定的文件称为输入流的源。输入流的源。第 页2使用输入流读取字节使用输入流读取字节 文件字节流可以调用从父类继承的read方法顺序地读取文件,只要不关闭流,每次调用read方法就顺序地读取文件中的其余内容,直到文件的末尾或文件字节输入流被关闭。int read()读取单个字节的数据,返回字节值(0255整数),如果未读出字节就返回-1。int read(byte b)读取b.length个字节到字节数组b中,返回实际读取的字节数。如果到达文件的末尾,则返回-1。int read(byte b,int off,int len)读取len个字节到字节数组b中,并返回实际读取的字节数目。如果到达文件的末尾,则返回-1,参数off指定从字节数组的某个位置开始存放读取的数据。例子例子4 使用文件字节流读取文件的内容。第 页10.3 文件字节输出流文件字节输出流 使用输出流通常包括4个基本步骤:(1)给出输出流的目的地(2)创建指向目的地的输出流(3)让输出流把数据写入到目的地(4)关闭输出流。1构造方法构造方法 使用FileOutputStream类的下列具有刷新功能的构造方法创建指向文件的输出流。FileOutputStream(String name);FileOutputStream(File file);参数name和和file指定指定的文件称为输出流的目的地目的地 第 页输出流的wirie方法以字节单位向目的地写数据。void write(int n)向目的地写入单个字节。void write(byte b)向目的地写入一个字节数组。void write(byte b,int off,int len)从字节数组中偏移量off处取len个字节写到目的地。FileOutputStream流顺序地写文件,只要不关闭流,每次调用write方法就顺序地向目的地写入内容,直到流被关闭。2使用输出流写字节使用输出流写字节 例子例子5使用文件字节输出流字节输出流写文件a.txt。例例子子5首先使用具有刷新功能的构造方法创建指向文件a.txt的输出流、并向a.txt文件写入“新年快乐”,然后再选择使用不刷新文件的构造方法指向a.txt,并向文件写入(即尾加)“Happy New Year”3关闭流关闭流 通过调用close()方法,可以保证操作系统把流缓冲区的内容写到它的目的地,即关闭输出流可以把该流所用的缓冲区的内容冲洗掉(通常冲洗到磁盘文件上)。第 页 1 1ReaderReader类提供的类提供的readread方法以字符为单位顺序地读取源中的数据。方法以字符为单位顺序地读取源中的数据。int read():int read(char b):int read(char b,int off,int len):void close():long skip(long numBytes):2 2 WriterWriter流流以以字字符符为为单单位位顺顺序序地地写写文文件件,每每次次调调用用writewrite方方法法就就顺顺序序地地向向目目的地写入内容。的地写入内容。Writer类有如下常用的方法。类有如下常用的方法。void write(int n):向输出流写入一个字符。void write(byte b):向输出流写入一个字符数组。void write(byte b,int off,int length):从给定字符数组中起始于偏移量off处取len个字符写到输出流。void close():关闭输出流。10.4 文件字符输入、输出流文件字符输入、输出流 例子例子6 6 使用文件字符输入、输出流将文件a.txt的内容尾加到文件b.txt中。第 页10.5 缓冲流缓冲流 1 1BufferedReaderBufferedReader和和BufferedWriterBufferedWriter类类创创建建的的对对象象称称作作缓缓冲冲输输入入、输输出出流流。二二者者的的源源和和目目的的地地必必须须是是字字符符输入流和字符输出流。输入流和字符输出流。构造方法:构造方法:BufferedReader(ReaderBufferedReader(Reader in);in);BufferedWriterBufferedWriter(Writer out);(Writer out);2.2.BufferedReaderBufferedReader和和BufferedWriterBufferedWriter类类读读写写文文件件的的方法方法:readLinereadLine()()读取文本行读取文本行 write(Stringwrite(String s,ints,int off,intoff,int lenlen)把把字字符符串串s s写写到到文件中文件中 newLinenewLine();();向文件写入一个回行符向文件写入一个回行符 第 页 由英语句子构成的文件由英语句子构成的文件english.txtenglish.txt(每句占一行):每句占一行):The arrow missed the target.They rejected the union demand.Where does this road go to?例例子子7 7 按按行行读读取取english.txtenglish.txt ,并并在在该该行行的的后后面面尾尾加加上上该该英英语语句句子子中中含含有有的的单单词词数数目目,然然后后再再将将该该行行写写入入到到一一个个名名字字为为englishCount.txtenglishCount.txt的的文文件件中中。程程序序运运行行效效果如图果如图10.10.5 5。第 页10.6 随机流随机流 使使用用RandomAccessFileRandomAccessFile类类来来创创建建一一个个随随机机访访问问文文件件流流。RandomAccessFileRandomAccessFile类类创建的流的指向既可以作为源也可以作为目的地。创建的流的指向既可以作为源也可以作为目的地。构造方法构造方法:RandomAccessFile(StringRandomAccessFile(String name,String mode);name,String mode);RandomAccessFile(FileRandomAccessFile(File file,String mode);file,String mode);相关方法:相关方法:seek(long a)seek(long a)定位RandomAccessFile流的读写位置 getFilePointergetFilePointer()()获取流的当前读写位置 例子例子8(8(把几个把几个intint型整数写入到一个名字为型整数写入到一个名字为tom.dattom.dat文件文件 )readLinereadLine()()方方法法在在读读取取含含有有非非ASCIIASCII字字符符的的文文件件时时出出现现“乱乱码码”现现象象的的方方法:法:1 1读取读取 String String strstr=in.readLinein.readLine();();2 2用用“iso-8859-1iso-8859-1”重新编码重新编码 byte b=str.getBytes(iso-8859-1);byte b=str.getBytes(iso-8859-1);3 3使用当前机器的默认编码将字节数组转化为字符串使用当前机器的默认编码将字节数组转化为字符串 String content=new String(b);String content=new String(b);例子例子9 9(使用使用readLinereadLine()()读取文件读取文件)第 页10.7 数组流数组流 1 1字节数组流字节数组流 字字 节节 数数 组组 输输 入入 流流 ByteArrayInputStreamByteArrayInputStream和和 字字 节节 数数 组组 输输 出出 流流ByteArrayOutputStreamByteArrayOutputStream分别使用字节数组作为流的源和目标。分别使用字节数组作为流的源和目标。ByteArrayInputStreamByteArrayInputStream构造方法及构造方法及常用方法常用方法 ByteArrayInputStream(byteByteArrayInputStream(byte bufbuf););ByteArrayInputStream(byteByteArrayInputStream(byte buf,intbuf,int offset,intoffset,int length);length);public public intint read();read();顺序地从源中读出一个字节 public public intint read(byte read(byte b,intb,int off,intoff,int lenlen););顺序地从源中读出参数len指定的字节数 ByteArrayOutputStreamByteArrayOutputStream流流构造方法及构造方法及常用方法常用方法 ByteArrayOutputStreamByteArrayOutputStream();();ByteArrayOutputStream(intByteArrayOutputStream(int size);size);public void public void write(intwrite(int b);b);顺序地向缓冲区写入一个字节 public public void void write(byte write(byte b,intb,int off,intoff,int lenlen););将参数b中指定的len个字节顺序地写入缓冲区 public byte public byte toByteArraytoByteArray();();返回输出流写入到缓冲区的全部字节 2字符数组字符数组 CharArrayReaderCharArrayReader和和CharArrayWriterCharArrayWriter类类是是字字符符数数组组流流,使使用用字字符符数数组组作作为为流流的的源和目源和目标标。例子例子10 10 向内存(输出流的缓冲区)写入字符串向内存(输出流的缓冲区)写入字符串 。第 页10.8 数据流数据流 DataInputStreamDataInputStream和和DataOutputStreamDataOutputStream类类创创建建的的对对象象称称为为数数据输入流和数据输出流。据输入流和数据输出流。构造方法构造方法:DataInputStreamDataInputStream(InputStreamInputStream inin)创创建建的的数数据据输输入入流流指指向向一个由参数一个由参数inin指定的底层输入流指定的底层输入流 DataOutputStreamDataOutputStream(OutnputStreamOutnputStream outout)创创建建的的数数据据输输出出流流指向一个由参数指向一个由参数outout指定的底层输出流指定的底层输出流例子例子1111 写几个写几个JavaJava类型的数据到一个文件。类型的数据到一个文件。例子例子1212 将字符串加密后写入文件,如图将字符串加密后写入文件,如图10.610.6所示。所示。第 页10.9 对象流对象流 ObjectInputStreamObjectInputStream和和ObjectOutputStreamObjectOutputStream类类创创建建的的对对象象称称为对象输入流和对象输出流。为对象输入流和对象输出流。它的构造方法是:它的构造方法是:ObjectInputStream(InputStreamObjectInputStream(InputStream in)in)ObjectOutputStream(OutputStreamObjectOutputStream(OutputStream out)out)相关方法:相关方法:writeObject(ObjectwriteObject(Object objobj)将一个对象将一个对象obj写入到一个文件写入到一个文件 readObjectreadObject()()读取一个对象到程序中读取一个对象到程序中 所所谓谓序序列列化化:一一个个类类如如果果实实现现了了Serializable接接口口,那那么么这这个个类创建的对象就是所谓序列化的对象。类创建的对象就是所谓序列化的对象。例子例子1313 Example10_13.javaExample10_13.java ,TV.javaTV.java,使使用用对对象象流流读读写写TVTV类类创创建建的的对对象象,效果如图效果如图10.710.7所示。所示。第 页10.10 序列化与对象克隆序列化与对象克隆 如如果果一一个个“复复制制品品”实实体体的的变变化化不不会会引引起起原原对对象象实实体体发发生生变变化化,反反之之亦亦然然。这这样样的的复复制制品品称称为为原原对对象象的的一一个克隆对象或简称克隆。个克隆对象或简称克隆。一一个个对对象象调调用用clone()方方法法就就可可以以获获取取该该对对象象的的克克隆隆对象。对象。对对象象输输入入流流通通过过对对象象的的序序列列化化信信息息来来得得到到当当前前对对象象的一个克隆。的一个克隆。例例子子14 14(单单击击“写写出出对对象象”按按扭扭将将标标签签写写入入到到内内存存,单单击击“读读入入对对象象”按扭按扭读读入入标签标签的克隆的克隆对对象象)第 页10.11 使用使用ScannerScanner解析文件解析文件 使用使用ScannerScanner类和正则表达式来解析文件。类和正则表达式来解析文件。1 1使用默认分隔标记解析文件使用默认分隔标记解析文件 创建创建ScannerScanner对象,并指向要解析的文件对象,并指向要解析的文件,例如:例如:File file=new File(hello.java);File file=new File(hello.java);Scanner sc=new Scanner(file);Scanner sc=new Scanner(file);scsc将空白作为分隔标记将空白作为分隔标记 2 2使使用用正正则则表表达达式式作作为为分分隔隔标标记记解解析析文文件件:创创建建Scanner对对象象,指指向向要要解解析析的的文文件件,并并使使用用useDelimiter方法指定正则表达式作为分隔标记,例如方法指定正则表达式作为分隔标记,例如:相关方法相关方法 next()next()依次返回file中的单词 hasNexthasNext()()判断file最后一个单词是否已被next()方法返回.例题例题1515 解析文件解析文件cost.txtcost.txt中的全部消费中的全部消费 File file=new File(hello.java);File file=new File(hello.java);Scanner sc=new Scanner(file);Scanner sc=new Scanner(file);sc.useDelimitersc.useDelimiter(正则表达式正则表达式););scsc将正则表达式作为分隔标记将正则表达式作为分隔标记 相关方法相关方法 next()next()依次返回file中的单词 hasNexthasNext()()判断file最后一个单词是否已被next()方法返回 例子例子16 解析解析student.txt文件中的学生成绩文件中的学生成绩第 页10.12 文件对话框文件对话框 构构造造方方法法JFileChooserJFileChooser()()创创建建初初始始不不可可见见的的有有模模式式的的文文件件对对话框。然后文件对话框调用下述话框。然后文件对话框调用下述2 2个方法:个方法:showSaveDialog(ComponentshowSaveDialog(Component a);a);showOpenDialog(ComponentshowOpenDialog(Component a);a);都都 可可 以以 使使 得得 对对 话话 框框 可可 见见,只只 是是 呈呈 现现 的的 外外 观观 有有 所所 不不 同同,showSaveDialogshowSaveDialog方方法法提提供供保保存存文文件件的的界界面面,showOpenDialogshowOpenDialog方方法法提提供供打打开开文文件件的的界界面面。上上述述两两个个方方法法中中的的参参数数a a指指定定对对话话框框可可见见时时的的位位置置,当当a a是是nullnull时时,文文件件对对话话框框出出现现在在屏屏幕幕的的中中央央;如如果果组件组件a a不空,文件对话框在组件不空,文件对话框在组件a a的正前面居中显示。的正前面居中显示。例子例子17 Example10_17java,WindowReader.java ,使用文件对话框打开和保存文件 第 页10.13 带进度条的输入流带进度条的输入流 如果读取文件时希望看见文件的读取进度可以使用如果读取文件时希望看见文件的读取进度可以使用javax.swingjavax.swing包提供的输入流类:包提供的输入流类:ProgressMonitorInputStreamProgressMonitorInputStream。它的构造方法是:它的构造方法是:ProgressMonitorInputStream(ConmponentProgressMonitorInputStream(Conmponent c,String c,String s,InputStreams,InputStream););例子例子18 18 第 页10.14 文件锁文件锁 FileLockFileLock、FileChannelFileChannel类类处处理理JavaJava提提供供的的文文件件锁锁功功能能。它它们们分别在分别在java.niojava.nio和和java.nio.channelsjava.nio.channels包中。包中。输入、输出流读写文件时可以使用文件锁。输入、输出流读写文件时可以使用文件锁。RondomAccessFile创创建建的的流流在在读读写写文文件件时时使使用用文文件件锁锁的的步步骤骤如下:如下:1 1先先使使用用RondomAccessFileRondomAccessFile流流建建立立指指向向文文件件的的流流对对象象,该该对对象象的的读读写写属属性性必必须是须是rwrw,例如:例如:RandomAccessFileRandomAccessFile input=new input=new RandomAccessFile(Example.java,rwRandomAccessFile(Example.java,rw););2 2inputinput流流调调用用方方法法getChannelgetChannel()()获获得得一一个个连连接接到到地地层层文文件件的的FileChannelFileChannel对对象(信道),例如象(信道),例如 FileChannelFileChannel channel=channel=input.getChannelinput.getChannel();();3 3信信道道调调用用tryLocktryLock()()或或lock()lock()方方法法获获得得一一个个FileLockFileLock(文文件件锁锁)对对象象,这这一过程也称作对文件加锁,例如:一过程也称作对文件加锁,例如:FileLockFileLock lock=lock=channel.tryLockchannel.tryLock();();例子例子19 19(Example10_19.javaExample10_19.java ,WindowFileLock.javaWindowFileLock.java )第 页10.15 应用举例应用举例 1.标准化考试标准化考试标准化试题文件的格式要求如下:每道题目提供A、B、C、D四个选择(单项选择)。两道题目之间是用减号(-)尾加前一题目的答案分隔(例如:-D-)。1.北京奥运是什么时间开幕的?A.2008-08-08 B.2008-08-01 C.2008-10-01 D.2008-07-08-A-2.下列哪个国家不属于亚洲?A.沙特 B.印度 C.巴西 D.越南-C-3.2010年世界杯是在哪个国家举行的?A.美国 B.英国 C.南非 D.巴西-C-例子例子20 Example10_20.java,StandardExam.java 每次读取试题文件中的一道题目,并等待用户回答,用户做完全部题目后,程序给出用户的得分 第 页2.通讯录通讯录 下面的例子21(Example10_21.java,InputArea.java,CommFrame.java)使用RandomAccessFile流实现一个通讯薄的录入与显示系统,其中的InputArea.java源文件中的类负责通讯薄信息的录入,CommFram窗体组合了InputArea类的实例。通讯录效果如图10.13、10.14。第 页3.简单的简单的JavaJava集成开发环境(集成开发环境(IDEIDE)例例子子22(Example10_22.java,JDKWindow.java,CompileDialog.java,RunDialog.java)是一个用于编译和运行java程序的小软件(代替在命令行窗口运行javac.exe和java.exe),即使用GUI程序来编译、运行Java应用程序.第 页第 页