Java JDK6学习笔记之IO部分

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第14章IO输入/输出第14章输入/输出输入/输出(Input/Output)泛指对某个设备或环境进行数据的输入或输出。例如对硬盘进行输入/输出、对视频设备进行输入/输出、对网络主机进行输入/输出等,可以想象,因设备或环境的不同,会有各式各样的输入/输出问题与解决方案。输入/输出问题在程序设计中实际上是一个很复杂的问题。对于输入/输出问题,Java将之抽象化为流(Stream)对象来解决。对不同的输入/输出问题,会有相应的流对象提供解决的方案。本章就是要学习Java中各式各样解决输入/输出问题的对象。然而输入/输出问题所涉及的领域相当广,基于学习的角度来看,必须选择一个主题来专门讨论,所以本章主题会围绕在文件输入/输出。有了本章的基础,在了解其他领域的输入/输出问题时就不难入手。14.1文件在正式了解Java中如何处理文件输入/输出之前,要先了解一下在Java中如何表示一个文件。本小节也将简单地介绍随机文件存取,让您初步了解文件输入/输出时一些必须注意的事项。14.1.1File类不同的操作系统对于文件系统路径的设置各有差别。例如在Windows中,一个路径的表示法可能是:C:\\Workspace\\CH14\\而在Linux下的路径设置可能会像是:/home/justin/workspace/ch14Windows的路径指定是使用UNC(UniversalNamingConvention)路径名,以\\开始表示硬盘根目录。如果没有以\\开始表示相对于当前工作目录的路径,C是可选的硬盘指定,后面跟随着:字符。而UNIX-Like系统没有Windows系统的C、D、E这样的硬盘驱动器概念,UNIX-Like系统的路径指定以/开始表示从根目录开始的绝对路径,不以/开始表示相对于当前工作目录的路径。在程序中设置路径时会有系统相依性的问题,java.io.File类提供一个抽象的、与系统独立的路径表示。给它一个路径字符串,它会将其转换为与系统无关的抽象路径表示,这个路径可以指向一个文件、目录或是URI(UniformResourceIdentifier)。一个File的实例被建立时,它就不能再被改变内容。File实例除了用作一个文件或目录的抽象表示之外,它还提供了不少相关操作方法:可以用它来对文件系统作一些查询与设置的动作。要注意的是,不管是文件还是目录,在Java中都是以File的实例来表示。范例14.1是一个设置与操作File实例的简单示范,可以指定查询某个目录下的所有文件与目录名称。范例14.1FileDemo.javapackageonlyfun.caterpillar;importjava.io.*;importjava.util.*;publicclassFileDemo{publicstaticvoidmain(String[]args){try{Filefile=newFile(args[0]);if(file.isFile()){//是否为文件System.out.println(args[0]+文件);System.out.print(file.canRead()?可读:不可读);System.out.print(file.canWrite()?可写:不可写);System.out.println(file.length()+字节);}else{//列出所有的文件及目录File[]files=file.listFiles();ArrayListFilefileList=newArrayListFile();for(inti=0;ifiles.length;i++){//先列出目录if(files[i].isDirectory()){//是否为目录//取得路径名System.out.println([+files[i].getPath()+]);}else{//文件先存入fileList,待会再列出fileList.add(files[i]);}}//列出文件for(Filef:fileList){System.out.println(f.toString());}System.out.println();}}catch(ArrayIndexOutOfBoundsExceptione){System.out.println(using:javaFileDemopathname);}}}执行结果:javaonlyfun.caterpillar.FileDemoC:\[C:\WINDOWS][C:\workspace][C:\DocumentsandSettings][C:\ProgramFiles][C:\SystemVolumeInformation]C:\pagefile.sysC:\A3N_A3L.10C:\bootfont.binC:\ntldr...略这里先简单地介绍一下File类。File类主要是文件的抽象代表,若要作文件输出/输入,必须配合其他相关类来使用。接下来会配合各小节的内容并适时地使用File类。14.1.2RandomAccessFile类在正式介绍如何使用Java的输入/输出相关类来进行文件存取前,先简单地通过使用java.io.RandomAccessFile来存取文件,以认识一些文件存取时所必须注意的概念与事项。文件存取通常是循序的,每在文件中存取一次,文件的读取位置就会相对于目前的位置前进一次。然而有时必须指定文件的某个区段进行读取或写入的动作,也就是进行随机存取(RandomAccess),即要能在文件中随意地移动读取位置。这时可以使用RandomAccessFile,使用它的seek()方法来指定文件存取的位置,指定的单位是字节。为了移动存取位置时的方便,通常在随机存取文件中会固定每一个数据的长度。例如长度固定为每一个学生个人数据,Java中并没有直接的方法可以写入一个固定长度数据(像C/C++中的structure),所以在固定每一个长度方面必须自行设计。范例14.2先设计一个学生数据的类。范例14.2Student.javapackageonlyfun.caterpillar;publicclassStudent{privateStringname;privateintscore;publicStudent(){setName(noname);}publicStudent(Stringname,intscore){setName(name);this.score=score;}publicvoidsetName(Stringname){StringBuilderbuilder=null;if(name!=null)builder=newStringBuilder(name);elsebuilder=newStringBuilder(15);builder.setLength(15);//最长15字符this.name=builder.toString();}publicvoidsetScore(intscore){this.score=score;}publicStringgetName(){returnname;}publicintgetScore(){returnscore;}//每个数据固定写入34字节publicstaticintsize(){return34;}}对于每一个学生数据的实例在写入文件时,会固定以34字节的长度写入,也就是15个字符(30字节)加上一个int整数的长度(4字节)。范例14.2中是使用StringBuilder来固定字符长度,可以使用size()方法来取得长度信息。范例14.3则示范了如何使用RandomAccessFile来写入文件,并可随机指定一个所想读出的数据。范例14.3RandomAccessFileDemo.javapackageonlyfun.caterpillar;importjava.io.*;importjava.util.*;publicclassRandomAccessFileDemo{publicstaticvoidmain(String[]args){Student[]students={newStudent(Justin,90),newStudent(momor,95),newStudent(Bush,88),newStudent(caterpillar,84)};try{Filefile=newFile(args[0]);//建立RandomAccessFile实例并以读写模式打开文件RandomAccessFilerandomAccessFile=newRandomAccessFile(file,rw);for(inti=0;istudents.length;i++){//使用对应的write方法写入数据randomAccessFile.writeChars(students[i].getName());randomAccessFile.writeInt(students[i].getScore());}Scannerscanner=newScanner(System.in);System.out.print(读取第几个数据?);intnum=scanner.nextInt();//使用seek()方法操作存取位置randomAccessFile.seek((num-1)*Student.size());Studentstudent=newStudent();//使用对应的read方法读出数据student.setName(readName(randomAccessFile));student.setScore(randomAccessFile.readInt());System.out.println(姓名:+student.getName());System.out.println(分数:+student.getScore());//设置关闭文件randomAccessFile.close();}catch(ArrayIndexOutOfBoundsExceptione){System.out.println(请指定文件名称);}catch(IOExceptione){e.printStackTrace();}}privatestaticStringreadName(RandomAccessFilerandomAccessfile)throwsIOException{char[]name=newchar[15];for(inti=0;iname.length;i++)name[i]=randomAccessfile.readChar();//将空字符取代为空格符并返回returnnewString(name).replace('\0','');}}执行结果:javaonlyfun.caterpillar.RandomAccessFileDemostudent.dat读取第几个数据?2姓名:momor分数:95RandomAccessFile上的相关方法实现都在批注中说明了,可以看到读写文件时几个必要的流程:打开文件并指定读写方式在Java中,当实例化一个与文件相关的输入/输出类时,就会进行打开文件的动作。在实例化的同时要指定文件是要以读出(r)、写入(w)或可读可写(rw)的方式打开,可以将文件看作是一个容器,要读出或写入数据都必须打开容器的瓶盖。使用对应的写入方法对文件进行写入,要使用对应的写入方法。在Java中通常是write的名称作为开头,在低级的文件写入中,要写入某种类型的数据,就要使用对应该类型的方法,如writeInt()、writeChar()等。使用对应的读出方法对文件进行读出,要使用对应的读出方法。在Java中通常是read的名称作为开头,在低级的文件读出中,要读出某种类型的数据,就要使用对应该类型的方法,如readInt()、readChar()等。关闭

1 / 45
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功