File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别_第1页
File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别_第2页
File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别_第3页
File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别_第4页
File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、 l 使用 JJava 操作文本本文件的方方法详解 httpp:/art/37377/2000411008/52236277_1.hhtml l FileeReadder 是是什么类?和 FiileInnputSStreaam 有什什么不同? httpp:/m/askk2/assk1077572.htm 自己己的整理和和领会: 引言言: C语言只需需要一个FFile*就可以了了,与C不不同,jaava有一一系列流类类型,其数数量超过660种。类类库的设计计者声称:“有足够的理由由为用户提提供丰富的的流类型的的选择:这这样做可以以减少程序序的错误。”例如,在在C语言种种,许多人人认为“将输出流写

2、写入一个只只读模式的的文件”是很常见见的错误。(事实上上,这并不不常见。)我们认为在在C语语言中,流流接口设计计者避免程程序出错的的主要“工具”是小心谨谨慎的态度度,在jaava语言言中更是如如此。流库的的高度复杂杂性迫使程程序设计人人员谨小慎慎微。 1. Fille类 1 ) FFile 类介绍( corre jaava 6388 页) File 类封装了了对用户机机器的文件件系统进行行操作的功功能。例如如,可以用用 Fille 类获获得文件上上次修改的的时间移动动,或者对文件件进行删除除、重命名名。换句话话说,流类类关注的是是文件内容容,而 FFile 类关注的的是文件在在磁盘上的的存储。

3、 File 类的主要要方法有: gettNamee(),ggetCaanoniicalFFile(),laastMoodifiied(),isDDerecctor(),issFilee(),ggetPaath() 等; 2 ) FFile 类与 FFileIInputtStreeam 类类的区别: 流类关注的的是文件内内容,而 Filee 类关注注的是文件件在磁盘上上的存储。 File 不属于文文件流 , 只能代代表一个文文件或是目目录的路径径名而已。 提示:( corre jaava 6399 页) 如果处理文文件或者目目录名,就就应该使用用 Fille 对象象,而不是是字符串。例如, Fi

4、lee 类的 equaals 方方法知道一一些文件系统对对大小写是是敏感的,目目录尾的“ / ”字符无关关紧要。 自己的领会会: FileIInputtStreeam 类类或者 FFileRReadeer 类的的构造函数数有多个,其其中典型的的两个分别别为:一个个使用 FFile 对象为参数;而另另一个使用用表示路径径的 Sttringg 对象作作为参数;自己以前前一直觉得得直接用了了 Strring 指定路径径就可以了,一直不不明白为什什么很多人人都先构造造一个 FFile 对象,现现在终于明明白了,“如果处理理文件或者者目录名,就就应该使用 FFile 对象,而而不是字符符串。”! 2.

5、FiileInnputSStreaam 类 1 ) FFileIInputtStreeam 类类介绍: 以字节为单单位(非 uniccode )的流处处理。字节节序列即:二进制数数据。与编编码无关,不不存在乱码码问题。 FileIInputtStreeam 类类的主要方方法有: Read (), readd ( bbyte b ), rread ( byyte,intt offf,intt lenn ) ,avaiilablle(); 2 ) FFileIInputtStreeam 类类与 FiileReeaderr 类的区区别: 两个类的构构造函数的的形式和参参数都是相相同的,参参数为 FF

6、ile 对象或者者表示路径径的 Sttringg ,它们们到底有何何区别呢? l RReadeers aand WWriteers wwork onlyy on linee bassed ccharaacterr datta, sso pllain textt filles.For aanythhing elsee, yoou MUUST uuse SStreaams. l JJDK5 API: FileIInputtStreeam iis meeant for readding streeams of rraw bbytess succh ass imaage ddata. Forr rea

7、adingg strreamss of chharaccterss, coonsidder uusingg FilleReaader. FileRReadeer iss meaant ffor rreadiing sstreaams oof chharaccterss. Foor reeadinng sttreamms off raww byttes, conssiderr usingg a FFileIInputtStreeam . l FFileIInputtStreeam :以字节流流方式读取取; FiileReeaderr :把文文件转换为为字符流读读入; l InnputSStrea

8、am提供的的是字节流流的读取,而而非文本读读取,这是是和Reaader类类的根本区区别。用RReadeer读取出出来的是chhar数组组或者Sttringg ,使用用InpuutStrream读读取出来的的是bytte数组。l Reeaderr类及其子子类提供的的字符流的的读取chhar(116位,uunicoode编码码),innputSStreaam及其子子类提供字字节流的读取bbyte(88位),所所以FilleReaader类类是将文件件按字符流流的方式读读取,FiileInnputSStreaam则按字字节流的方方式读取文件;InpuutStrreamRReadeer可以将将读如st

9、treamm转换成字字符流方式式,是reeaderr和strream之之间的桥梁梁l 最初Jaava是不不支持对文文本文件的的处理的,为为了弥补这这个缺憾而而引入了RReadeer和Wrriterr两个类。 l FFileIInputtStreeam 类类以二进制制输入 / 输出, I/O 速度快且且效率搞,但但是它的 readd ()方方法读到的是一个字字节(二进进制数据),很很不利于人人们阅读。 l 而而 FilleReaader 类弥补了了这个缺陷陷,可以以以文本格式式输入 / 输出,非非常方便;比如可以以使用 whilee(chh = ffilerreadeer.reead()!=-1

10、 ) 循环来读读取文件;可以使用用 BufffereedReaader 的 reeadLiine() 方法一一行一行的读读取文本。 l 当当我们读写写文本文件件的时候,采采用 Reeaderr 是非常常方便的,比比如 FiileReeaderr , InputtStreeamReeaderr 和 BBuffeeredRReadeer 。其其中最重要要的类是 InpuutStrreamRReadeer ,它它是字节转转换为字符符的桥梁。 你可可以在构造造器重指定定编码的方方式,如果果不指定的的话将采用用底层操作作系统的默默认编码方方式,例如如 GBKK 等。 l FFileRReadeer 与

11、InpuutStrreamRReadeer 涉及及编码转换换 ( 指指定编码方方式或者采采用 oss 默认编编码 ) ,可能在不同的的平台上出出现乱码现现象!而 FileeInpuutStrream 以二进制制方式处理理,不会出出现乱码现现象 . 3 )自己己的领会: l 如如果处理纯纯文本文件件,建议使使用 FiileReeaderr ,因为为更方便,也也更适合阅阅读;但是是要注意编编码问题! l 其他情情况(处理理非纯文本本文件),FFileIInputtStreeam是唯唯一的选择择;FilleInpputSttreamm是进Soockett通讯时会会用到很多,如如将文件流流是Strre

12、am的的方式传向向服务器! 3. FiileReeaderr 类 1) FFileRReadeer 类介介绍: InputtStreeamReeaderr 类的子子类,所有有方法( readd ()等等)都从父父类 InnputSStreaamReaader 中继承而而来; 2) 与与 InpputSttreammReadder 类类的区别: l 自自己的领会会: 该类与它的的父类 IInputtStreeamReeaderr 的主要要不同在于于构造函数数,主要区区别也就在在于构造函函数!从 InputtStreeamReeaderr 的构造造函数中看看到,参数数为 InnputSStreaa

13、m 和编编码方式,可可以看出,当当要指定编编码方式时时,必须使用 InpuutStrreamRReadeer 类;而 FiileReeaderr 构造函函数的参数数与 FiileInnputSStreaam 同,为为 Fille 对象象或表示 paath 的的 Strring ,可以看看出,当要要根据 FFile 对象或者者 Strring 读取一个个文件时,用用 FilleReaader ;我想 FilleReaader 子类的作作用也就在在于这个小小分工吧。 3) 一一般用法: FileRReadeer frr = nnew FFileRReadeer(mming.txt); chhar

14、bufffer = neew chhar11024; innt chh = 00; whhile(ch = frr.reaad()!=-11 ) SSysteem.ouut.prrint(chaar)chh); 4. InnputSStreaamReaader 类 l 以以文本格式式输入 / 输出,可可以指定编编码格式; l 主主要方法: getEnncodiing (),reead(); l 一一般用法: InputtStreeamReeaderr isrr = nnew IInputtStreeamReeaderr(neww FilleInpputSttreamm(miing.ttxt);

15、 whhile(ch = issr.reead()!=-1) SSysteem.ouut.prrint(chaar)chh); 5. BuufferredReeaderr 类 l JJdk5 api : Read textt froom a charracteer-innput streeam, buffferinng chharaccterss so as tto prrovidde foor thhe effficiient readiing oof chharaccterss, arrrayss, annd liines. l BuufferredReeaderr 由Reeaderr类扩

16、展而而来,提供供通用的缓缓冲方式文文本读取,而而且提供了了很实用的的readdLinee,读取分行文文本很适合合,BufffereedReaader是是针对Reeaderr的,不直直接针对文文件,也不不是只针对对文件读取取。l 一般用法法: BuffeeredRReadeer brr = nnew BBuffeeredRReadeer(neew InnputSStreaamReaader(new FileeInpuutStrream(minng.txxt);Strring dataa = nnull;whiile(dataa = bbr.reeadLiine()!=nnull)Syystemm

17、.outt.priintlnn(datta); 6. 总结结以上内容容,得出比比较好的规规范用法: 1) FFile filee = nnew FFile (heello.txt); FileIInputtStreeam iin=neew FiileInnputSStreaam(fiile); 2) FFile filee = nnew FFile (heello.txt); FileIInputtStreeam iin=neew FiileInnputSStreaam(fiile); InputtStreeamReeaderr inRReadeer=neew InnputSStreaamRe

18、aader(in); BuffeeredRReadeer buufReaader=new BufffereddReadder(iinReaader); 3) FFile filee = nnew FFile (heello.txt); FileRReadeer fiileReeaderr=neww FilleReaader(filee); BuffeeredRReadeer buufReaader=new BufffereddReadder(ffileRReadeer); 7.一些写写法的区别别:1)File filee = nnew FFile (heello.txt);FileIInput

19、tStreeam iin=neew FiileInnputSStreaam(fiile);InputtStreeamReeaderr inRReadeer=neew InnputSStreaamReaader(in);BuffeeredRReadeer buufReaader=new BufffereddReadder(iinReaader); 2)FileIInputtStreeam iinnuull;File filee = nnew FFile (heello.txt);in=neew FiileInnputSStreaam(fiile);BuffeeredRReadeer buufRe

20、aader=new BufffereddReadder(nnew IInputtStreeamReeaderr(in); 3)File filee = nnew FFile (heello.txt);BuffeeredRReadeer buufReaader=new BufffereddReadder(nnew IInputtStreeamReeaderr(neww FilleInpputSttreamm(fille);上述两种写写法的微小小区别:a)第二种种方式中把把“FileeInpuutStrream innnull;”定义单独独放在开始始处,说明明下面应该该还有要用用到in对对象变量的

21、的地方;(BBuffeeredRReadeer处用了了)b)第二种种方式没有有定义InnputSStreaamReaader的的对象变量量,直接在在BufffereddReadder的构构造函数中中new一一个,这种方式与与第一种方方式的主要要区别:IInputtStreeamReeaderr对象只使使用一次!这对于在这这里只需要要使用一次次这个InnputSStreaamReaader对对象的应用用来说更好好;无需定定义InpputSttreammReadder的对对象变量,接接收由neew返回的的该对象的的引用,因因为下面的的程序中不不需要这个个InpuutStrreamRReadeer的

22、对象象变量,所所以无需定定义;所以以这种情况况下,第二二种方式比比第一种更更好一些。c)第三种种方式中,典典型的三层层嵌套委派派关系,清清晰看出RReadeer的委派派模式(coreejavaa12章章有图描述述该委派关关系),FFileIInputtStreeam和IInputtStreeamReeaderr都没有定定义变量,nnew生成成的对象都都只是使用用一次。d)三种方方式的区别别也就在于于FileeInpuutStrream和和InpuutStrreamRReadeer对象是是否都只使使用一次,是是否需要定定义它们的的对象变量量,以及个个人的编码码习惯。e)但是要要注意异常常处理,F

23、FileIInputtStreeam(ffile)会抛出NNotFiileFooundEExcepptionn,如果采采用surrrounnd方式(try&catcch)处理理,应该用用第二种方方式,这样样可以用SSysteem.ouut.prrintlln提示文文件未找到到;当然在函数数名后使用用throows EExcepptionn,然后用用第三种方方式也行,但但似乎这适适合有用户户界面的情情况,把异异常抛出在在客户端在在处理。例子:Java操操作文本文文件最初jaava是不不支持对文文本文件的的处理的,为为了弥补这这个缺憾而而引入了RReadeer和Wrriterr两个类,这这两个类都

24、都是抽象类类,Wriiter中中writte(chhar ch,int off,int lenggth),fflushh()和cclosee()方法法为抽象方方法,Reeaderr中reaad(chhar ch,int off,int lenggth)和和closse()方方法是抽象象方法。子子类应该分分别实现他他们。当我们们读写文本本文件的时时候,采用用Readder是非非常方便的的,比如FFileRReadeer,InnputSStreaamReaader和和BufffereddReadder。其其中最重要要的类是IInputtStreeamReeaderr,它是字字节转换为为字符的桥桥梁

25、。你可可以在构造造器重指定定编码的方方式,如果果不指定的的话将采用用底层操作作系统的默默认编码方方式,例如如GBK等等。当使用用FileeReadder读取取文件的时时候。 FiileReeaderr fr = neew FiileReeaderr(miing.ttxt); intt ch = 0; whiile(ch = fr.readd()!=-1 ) SSysteem.ouut.prrint(chaar)chh); 其中rread()方法返返回的是读读取得下个个字符。当当然你也可可以使用rread(charr cch,innt offf,innt leengthh)这和处处理二进制制文件

26、的时时候类似,不不多说了。如果使用用InpuutStrreamRReadeer来读取取文件的时时候whhile(ch = issr.reead()!=-1) SSysteem.ouut.prrint(chaar)chh); 这和FFileRReadeer并没有有什么区别别,事实上上在FilleReaader中中的方法都都是从InnputSStreaamReaader中中继承过来来的。reead()方法是比比较好费时时间的,如如果为了提提高效率我我们可以使使用BufffereedReaader对对Readder进行行包装,这这样可以提提高读取得得速度,我我们可以一一行一行的的读取文本本,使用rr

27、eadLLine()方法。 BuufferredReeaderr br = neew BuufferredReeaderr(neww InpputSttreammReadder(nnew FFileIInputtStreeam(mingg.txtt); Strring dataa = nnull; whiile(dataa = bbr.reeadLiine()!=nnull) SSysteem.ouut.prrintlln(daata); 当你明明白了如何何用Reaader来来读取文本本文件的时时候那么用用Writter写文文件同样非非常简单。有一点需需要注意,当当你写文件件的时候,为为了提高

28、效效率,写入入的数据会会先放入缓缓冲区,然然后写入文文件。因此此有时候你你需要主动动调用fllush()方法。与上面对对应的写文文件的方法法为FilleWriiter fw = neww FilleWriiter(helllo.ttxt); Strring s = helllo wworldd; fw.writte(s,0,s.lenggth(); fw.flussh(); OuttputSStreaamWriiter osw = neew OuutputtStreeamWrriterr(neww FilleOuttputSStreaam(hhelloo2.txxt); osww.wriite

29、(ss,0,ss.lenngth(); osww.fluush(); PriintWrriterr pw = neew PrrintWWriteer(neew OuutputtStreeamWrriterr(neww FilleOuttputSStreaam(hhelloo3.txxt),truue); pw.prinntln(s);不要忘忘记用完后后关闭流!下面是个个小例子,帮帮助新手理理解。其实实有的时候候javaa的IO系系统是需要要我们多记记记的,不不然哪天就就生疏了。测试文件件的内容为为minng.txxthelllo wworldd i llike javaa lannguaggeimporrt jaava.iio.*;publiic cllass TesttFilee2publiic sttaticc voiid maain(SStrinng argss) thhrowss IOEExcepptionn FilleReaader fr =

温馨提示

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

评论

0/150

提交评论