版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java程序设计
项目6Java的I/O流和文件主要内容:一、I/O流类简介二、File类四、随机访问流三、字节类与字符流五、其他流在Java语言中程序所完成的输入和输出操作是以流的形式来实现的。所谓流,是指在计算机的输入与输出之间运动的数据序列。流序列中的数据既可以是未加工的原始的二进制数据,也可以是经过一定编码处理后符合某种格式规定的特定数据。Java程序的输入/输出操作主要针对三种不同的类型:(1)控制台,指的是屏幕输出(在Windows系统下指的是DOS窗口)和键盘输入;(2)文件,针对磁盘文件的读/写操作;(3)网络,通过网络套接字所实现的数据访问。任务1I/O流类简介1、流的基本概念有了流,程序和外界的数据交换都可通过流实现。当程序要从数据源获得数据时,必须在程序和数据源之间建立输入流(如图6-1所示);当程序要把结果输送到数据宿时,必须在程序和数据宿之间建立输出流(如图6-2所示)。任务1I/O流类简介图6-1输入流的图示图6-2输出流的图示流按照处理数据的单位,可以分为字节流和字符流。字节流的处理单位是字节,通常用来处理二进制文件。而字符流的处理单位是字符,因为Java采用Unicode编码,Java字符流处理的即为Unicode字符。在Java语言中数据的输入输出处理都通过对数据流的操作来完成,完成这些操作的类都定义在java.io包中。图6-3所示是java.io包中提供的一些处理数据流和文件的类,它们都是Object类的直接子类。任务1I/O流类简介2、常用输入输出类图6-3常用的Java输入输出类层次结构Java提供了三种构造方法来创建一个文件对象。●File(Stringpath):字符串参数path指明了新创建的File对象对应的磁盘文件或目录名及其路径名。●File(Stringpath,Stringname):第一个参数path表示所对应的文件或目录的绝对或相对路径,第二个参数name表示文件或目录名。●File(Filedir,Stringname):这种构造方法使用另一个已经存在的代表某磁盘目录的File对象作为第一个参数,表示文件或目录的路径,第二个字符串参数表述文件或目录名。
任务2File类1、文件对象创建例6.1创建文件对象。
importjava.io.*;publicclassFileCreate{ publicstaticvoidmain(String[]args) { Filef1=newFile("d:\\java\\FileDemo.java"); Filef2=newFile("d:\\java\\"); Filef3=newFile(f2,"FileDemo1.java"); System.out.println(f1); System.out.println(f3); try{ f1.createNewFile(); f3.createNewFile(); } catch(IOExceptione){} }}程序运行结果为:d:\java\FileDemo.javad:\java\FileDemo1.java任务2File类File对象获得该文件或目录的属性的常用的方法见下表。任务2File类2、文件和目录属性例6.2获取文件和目录的属性。
importjava.io.*;classFileDemo{staticvoidp(Strings){System.out.println(s);}publicstaticvoidmain(Stringargs[]){ Filef1=newFile("/java/COPYRIGHT"); try{f1.createNewFile();} catch(IOExceptione){} p("FileName:"+f1.getName());//获取文件名
p("Path:"+f1.getPath());//获取文件相对路径
p("AbsPath:"+f1.getAbsolutePath());//获取文件的绝对路径
p("Parent:"+f1.getParent());//获取文件的双亲路径
p(f1.exists()?"exists":"doesnotexist");//文件是否存在
p(f1.canWrite()?"iswriteable":"isnotwriteable");//文件是否科协
p(f1.canRead()?"isreadable":"isnotreadable");//文件是否可读
p("is"+(f1.isDirectory()?"":"not"+"adirectory"));//该对象是否是目录任务2File类p(f1.isFile()?"isnormalfile":"mightbeanamedpipe");//该对象是否是文件
p(f1.isAbsolute()?"isabsolute":"isnotabsolute");//文件路径是否是绝对路径
p("Filelastmodified:"+f1.lastModified());//文件最后修改的时间
p("Filesize:"+f1.length()+"Bytes");//文件的大小
}}程序运行结果为:FileName:COPYRIGHTPath:\java\COPYRIGHTAbsPath:D:\java\COPYRIGHTParent:\javaexistsiswriteableisreadableisnotadirectoryisnormalfileisnotabsoluteFilelastmodified:1470278407436Filesize:0Bytes任务2File类常用的有如下几种。●publicbooleanrenameTo(FilenewFile):将文件重命名成newFile对应的文件名。●publicvoiddelete():将当前文件删除。●publicbooleanmkdir():创建当前目录的子目录。●publicString[]list():用字符串形式返回目录下的全部文件。●publicFile[]listFiles():用File对象形式返回目录下的全部文件。●publicString[]list(FilenameFilterobj):用字符串形式返回目录下由obj指定类型的所有文件。●publicFile[]listFiles(FilenameFilterobj):用File对象返回目录下由obj指定类型的所有文件。任务2File类3、文件和目录操作例6.4列出c:\java目录下的所有java文件。
importjava.io.*;classFileAcceptimplementsFilenameFilter{Stringstr=null;FileAccept(Strings){str="."+s; }publicbooleanaccept(Filepath,Stringname){
returnname.endsWith(str);}}publicclassFileDemo2{publicstaticvoidmain(String[]args){ Filepath=newFile("c:\\java"); FileAcceptacceptMode=newFileAccept("java"); Stringfilelist[]=path.list(acceptMode);
System.out.println("目录下有"+filelist.length+"个文件"); for(inti=0;i<filelist.length;i++){ System.out.println(filelist[i]);//循环输出指定目录下满足条件的所有文件
}}}任务2File类程序运行结果为:目录下有6个文件FileCreate.javaFileDemo.javaFileDemo1.javaFileDemo2.javaFindDups.javaFrequency.java任务2File类4、可执行文件运行当要执行一个本地机器上的可执行文件时,可以使用java.lang包中的Runtime类。首先使用Runtime类声明一个对象,然后使用该类的静态方法getRuntime()创建这个对象。例如:Runtimeex;ex=Runtime.getRuntime();ex可以调用exec(Stringcommand)方法打开本地可执行文件或执行一个操作。在Java语言中,字节流类用两个类层次定义,在顶层的是两个抽象类:InputStream(字节输入流)和OutputStream(字节输出流)。①InputStrem类和OutputStream类InputStream类中定义了与字节输入流操作有关的方法,可以完成从输入流中读取数据的功能,其主要方法如下表所示。任务3字节流与字符流1、字节流
OutputStream类中定义了与字节输出流操作有关的方法,可以完成向输入流中写入数据的功能,其主要方法如下表所示。任务3字节流与字符流①FileInputStream类和FileOutputStream类FileInputStream和FileOutputStream类分别继承了InputStream和OutputStream类,它们实现了父类中的所有抽象方法,通过这两个类可以打开本地文件,对文件内容进行顺序的读写。●publicFileInputStream(Stringname)按字符串参数所指定的文件名来创建一个文件输入流对象。●publicFileInputStream(Filefile)以一个File对象来构造文件输入流对象,该File对象表示一个文件。●publicFileOutputStream(Stringname)通过字符串变量来创建一个文件输出流。●publicFileOutputStream(Stringname,booleanappend)通过字符串变量来创建一个文件输出流。如果第二个参数为true,则将字节写入文件末尾处,否则写入文件开始处。任务3字节流与字符流●publicFileOutputStream(Filefile)通过File对象来创建一个文件输出流。●publicFileOutputStream(Filefile,booleanappend)通过File对象来创建一个文件输出流。如果第二个参数为true,则将字节写入文件末尾处,否则写入文件开始处。例6.7在程序中创建一个文件,写入从键盘输入的一串字符,然后再读该文件并将文件内容显示在屏幕上。
importjava.io.*;classFileInOutDemo{publicstaticvoidmain(String[]args){ FileInputStreamfin;//声明文件输入流对象fin FileOutputStreamfout;//声明文件输出流对象fout charch;intdata; try{ fin=newFileInputStream(FileDescriptor.in); fout=newFileOutputStream("d:\\JAVA\\myfile.txt"); System.out.println("请输入一串字符,并以#结束:"); while((ch=(char)fin.read())!='#') fout.write(ch);任务3字节流与字符流 fin.close(); fout.close(); System.out.println(); fin=newFileInputStream("d:\\JAVA\\myfile.txt"); fout=newFileOutputStream(FileDescriptor.out); while(fin.available()>0){ data=fin.read(); fout.write(data); } fin.close(); fout.close(); } catch(FileNotFoundExceptione){ System.out.println("文件没有找到!"); } catch(IOExceptione){}}}任务3字节流与字符流程序运行结果:D:\java>javaFileInOutDemo请输入一串字符,并以#结束:wreeo789890xcvbndfgner#
wreeo789890xcvbndfgner①Reader类和Writer类Reader和Writer类也是两个抽象类,仅仅提供了一些用于字符流处理的方法,本身不能用来生成实例。Reader类中用的是以字符为单位,其主要方法如下表所示。任务3字节流与字符流2、字符流Writer类是输出字符数据时需要使用的类,与字节输出流OutputStream类相似,主要差别是前者输出的是字符,后者输出的是字节,其主要方法如下表所示。任务3字节流与字符流②FileReader类和FileWriter类
FileReader类常用的构造方法定义如下:●publicFileReader(StringfileName)
按字符串参数所指定的文件名来创建一个文件输入流对象。●publicFileReader(Filefile)按参数中的File对象来构造文件输入流对象。FileWirter类构造方法如下:●publicFileWriter(Filefile):用参数中的File对象创建一个文件输出流。●publicFileWriter(Filefile,booleanappend)用参数中的File对象创建一个文件输出流。如果第二个参数为true,则写入的数据流添加到文件后面,否则将文件覆盖。●publicFileWriter(StringfileName)用参数中的字符串变量来创建一个文件输出流。●publicFileWriter(Stringfilename,booleanappend)用参数中的字符串变量来创建一个文件输出流。如果第二个参数为true,则写入的数据流添加到文件后面,否则将文件覆盖。任务3字节流与字符流例6.8利用FileReader类读取纯文本文件。
importjava.io.*;publicclassFileReadDemo{publicstaticvoidmain(String[]args)throwsIOException{ char[]c=newchar[500];//创建可容纳500个字符的数组
FileReaderfr=newFileReader("d:\\JAVA\\myfile.txt");//创建对象fr intnum=fr.read(c);//将数据读入字符数组c内,并返回读取的字符数
Stringstr=newString(c,0,num);//将字符串数组转换成字符串
System.out.println("读取的字符个数为:"+num+",其内容如下:"); System.out.println(str);}}程序运行结果:读取的字符个数为:22,其内容如下:wreeo789890xcvbndfgner任务3字节流与字符流例6.9利用FileWriter类将字符数组与字符串写到文件里。
importjava.io.*;publicclassFileWriterDemo{publicstaticvoidmain(String[]args)throwsIOException{ FileWriterfw=newFileWriter("d:\\JAVA\\test.txt"); char[]c={'H','e','l','l','o','\r','\n'}; Stringstr="欢迎使用Java!"; fw.write(c);//将字符数组写到文件里
fw.write(str);//将字符串写到文件里
fw.close();}}程序运行结果是在“d:\java”文件夹下生成了test.txt文件,其内容为:Hello欢迎使用Java!任务3字节流与字符流任务4随机访问流1、RandomAccessFile类前面我们谈到的字节流和字符流都是对磁盘文件的顺序读写,而且为了读和写必须分别创建不同的对象。为了能实现对文件的随机读写,Java语言定义了随机访问流RandomAccessFile类。①RandomAccessFile对象的创建●publicRandomAccessFile(Stringname,Stringmode)用参数中包含文件名的字符串创建一个随机访问流对象同时,用第二参数设置文件读写的模式。mode最常用的两种取值:“r”代表了以只读方式打开文件,“rw”代表以读写方式打开文件。●publicRandomAccessFile(Filefile,Stringmode)用参数中包含文件对象创建一个随机访问流对象同时,用第二参数设置文件读写的模式。mode最常用的两种取值:“r”代表了以只读方式打开文件,“rw”代表以读写方式打开文件。任务4随机访问流②对文件位置指针的操作●longgetFilePointer():记录文件指针的当前位置(以字节为单位)。●voidseek(longpos):将文件位置指针定位到pos位置(以字节为单位),其中0表示文件的开头。●intskipBytes(intn):将文件位置指针向后移动n个字节。RandomAccessFile对象的文件位置指针遵循下面的规律:(1)新建RandomAccessFile对象的文件位置指针位于文件的开头处;(2)每次读写操作之后,文件位置的指针都相应后移到读写的字节数;(3)可以通过getFilePointer()方法来获得文件位置指针的位置,通过seek()方法来设置文件指针的位置。任务4随机访问流③随机访问的读写操作RandomAccessFile类中针对所有的基本类型都有相应的读/写方法,读方法描述如下见下表所示。任务4随机访问流2、随机读写应用例6.10用随机读写的方式打开文件test.dat,然后向文件写入10个double型数后关闭该文件;随后再打开该文件,用新的值覆盖第6个浮点数后关闭文件;最后打开该文件,将10个数以逆序的方式输出。importjava.io.RandomAccessFile;importjava.io.IOException;importjava.io.FileNotFoundException;publicclassRAFDemo{publicstaticvoidmain(Stringargs[]){try{RandomAccessFileraf=newRandomAccessFile("test.dat","rw");for(inti=0;i<10;i++)raf.writeDouble(i*1.414); raf.close();//关闭文件
raf=newRandomAccessFile("test.dat","rw"); raf.seek(5*8);raf.writeDouble(123.0001);任务4随机访问流raf.close();//关闭文件
raf=newRandomAccessFile("test.dat","r"); for(inti=0;i<10;i++)//将这10个浮点数按逆序的方式打印输出
{ raf.seek((9-i)*8);//指针定位是从后往前移动
System.out.println("Value"+(9-i)+":"+raf.readDouble()); } raf.close();}catch(FileNotFoundExceptione){System.out.println(e);}catch(IOExceptione){System.out.println(e);}}}程序运行结果:Value9:12.725999999999999Value8:11.312Value7:9.898Value6:8.484Value5:123.0001Value4:5.656Value3:4.242Value2:2.828Value1:1.414Value0:0.0任务5其它流在Java的输入/输出类中,针对字节流和字符流分别定义了两类不同的缓冲类。字节流的缓冲类为BufferedInputStream类和BufferedOutputStream类,其构造方法定义如下:●publicBufferedInputStream(InputStreamin)用参数中包含的InputStrean对象创建一个字节输入流的缓冲类对象。●publicBufferedInputStream(InputStreamin,intsize)用参数中包含的InputStrean对象创建一个字节输入流的缓冲类对象同时,可以用第二个参数指定输入缓冲区的大小,默认情况下输入缓冲区是2048个字节。●publicBufferedOutputStream(OutStreamout)用参数中包含的OutputStrean对象创建一个字节输出流的缓冲类对象。1、缓冲流任务5其它流
●publicBufferedOutputStream(OutStreamout,intsize)用参数中包含的OutputStrean对象创建一个字节输出流的缓冲类对象同时,可以用第二个参数指定输出缓冲区的大小,默认情况下输出缓冲区是512个字节。字符流的缓冲类为BufferedReader类和BufferedWriter类,其构造方法定义如下:●publicBufferedReader(Readerin)用参数中包含的Reader对象创建一个字符输入流的缓冲类对象。●publicBufferedReader(Readerin,intsz)用参数中包含的Reader对象创建一个字符输入流的缓冲类对象同时,可以用第二个参数指定输入缓冲区的大小,默认情况下输入缓冲区是8192个字节。●publicBufferedWriter(Writerout)用参数中包含的Writer对象创建一个字符输出流的缓冲类对象。任务5其它流●publicBufferedWriter(Writerout,intsz)用参数中包含的Writer对象创建一个字符输出流的缓冲类对象同时,可以用第二个参数指定输出缓冲区的大小,默认情况下输出缓冲区是8192个字节。例6.12使用缓冲来读一个较大的文件,并判断文件中出现字符A的次数。importjava.io.FileInputStream;importjava.io.BufferedInputStream;importjava.io.IOException;publicclassFileTest2{publicstaticvoidmain(Stringargs[])throwsIOException{longt=System.currentTimeMillis();Stringfilename=args[0];FileInputStreamfis=newFileInputStream(filename);BufferedInputStreambis=newBufferedInputStream(fis);intcount=0;intc;while((c=bis.read())!=-1){ if(c=='A'){count++;}}任务5其它流fis.close();System.out.println(count);t=System.currentTimeMillis()-t;System.out.println("Timeelapsed:"+t);}}在命令行输入如下命令:javaFileTest1accmnsrc.txt程序运行结果为:5427Timeelapsed:15
本例与例6.10的区别仅在于FileTest2程序的第9行,该行语句以FileInputStream对象为参数构造了一个BufferedInputStream对象。从FileTest2程序的执行结果可看出,其执行时间对比与FileTest1有显著提高,从615毫秒缩减到了15毫秒。任务5其它流数据流,简单说就是允许字节流直接操作基本数据类型和字符串。DataInputStream和DataOutputStream类创建的对象分别称为数据输入流和数据输出流。这两个类的构造方法如下:●publicDataInputStream(InputStreamin)以一个InputStream对象作为参数,表示它是建立在一个已存的输入流对象之上,并以字节流的方式读取数据。●publicDataOutputStream(OutputStreamin)以一个OutputStream对象作为参数,表示它建立在一个已存在的输出流对象之上,以字节流的方式写数据。2、数据流任务5其它流
DataInputStream和DataOutputStream类的读写方法见下表所示。任务5其它流例6.13用DataOutputStream类生成一个文件,然后用DataInputStream类读取这个文件。importjava.io.*;publicclassDataInOutDemo{publicstaticvoidmain(String[]args){try{FileOutputStreamfod=newFileOutputStream("data.dat");
DataOutputStreamoutDat=newDataOutputStream(fod);outDat.writeInt(800);outDat.writeLong(12345678);outDat.writeFloat(123.45f);outDat.writeDouble(678
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农副食品加工冷链储运方案
- 冷链物流仓储温控系统方案
- 防火墙日志分析技巧课程设计
- 2026年中专教师高级职称答辩问题
- 2026年内分泌科会诊质量与效率提升措施
- 2026年建筑施工技术员进阶宝典
- 2026山东外事职业大学康复中心招聘备考题库参考答案详解
- 2026甘肃甘南州舟曲县招聘乡村医生33人备考题库及答案详解(基础+提升)
- 2026湖南衡阳市南岳区招聘事业单位人员42人备考题库附答案详解(完整版)
- 2026湖北鄂州人才集团招聘派往中核湖北鄂城新区联合投资有限公司6人备考题库附答案详解(培优)
- 2025年辽宁烟草公司招聘真题
- 人教版数学六年级下册比例《比例的基本性质》示范公开课教学课件
- 福建省宁德市2026届高三下学期高中毕业班质量检测政治试卷(含答案)
- 一次函数与方程(组)、不等式课件+2025-2026学年人教版数学八年级下册
- 2026年上海市静安区社区工作者招聘考试笔试试题及答案解析
- 2026中国农业大学-东阿阿胶产业创新研究院招聘2人笔试备考试题及答案解析
- 2026年云南省烟草专卖局招聘(第二批585人)考试备考题库及答案解析
- 2026四川泸州市龙马潭区考试招聘社区专职工作者48人备考题库含答案详解(巩固)
- 呼吸衰竭患者的病情监测与评估
- TSG08-2026《特种设备使用管理规则》解读
- 多式联运物流园建设项目运营管理方案
评论
0/150
提交评论