版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章文件与I/O流回顾线程的概念
线程的开发
线程的状态
线程的同步wait与notifyjava5.0新并发类库本章目标File类的使用I/O分类
字节流
字符流
对象序列化java7新特性:trycatchresource新IO本章结构File类文件与I/O流I/O的分类字节流InputStreamReader字符流过滤流字符流字符编码字节流/字符流节点流/过滤流输入流/输出流FileOutputStream字节流过滤流FileInputStreamOutputStreamWriterNIOFile类java.io.File类代表硬盘上的一个文件或者文件夹java中文件路径的表示方式Windows中表示c:\suns.txtJava中表示c:\\suns.txtc:/sun.txtFile类File类的构造方法构造方法File类没有无参构造方法File(Stringpathname)File(Stringparent,Stringchild)File(Fileparent,Stringchild)File类File类的常用方法createNewFile():booleanmkdir()/mkdirs():booleandelete():booleandeleteOnExit():booleanexists():booleanisFile():booleanisDirectory():booleanFile类File类的常见方法getPath():String创建时使用的是相对路径则返回相对路径,反之亦然getName():StringgetParent():StringgetAbsolutePath():String返回绝对路径list():String[]返回目录当前file对象代表的目录下所有文件、文件夹名File类publicclassTestFile1{publicstaticvoidmain(Stringargs[])throwsException{Filef0=newFile("abc.txt");f0.createNewFile();Filef1=newFile("abc/bac");f1.mkdirs();Filef2=newFile("cde","bcd/java.txt");System.out.println(f2.getPath());System.out.println(f2.getParent());System.out.println(f2.getName());System.out.println(f2.getAbsolutePath());Filef5=newFile("c:");System.out.println(f5.isDirectory());//true}}I/OI/O概念
流的概念I/O流的分类输入流输出流字节流字符流节点流过滤流字节流
字节流的概念传输的数据单位是字节,也意味着字节流能够处理任何一种文件
字节流的组成InputStreamOutputStreamFileInputStream字节输入流FileInputStream常用方法FileInputStream(Stringfilename)FileInputStream(Filefile)intread()注意这里返回值的类型是int,指读取的内容intread(byte[]buf)读取内容填充到buf中,返回读取的长度close()FileInputStream字节输入流publicclassTestInputStream1{publicstaticvoidmain(Stringargs[])throwsException{InputStreamis=newFileInputStream("oracle.txt");System.out.println(is.read());//65System.out.println(is.read());//66System.out.println(is.read());//67System.out.println(is.read());//-1is.close();}}FileInputStream字节输入流publicclassTestInputStream2{publicstaticvoidmain(Stringargs[])throwsException{InputStreamis=newFileInputStream("oracle.txt");intlen=0;while((len=is.read())!=-1){charc=(char)len;System.out.println(c);}}}FileInputStream字节输入流intread(byte[]bs)publicclassTestInputStream{publicstaticvoidmain(Stringargs[])throwsException{InputStreamfin=newFileInputStream("oracle.txt");byte[]bs=newbyte[6];intlen=0;while((len=fin.read(bs))!=-1){for(inti=0;i<len;i++){ System.out.print((char)bs[i]);}System.out.println();}fin.close();}}FileInputStream字节输入流intread(byte[]b,intoff,intlen)从输入流中读取(最大)len个字节,填充到数组b中,从b的off索引处开始填充。FileOutputStream字节输出流FileOutputStream常用方法FileOutputStream(Stringpath)FileOutputStream(Filefile)close()voidwrite(intv)voidwrite(byte[]bs)voidwrite(byte[]bs,intoff,intlen)FileOutputStream字节输出流publicclassTestOutputStream{publicstaticvoidmain(Stringargs[])throwsException{Stringhello="HelloWorld";byte[]bs=hello.getBytes();FileOutputStreamfout=newFileOutputStream("test.txt");fout.write(bs);fout.close();}}FileOutputStream字节输出流向文件中追加内容的方式FileOutputStream(Stringpath,booleanappend)FileOutputStream(Filefile,booleanappend)publicclassTestOutputStream{publicstaticvoidmain(Stringargs[])throwsException{Stringhello="HelloWorld";byte[]bs=hello.getBytes();FileOutputStreamfout=newFileOutputStream("test.txt",true);fout.write(bs);fout.close();}}异常处理-1
异常处理publicclassTestInputStream1{publicstaticvoidmain(Stringargs[]){FileInputStreamfin=null;try{fin=newFileInputStream("abc.txt");byte[]bs=newbyte[6];intlen=0;while((len=fin.read(bs))!=-1){for(inti=0;i<len;i++){ System.out.print((char)bs[i]);} System.out.println();}}catch(Exceptione){ e.printStackTrace();}finally{
//省略代码}}}异常处理-2publicclassTestInputStream1{publicstaticvoidmain(Stringargs[]){FileInputStreamfin=null;try{
//省略代码}catch(Exceptione){ e.printStackTrace();}finally{if(fin!=null){try{ fin.close();}catch(IOExceptione){ e.printStackTrace();}}}}}异常处理-3Java7的新特性:trycatchresource将需要关闭的资源在try后边的括号中定义,这些资源会自动关闭,无需在finally块中手动调用close()方法,也无需处理关闭资源时的异常。只要是实现java.io.Closeable接口的类,都可以放到try后边的括号中实例化,最后这些资源都会被自动关闭。publicclassTestInputStream2{publicstaticvoidmain(String[]args){try(FileInputStreamin=newFileInputStream("oracle.txt")){byte[]buf=newbyte[6];intlen=-1;while((len=in.read(buf))!=-1){for(inti=0;i<len;i++){ System.out.println((char)buf[i]);}}}catch(Exceptione){ e.printStackTrace();}}}过滤流DataStreamDataInputStreamreadXxx();DataOutputStreamwriteXxx();
过滤流的开发步骤创建节点流基于节点流创建过滤流读/写数据关闭外层流过滤流//创建节点流FileOutputStreamfout=newFileOutputStream("pi.dat");//封装过滤流DataOutputStreamdout=newDataOutputStream(fout);//写数据dout.writeDouble(3.14);//关闭外层流dout.close();//创建节点流FileInputStreamfin=newFileInputStream("pi.dat");//封装过滤流DataInputStreamdin=newDataInputStream(fin);//读数据doublepi=din.readDouble();//关闭外层流din.close();System.out.println(pi);过滤流BufferedStreamBufferedInputStreamBufferedOutputStreampublicclassTestBufferedStream{publicstaticvoidmain(Stringargs[])throwsException{Stringdata="HelloWorld";byte[]bs=data.getBytes();//创建节点流FileOutputStreamfout=newFileOutputStream("test.txt");//封装过滤流BufferedOutputStreambout=newBufferedOutputStream(fout);//写数据bout.write(bs);//关闭外层流bout.close();//bout.flush();}}对象序列化ObjectStreamObjectInputStreamObjectOutputStreamObjectStream特点writeObject()readObject()
对象序列化把Java对象转换为字节序列的过程称为对象的序列化。对象的反序列化把字节序列恢复为Java对象的过程称为对象的反序列化。对象序列化java.io.Serializable接口classStudentimplementsSerializable{Stringname;intage;publicStudent(Stringname,intage){=name;this.age=age;}}对象序列化Studentstu1=newStudent("tom",18);Studentstu2=newStudent("jerry",18);FileOutputStreamfout=newFileOutputStream("stu.dat");ObjectOutputStreamoout=newObjectOutputStream(fout);oout.writeObject(stu1);oout.writeObject(stu2);oout.close();对象序列化FileInputStreamfin=newFileInputStream("stu.dat");ObjectInputStreamoin=newObjectInputStream(fin);Students1=(Student)oin.readObject();Students2=(Student)oin.readObject();oin.close();System.out.println(+""+s1.age);System.out.println(+""+s2.age);对象序列化transient关键字标注的属性不会被序列化静态的属性不会被序列化
序列化时注意事项如果一个对象的属性又是一个对象,则要求这个属性对象也实现了Serializable接口字符编码字符编码(Characterencoding)、字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数串行、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的编码规范(字符集)ASCII:长度是一个字节,共8位,最多可以表示256个字符ISO-8859-1:通常叫做Latin-1,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列GB2312/GBK:汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的UTF-8:1到6个字节变长编码,可以用来表示/编码所有字符编码:将字符转换为字节;解码:将字节转换为字符乱码问题编码时采用一种字符集,但是解码时使用了其他的字符集字符编码Stringoname="测试";byte[]bs=oname.getBytes("GBK");Stringdname=newString(bs,"GBK");System.out.println(dname);//测试Stringoname="测试";byte[]bs=oname.getBytes("GBK");Stringdname=newString(bs,"UTF-8");System.out.println(dname);//????字符编码乱码的解决成功的情况publicclassTestEncoder3{publicstaticvoidmain(String[]args)throwsException{Stringstr="测试";byte[]bytes=str.getBytes("GBK");//使用错误的字符编码解码StringerrorStr=newString(bytes,"iso-8859-1");System.out.println(errorStr);//使用错误的字符编码还原回byte[]byte[]bytes2=errorStr.getBytes("iso-8859-1");//再用正确的字符编码来解码,成功解决乱码问题StringrightStr=newString(bytes2,"GBK");System.out.println(rightStr);}}字符编码乱码的解决失败的情况publicclassTestEncoder4{publicstaticvoidmain(String[]args)throwsException{Stringstr="测试";byte[]bytes=str.getBytes("GBK");//使用错误的字符编码解码StringerrorStr=newString(bytes,"utf-8");System.out.println(errorStr);//使用错误的字符编码还原回byte[]byte[]bytes2=errorStr.getBytes("utf-8");//再用正确的字符编码来解码,这里无法解决乱码问题,原因是utf-8是变长的字符编码StringrightStr=newString(bytes2,"GBK");System.out.println(rightStr);}}字符流
字符流的组成ReaderWriter字符流不推荐使用,无法指定字符编码
FileReaderFileReader(StringfileName)close()intread(char[]cbuf)
FileWriterFileWriter(StringfileName)close()write(Stringvalue)字符流InputStreamReader和OutputStreamWriter特点:可以把一个字节流转换成一个字符流
在转换时可以执行编码方式InputStreamReaderInputStreamReader(InputStreamis)InputStreamReader(InputStreamis,StringcharSet)intread(char[]cbuf)字符流OutputStreamWriterOutputStreamWriter(OutputStreamis)OutputStreamWriter(nOuputStreamis,StringcharSet)write(Stringvalue)字符流publicclassTestInputStreamReader{publicstaticvoidmain(Stringargs[])throwsException{InputStreamis=newFileInputStream("oracle.txt");InputStreamReaderir=newInputStreamReader(is);char[]value=newchar[1024];intlen=0;while((len=ir.read(value))!=-1){for(inti=0;i<len;i++){charc=value[i];System.out.print(c);}System.out.println();}}}字符流过滤流BufferedReader字符过滤流提供了缓冲功能可以一行一行的读取内容publicStringreadLine()
完整的字符输入流的开发步骤创建节点流利用节点流创建字符流在字符流的基础上封装过滤流读/写数据关闭外层流字符流过滤流publicclassTestBufferedReader{publicstaticvoidmain(Stringargs[])throwsException{InputStreamis=newFileInputStream("oracle.txt");InputStreamReaderir=newInputStreamReader(is);BufferedReaderbr=newBufferedReader(ir);Stringvalue=null;while((value=br.readLine())!=null){ System.out.println(value);}}}字符过滤流PrintWriter字符过滤流提供了缓冲功能可以一行一行的输出内容println();字符过滤流
第一种用法,比较灵活的方式1.将新内容追加到文件中2.指定字符编码是utf-8publicclassTestPrinterWriter1{publicstaticvoidmain(String[]args){try(OutputStreamoutput=newFileOutputStream("abc.txt",true);Writerwriter=newOutputStreamWriter(output,"utf-8");PrintWriterprintWriter=newPrintWriter(writer);){ printWriter.println("Hello");}catch(Exceptione){ e.printStackTrace();}}}字符过滤流
第二种用法:比较简单的方式publicclassTestPrinterWriter2{publicstaticvoidmain(String[]args){try( PrintWriterprintWriter=newPrintWriter("abc.txt","utf-8");){ printWriter.println("Hello李某某2");}catch(Exceptione){ e.printStackTrace();}}}java7新特性:trycatchresource
为了释放资源,打开的流都需要在finally块中关闭,java7之前相当繁琐java7新特性:trycatchresourcejava7可以对实现了Closable接口的类使用trycatchresourcepublicclassTestBufferReader{publicstaticvoidmain(String[]args){try(FileInputStreamfis=newFileInputStream("abc.txt");InputStreamReaderreader=newInputStreamReader(fis,"UTF-8");BufferedReaderbf=newBufferedReader(reader);){StringfirstLine=bf.readLine();System.out.println(firstLine);}catch(IOExceptione){ e.printStackTrace();}}}Properties类主要用于读取项目的配置文件,配置文件以.properties结尾的文件和xml文件PropertiesProperties()Properties(Propertiesdefaults)常用方法voidload(InputStreaminStream)StringgetProperty(String
key)Properties类创建pertiesmykey=myValuename=javaaddress=\u5317\u4EACProperties类publicclassTestProperties1{publicstaticvoidmain(String[]args)throwsException{Propertiesproperties=newProperties();InputStreamis=TestProperties.class.getClassLoader().getResourceAsStream("perties");properties.load(is);StringmyValue=properties.getProperty("mykey");Stringname=properties.getProperty("name");Stringaddress=properties.getProperty("address");Stringerror=properties.getProperty("error");//没有error这个keySystem.out.println(myValue);//myValueSystem.out.println(name);//javaSystem.out.println(address);//北京System.out.println(error);//null}}读取配置文件Properties类保存数据publicclassTestProperties2{publicstaticvoidmain(String[]args)throwsException{Propertiesproperties=newProperties();InputStreamis=TestProperties1.class.getClassLoader().getResourceAsStream("perties");properties.load(is);URLurl=TestProperties2.class.getClassLoader().getResource("perties");PrintStreamps=newPrintStream(newFile(url.toURI()));//保存数据properties.setProperty("newkey","Hello");properties.setProperty("newkey2","测试");//将属性列表输出到指定的输出流properties.list(ps);}}NIO新IO采用内存映射文件的方式来处理输入/输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件。使用这种方式来进行输入/输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版实习合同模板:实习期间实习成果转化3篇
- 2025版木结构景观清包施工合同示范文本4篇
- 二零二五年度虚拟现实内容创作者免责声明合同范本4篇
- 2025版小型沼气项目设备研发、生产、安装及运营维护合同3篇
- 增值税及其会计处理教学课件
- 2025版新能源汽车动力电池回收利用合同范本4篇
- 2025版小麦种子市场调研与风险评估合同2篇
- 2025版学校临时教师聘用合同实施细则3篇
- 二零二五版幕墙工程风险管理与保险合同4篇
- 体育设施工程体育场地围网施工考核试卷
- 定额〔2025〕1号文-关于发布2018版电力建设工程概预算定额2024年度价格水平调整的通知
- 2024年城市轨道交通设备维保及安全检查合同3篇
- 【教案】+同一直线上二力的合成(教学设计)(人教版2024)八年级物理下册
- 湖北省武汉市青山区2023-2024学年七年级上学期期末质量检测数学试卷(含解析)
- 单位往个人转账的合同(2篇)
- 科研伦理审查与违规处理考核试卷
- GB/T 44101-2024中国式摔跤课程学生运动能力测评规范
- 高危妊娠的评估和护理
- 2024年山东铁投集团招聘笔试参考题库含答案解析
- 2023年高考全国甲卷数学(理)试卷【含答案】
- 新教材教科版五年级下册科学全册课时练(课后作业设计)(含答案)
评论
0/150
提交评论