《第8章入输出流》由会员分享,可在线阅读,更多相关《第8章入输出流(21页珍藏版)》请在金锄头文库上搜索。
1、清华大学出版社清华大学出版社察赘松芽稳斡链题揍篓铜轴颓桩扇芽尸拘僳羚品赔斩倡朝丽建区鸭暮拎肆第8章入输出流第8章入输出流 JavaEE基础教程基础教程 第第8 8章章 输入输出流输入输出流8.1 获取文件和目录的属性获取文件和目录的属性8.2 Java中的中的I/O流流8.3 字节流字节流8.4 字符流字符流扑揖业懊烩男群窝俭餐谤自派势幢剪挪滴娟候钉奢譬颊毗种却杰眉先瀑韩第8章入输出流第8章入输出流 通过允许程序读取文件的内容或者向文件中写入内容,可以使程序的开发更加灵活。要从文件、内存或网络读取信息,程序必须打开源的一个流;同样,通过打开至目标的一个流,并按顺序写入信息,程序可以向文件写入信
2、息。 娱逢播怀俗魂务滦恶无篷休少纫鹃颁映奴对哺鲍伟耀酉顶们爵梗钟锻灵痒第8章入输出流第8章入输出流9/4/20242 2Java EEJava EE基础教程基础教程8.1 获取文件和目录的属性获取文件和目录的属性 在在JavaJava语言中,提供了获取和修改文件语言中,提供了获取和修改文件/ /目录属性的类目录属性的类java.io.Filejava.io.File。FileFile类的使用是与平台无关的,适用于不同类的使用是与平台无关的,适用于不同的文件系统。在程序中,通过创建的文件系统。在程序中,通过创建FileFile类的对象来代表一个类的对象来代表一个文件或目录,利用这个对象可以对文件
3、或目录的属性进行有文件或目录,利用这个对象可以对文件或目录的属性进行有关操作。关操作。 表表8-18-1列举了列举了FileFile类的主要方法和说明。类的主要方法和说明。 返回扣秩岛队瘸键祭笆椽耀告豪蚁唉嘴荚弦胡钓篮讶秩勇疆涣妓彤愚节妻韩盆第8章入输出流第8章入输出流9/4/20243 3Java EEJava EE基础教程基础教程 例8-1对文件和目录的操作程序清单:ch08FileAndDirectoryTest.javaimport java.io.File;public class FileAndDirectoryTest public static void main(String
4、 args) String filename=testFile;File f1=new File(filename); /ASystem.out.println(filename+是否存在:+f1.exists();System.out.println(filename+是文件吗:+f1.isFile();System.out.println(filename+最后修改时间:+f1.lastModified();System.out.println(filename+文件大小:+f1.length();String direname=testDire;File f2=new File(dire
5、name); /BSystem.out.println(direname+的绝对路径:+f2.getAbsolutePath();if(f2.isDirectory()/CString fileList=f2.list();/DSystem.out.println(direname+目录中的文件和目录包括:);for(int i=0;i0)String s=new String(b,0,rs);/DSystem.out.print(s);rs=fis.read(b, 0,10);fis.close();/Ecatch(IOException e)e.printStackTrace(); 如果在
6、C盘中存在该文件,文件的内容为“This is you English book!”,则程序的运行结果如下所示:This is you English book! 夷屁娟彪拙穴遥厌邹输裴逻撂猴抢亢庆拾苹弓赃呕芳秦炒鲜松颈挣术糯忿第8章入输出流第8章入输出流9/4/20241010Java EEJava EE基础教程基础教程在使用在使用FileInputStreamFileInputStream类进行文件读取时,需要注意以下几点:类进行文件读取时,需要注意以下几点:1 1)待读取的文件一定要存在,否则会出现异常;)待读取的文件一定要存在,否则会出现异常;2 2)文件的路径可以采用绝对路径和相对路
7、径两种,例题中采用的是)文件的路径可以采用绝对路径和相对路径两种,例题中采用的是绝对路径;编程时,可以把待读取的文件放在程序文件所在的项目绝对路径;编程时,可以把待读取的文件放在程序文件所在的项目下,通过下,通过FileInputStream fis=new FileInputStream(in.txt);FileInputStream fis=new FileInputStream(in.txt); 创建创建FileInputStreamFileInputStream实例对象,有利于提高程序的可移植性;实例对象,有利于提高程序的可移植性;3 3)FileInputStreamFileInpu
8、tStream类既可以用来读取文本文件,也可以读取二进制类既可以用来读取文本文件,也可以读取二进制文件,比如:图像、声音等;文件,比如:图像、声音等;4 4)在不需要使用时,要及时关闭流对象,释放与它关联的所有系统)在不需要使用时,要及时关闭流对象,释放与它关联的所有系统资源。资源。终氓巨点烈像侗颅疫闻霹前镣罐闪蠕麦杰嫌溉敞庄裳拌姥彬另础拙弱劳唱第8章入输出流第8章入输出流9/4/20241111Java EEJava EE基础教程基础教程8.3.2 FileOutputStream8.3.2 FileOutputStream流流 FileOutputStream FileOutputStre
9、am类是类是OutputStreamOutputStream类的子类。它能类的子类。它能够实现以字节形式将数据写入文件中。该类的所有方法都够实现以字节形式将数据写入文件中。该类的所有方法都是从是从OutputStreamOutputStream类继承并重写的。在创建该类的实例对类继承并重写的。在创建该类的实例对象时,与象时,与FileInputStreamFileInputStream类相似,文件可以使用相对路径类相似,文件可以使用相对路径和绝对路径;但与和绝对路径;但与FileInputStreamFileInputStream类的区别是:如果文件类的区别是:如果文件不存在,则创建一个新的文
10、件;如果文件存在,则把原来不存在,则创建一个新的文件;如果文件存在,则把原来的文件删除,然后再创建一个新的文件。的文件删除,然后再创建一个新的文件。鸳亢佯嚼晾妓智镊挛公兼晦尉商跃摆棒怪寸宰夺阔倪仓锈六果喜襄囊隔拉第8章入输出流第8章入输出流9/4/20241212Java EEJava EE基础教程基础教程例8-3 将文件notepad.exe的内容拷贝到note.exe文件中程序清单:ch08FileOutExample.javaimport java.io.*;public class FileOutExample public static void main(String args)
11、int rs;byte b=new byte10;tryFileInputStream fis=new FileInputStream(notepad.exe);FileOutputStream fos=new FileOutputStream(note.exe);System.out.println(开始拷贝文件,请稍候.);rs=fis.read(b, 0,10);/Awhile(rs0)fos.write(b, 0,10);rs=fis.read(b, 0,10);/BSystem.out.println(文件拷贝结束,谢谢!);fis.close();/Cfos.close();/Dc
12、atch(IOException e) e.printStackTrace(); 解璃尔秀妻哲及氮骇傻姚兢处闻鼓考杭雾更鲤渔咀爱役乔涵钩汉角肢非鲁第8章入输出流第8章入输出流9/4/20241313Java EEJava EE基础教程基础教程 在上面的程序中,文件“notepad.exe”是Windows系统提供的的记事本应用程序,系统运行这个程序可以创建文本文件。分析上面的程序可知:首先根据提供的两个文件创建字节输入流对象fis和字节输出流对象fos,建立与磁盘文件的连接;如果文件“notepad.exe”文件不存在,会引发异常;不管“note.exe”文件是否存在,fos对象的创建都不会受
13、影响。从代码行A至B行,首先通过流对象fis从文件“notepad.exe”中读取10个字节的内容,然后通过fos对象的write()方法,将内容写入与fos对象关联的“note.exe”文件中,直到读至文件的尾部。代码行C和D关闭两个流对象,释放它们占用的系统资源,同时将缓冲区中的内容保存到“note.exe”文件中。程序执行后,运行“note.exe”文件,发现它具有与“notepad.exe”文件同样的功能,说明文件拷贝是正确的。 需要指出的是,用FileOutputStream类执行写文件操作时,只能从文件的开始部分写入,不能实现追加写入的功能;在完成相关操作后一定要及时关闭流对象。如
14、果需要创建的文件已经存在,但它是一个目录,而不是一个常规文件,则抛出异常;或者该文件不存在,但无法创建它,抑或因为其他某些原因而无法打开它,也会抛出异常。另外,使用该类执行写入操作时,并不区分写入的是什么类型的文件。 晦荆坷蛹熟辑穗胞樊蓄锤钵毙渺敖饰喊幻巷狗狞律蝇朴俊预容长燃尊穴宦第8章入输出流第8章入输出流9/4/20241414Java EEJava EE基础教程基础教程8.4 字符流字符流 前面介绍的前面介绍的FileInputStreamFileInputStream类和类和FileOutputStreamFileOutputStream类类只能处理普通的字节流。采用这种流在处理只能处
15、理普通的字节流。采用这种流在处理1616位的位的UnicodeUnicode码表示的字符流时很不方便,容易引起错误。码表示的字符流时很不方便,容易引起错误。java.iojava.io包中包中有专门用于处理字符流的类:有专门用于处理字符流的类:ReaderReader和和WriterWriter等。等。返回拐榆晒滋拾釉才亦臆碟副蒸吼滋愧烙羹集拳堰踏捣蛇谈辟贬渡痞取侩盒齿第8章入输出流第8章入输出流9/4/20241515Java EEJava EE基础教程基础教程 8.4.1 Reader流 该类是用于处理字符输入流类的父类,它是一个抽象类,不能实例化它的对象。表8-4列出了该类的常用方法。8
16、.4.2 Writer流 该类是处理字符输出流的父类,Writer类定义了写入字符和字符数组的方法,与Reader类、InputStream类相似,在创建对象时会自动打开流,通过显式调用close()方法关闭流。表8-5列举了该类的常用方法。 碉矣棉仿哉辑羡扶怔馈寇盂彻蜗牙可酞讥氦辨颜搐晋糊穿瞩屎中指露俞淖第8章入输出流第8章入输出流9/4/20241616Java EEJava EE基础教程基础教程8.4.3 FileReader8.4.3 FileReader流流该类是该类是ReaderReader类的子类,它实现了从文件中读取字符数据,是文件字符输入流。类的子类,它实现了从文件中读取字符
17、数据,是文件字符输入流。与与FileInputStreamFileInputStream类相似,在创建类相似,在创建FileReaderFileReader对象时,如果给定路径上不存对象时,如果给定路径上不存在所需的文件,则会出现异常。在所需的文件,则会出现异常。例例8-4 8-4 将将WordWord文件文件“java.txtjava.txt”读出并输出到控制台。读出并输出到控制台。程序清单:程序清单:ch08ReaderExample.javach08ReaderExample.javaimport java.io.*;import java.io.*;public class Reade
18、rExample public class ReaderExample public static void main(String args) public static void main(String args) try try File f=new File(java.txt);File f=new File(java.txt);FileReader fr=new FileReader(f); /AFileReader fr=new FileReader(f); /Aint len=fr.read();int len=fr.read(); /B /Bwhile(len=0)while(
19、len=0)System.out.print(char)len);System.out.print(char)len);len=fr.read();len=fr.read(); 扼拎籍属脏凤娘滑瓣胯啃紊奠楚庆耶痹宜淖墅哩座钞撰挚釜艰愤逮叛策猾第8章入输出流第8章入输出流9/4/20241717Java EEJava EE基础教程基础教程fr.close();fr.close(); /C /C catch (FileNotFoundException e) catch (FileNotFoundException e) e.printStackTrace();e.printStackTrace(
20、); catch (IOException e) catch (IOException e) e.printStackTrace();e.printStackTrace(); 假定文件假定文件“java.txtjava.txt”的内容是:的内容是:“Java is a good OOP language.Java is a good OOP language. Java Java是一门面向对象的语言。是一门面向对象的语言。” 则执行上述程序后,输出的结果与上面的内容一致。说明用上述程序可以同则执行上述程序后,输出的结果与上面的内容一致。说明用上述程序可以同时实现对英文和汉字的读取和显示。该程序
21、的时实现对英文和汉字的读取和显示。该程序的A A行创建了字符输入流对象行创建了字符输入流对象frfr,建,建立文件立文件“java.txtjava.txt”与流对象的连接,打开与流对象的连接,打开“java.txtjava.txt”文件。然后通过文件。然后通过B B行代行代码在文件中读取一个字符,如果已经读到文件尾则变量码在文件中读取一个字符,如果已经读到文件尾则变量“lenlen”的值为的值为-1-1,通过,通过判断判断“lenlen”的值进行控制。的值进行控制。C C行代码关闭了该流对象,释放了该对象占用的所有行代码关闭了该流对象,释放了该对象占用的所有系统资源。系统资源。啸消诛壬慈浇抨浸
22、悬惫晴鸦酱揭悲蚤向顶兢淡屉罪刘道试抬嗓脓感辱猫历第8章入输出流第8章入输出流9/4/20241818Java EEJava EE基础教程基础教程8.4.4 FileWriter流该类是Writer类的子类,实现了将字符数据写入文件的功能,是文件字符输出流。如果需要写入的文件不存在,则会新建该文件,否则会删除旧文件,建立新的文件。下面通过例题介绍该类的使用。例8-5 创建5个2000之内的随机数,然后存储到文件“rand.txt”中。程序清单:ch08WriterExample.javaimport java.io.*;import java.util.Random;public class W
23、riterExample public static void main(String args) Random rand=new Random(); /Atry FileWriter fw=new FileWriter(rand.txt); /Bint rs;for(int i=0;i5;i+)rs=rand.nextInt(2000); /Cfw.write(String.valueOf(rs); /D恼倪冉砷仰烹嘻沂病椅溜垫姜佯琅奢郡掘客土赠逛缅几拾讼各泥篱叫蚂臼第8章入输出流第8章入输出流9/4/20241919Java EEJava EE基础教程基础教程fw.write(JavaEE
24、教程); /Efw.close(); /F catch (IOException e) e.printStackTrace(); 该程序代码使用了Random类产生随机数,使用了类FileWriter进行文件的写入。在代码行A行创建一个java.uti.Random对象,C行代码使用该类的nextInt()方法产生一个小于2000的随机数;在代码行B创建了一个FileWriter类的对象,D行代码利用前面介绍的方法将产生的随机整数转换为字符串写入文件中;代码行E直接在文件中写入字符串;代码行F关闭流对象,将缓冲区的内容写入文件。 亲峦氖骏懦越撤优蹲藻殿兆汾揣疏至捞溶苦枣奄卧萄瓮糟烹酪歌甚货冀筷第8章入输出流第8章入输出流9/4/20242020Java EEJava EE基础教程基础教程The End瘟溅层蹭衔共测关垫蚂皱筷凉袍违看治媒捷房趴余访傍侮视被剩钟身飞昼第8章入输出流第8章入输出流9/4/20242121Java EEJava EE基础教程基础教程