




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章 输入输出流处理,主要内容,1. Java File操作 File类 FileInputStream/FileOutputStream类 FileReader/FileWriter类 RandomAccessFile类 FileFilter 2. Java I/O流概述 InputStream类 OutputStream类 Reader类 Writer类,10.1 File类,文件是存储在外部介质上的数据集合,文件是由数据记录组成。记录是计算机处理数据的基本单位,它由一组具有共同属性相互关联的数据项组成。操作系统正是以文件为单位对数据进行管理,即从外存取数据时,必须先按文件名找到该数据所在的文件;向外存写数据时,必须先建立一个以文件名标识的文件,再向该文件输送数据。文件是存储数据的一种手段,在数据库没有出现之前,文件是存储数据的主要手段。,10.1.1 File类概述,顺序文件(Sequential File)是普通的文本文件,顺序文件中的记录按顺序一个接一个地排列。读写文件存取记录时,都必须按记录顺序逐个进行。一行一条记录(一项数据),记录可长可短,以“换行”字符为分隔符号。 随机文件(Random Access File)是可以按任意次序读写的文件,其中每个记录的长度必须相同。在这种文件结构中,每个记录都有其惟一的一个记录号,所以在读取数据时,只要知道记录号,便可以直接读取记录。 二进制文件(Binary file)是字节的集合、它直接把二进制码存放在文件中。除了没有数据类型或者记录长度的含义以外,它与随机访问很相似。二进制访问模式是以字节数来定位数据,在程序中可以按任何方式组织和访问数据,对文件中各字节数据直接进行存取。,10.1.1 File类概述,在Java语言中,对文件的操作,主要通过File类来实现。首先创建指向特定文件的File类对象,通过该对象相关方法获取文件属性或进行目录操作。一个File对象可以代表一个文件,也可以代表一个目录,甚至什么也不是(不存在)。创建了一个File对象后,如果是目录,可以显示目录清单,新建或删除目录;如果是文件,可以查询文件的属性和路径信息,也可以输出和改名,但没有拷贝功能。拷贝属于文件的读写,要用后面的I/O流类来解决。,10.1.1 File类概述,利用File类构造方法创建File类对象: File f=new File(“Test.txt”); File f=new File(“d:javaTest.txt”); File f=new File(“d:java”,”Test.txt”); File path=new File(“d:java”); File f=new File(path,“Test.txt”); 路径分隔符:windows 下为“”,Unix/Linux下为/”,Java访问文件时路径分隔符要么用“” (转义字符),要么用“/”,和文件名、路径相关 String getName():取文件/文件夹名 String getParent():取路径 String getPath():取包括路径文件名 文件/文件夹属性检测 boolean exists() boolean canWrite();boolean canRead(); boolean isFile();boolean isDirectory() 文件/文件夹操作: renameTo() mkdir()、mkdirs() createNewFile() delete()等。,10.1.2 获取文件属性信息,在Java中获取文件属性信息,如文件长度或文件所在路径等,创建指向该文件的File对象,并调用相关方法就可以。 例如:FileExample.java,10.1.3 文件重命名和删除,使用renameTo(File dest)方法重命名文件。使用delete()方法删除已经存在的文件。如果操作成功,则返回true;如果操作失败则返回false; 例如:FileExample2.java,10.1.4 显示目录文件,在Java中获取指定文件目录下的所有文件: 无条件获取所有文件: list()返回字符串数组; listFiles()返回File对象数组。 有条件获取所有文件: list(FilenameFilter filter); listFiles(FileFilter filter) 例如:FileExample3.java,10.2 流基本概念,流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向。流不但可以处理文件,还可以处理动态内存、网络数据等多种数据形式。,10.2.1 什么是流,Java语言的输入输出功能十分强大而灵活,美中不足的是看上去输入输出的代码并不是很简洁,因为往往需要包装许多不同的对象。在Java类库中,I/O部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等。 当程序需要读取数据的时候,就开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接,从数据源读取信息到程序中。当程序需要写入数据的时候,就会开启一个通向目的地的流,目的地同样可以是文件,内存,网络链接等,就会从程序中向目的地写入数据。这时候我们就可以想象数据好像在建立的管道中“流”动一样,如水流。简单的输入输出,即从一个系统向另一个系统移动字节。,10.2.1 什么是流,如:有个程序需要获取数据,可以把程序作为一个对象来看,而存放数据的文件看作一个对象,两个对象之间要传递数据,需要在两个对象之间建立一个管道,管道建好之后,数据就可以如水流一样从数据源向目的地流动。示意图如图10-4所示: 图10-4 流示意图,10.2.1 什么是流,依据流的介质的不同,可以把流分为字节流和字符流。 依据流的移动的方向的不同的,可以分为输入流和输出流, 这里是以程序为参照物来说的,输入流表示从存储数据的数据源读取信息到程序中,输出流表示把从程序产生的数据放入到数据源中。可以用下图10-5表示。 图10-5 输出输入流,10.2.1 什么是流,常用的流有: 字节输入流(FileInputStram)、 字节输出流(FileOutputStream)、 字符输出流(FileReader)、 字符输入流(FileWriter)、 数据输入流(DataInputStream)、 数据输出流(DataOutputStream)等。,10.2.2 输入输出流机制,字节流由两个类层次结构定义 顶层是两个抽象类InputStream和OutputStream。 每个抽象类都有多个具体子类,这些类用来处理不同的 外部设备,如磁盘文件、网络链接,甚至是内存缓冲区。 主要的字节流类的层次结构如图10-4所示:,10.2.2 输入输出流机制,10.2.2 输入输出流机制,字符流是用来处理文本化的数据,任何文本的数据类型都可以使用字符流处理,包括文本文件、网页以及其他常见的文本类型。 字符流类也由两个类层次结构定义。顶层由两个抽象类Reader和Writer。这两个抽象类及其子类是专门处理Unicode的字符流。主要的字符流类的层次结构如图10-5所示:,10.2.2 输入输出流机制,图10-5 字符流输入输出类结构,10.3 流的使用,InputStream是表示字节输入流的所有类的超类 OutputStream是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。,Reader是用于读取字符流的抽象类。子类必须实现的方法只有read(char,int,int)和close()。 Writer是字符流写入的抽象类。子类必须实现的方法仅有write(char,int,int)、flush()和close()。,10.4 文件读写处理,读取文件数据和写入文件数据是操作I/O的基础能力,在读取或写入文件数据时,应针对不同类型文件需要选用不同的读取方法。在某些场合,字符流比字节流更有效。 需要声明:在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。,在进行文件的读/写操作(输入/输出)时,会产生非运行时例外IOException,必须捕获或声明抛弃。,把文件中的数据读取出来或者向文件中写入数据,可以利用字节流FileInputStream和FileOutputStream来实现。二种操作的实现过程大致相同,首先都是在文件和程序建立一个管道,管道建立好后,可以向文件中读取或者写入数据,操作完毕后,关闭该管道。,10.4.1 FileInputStream/FileOutputStream,读取数据 FileInputStream是从java.io.InputStream中继承过来的简单的输入类。FileInputStream表示从文件系统中的某个文件中获取输入字节。通过使用FileInputStream可以访问文件的一个字节、几个字节或整个文件。 写入数据 FileOutputStream用于写入诸如图像数据之类的原始字节的流。,10.4.1 FileInputStream/FileOutputStream,文件流的构造方法: FileInputStream(File f) 打开一个以f描述的文件作为输入。 FileInputStream(String name) 打开一个文件路径名为name的文件作为输入。 FileOutputStream(File f) 创建一个以f描述的文件作为输出,文件如果已经存在,则其内容被清空。 FileOutputStream(String name) 创建一个文件路径名为name的文件作为输出,文件如果已经存在,则其内容被清空。 FileOutputStream(String name, boolean append) 创建一个文件路径名为name的文件作为输出,文件如果已经存在,则在该输出上输出的内容被接到原有内容之后。 例如: FileInputExample.java; FileOutputExample.java ; FileStream.java 功能:本程序用FileStream实现文件内容的覆盖、追加功能。,10.4.1 FileInputStream/FileOutputStream,如果在文件中包含中文字符,这时再以字节流的形式读取,可能会产生乱码。 字符流类由两个类层次结构定义。顶层有两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。使用字符流读取或写入数据,通常采用FileReader和FileWriter类。 字符流是专门用来处理由ASCII字符集或Unicode所表示的任何文本,如:纯文本文件、HTML文档、JAVA源代码文件等。使用字符流来读取信息的类都是Reader和Writer这两个类的子类。,10.4.2 FileReader/ FileWriter,FileReader用于以字符为单位读取文本文件,而FileWriter类用于将字符数据写出到文本文件中.可以在这两个类的构造方法中以String或File类型参数指定要存取的文件. public FileReader(File file) public FileReader(String fileName) public FileWriter(File file) public FileWriter(String fileName) 其中FileWriter类的构造方法还可指明是否以追加的方式写文件(默认为覆盖方式) public FileWriter(String fileName,boolean append) 例程:CharCopyFile.java 功能:本程序用字符文件流方式复制文本文件. 编程实践:将sg.txt中内容输出到屏幕上。,10.4.2 FileReader/ FileWriter,10.4.3 RandomAccessFile类,通过前面的学习,我们发现FileInputStream、FileOutputStream、FileReader和FileWriter流只能完成单一的功能,要么只能读取,要么只能写入。 Java还提供了专门用来处理文件输入输出功能更加完善的RandomAccessFile流,RandomAccessFile类创建的流和前面的输入、输出流不同,RandomAccessFile类既不是输入流类InputStream类的子类,也不是输出流类OutputStream类的子类。但是RandomAccessFile类创建的流既可以作为源也可以作为目的地。换句话,当想对一个文件进行读写操作时,就可以创建一个指向该文件的RandomAccessFile流即可。,10.4.3 RandomAccessFile类,文件存取通常有一定的顺序,每在文件读取一次内容,文件的读取位置就会相对于目前位置前进一次。然后有时必须指定文件的某个区段进行读取或写入的动作,也就是进行随机的存取,就是能够在文件中随意的移动指针的位置。这时可以使用该类的seek方法指定文件的位置。为了移动存取位置的方便,通常在随机存取文件中会固定每一个数据的长度。,10.4.3 RandomAccessFile类,创建RandomAccessFile类的实例化对象通常使用下面两个构造函数。第一个为RandomFileAccess(String name,String,mode),其中参数name用来确定一个文件名,给出创建的流的源,也就是流的目的地。参数mode取如(只读)或w(可读写),决定创建的流对文件的访问权利。第二个为RandomAccessFile(File file,String mode)参数file是一个File对象,给出创建的流的源,也是流的目的地。参数mode取如(只读)或w(可读写),决定创建的流对文件的访问权利。 RandomAccessFile类中有一个方法:seek(long a),用来移动RandomAccessFile流指向文件的指针,其中参数a确定文件指针距离文件开头的字节位置。另外流还可以调用getFilePointer()方法获取当前文件的指针的位置。,RandomAccessFile类支持“随机访问”方式,我们可以跳转到文件的任意位置处同时完成读和写基本数据类型操作,它直接继承object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法: readXXX()或writeXXX():如ReadInt(), ReadLine(), WriteChar(), WriteDouble()等。 int skipBytes(int n):将指针向下移动若干字节 length():返回文件长度 long getFilePointer():返回指针当前位置 void seek(long pos):将指针调到所需位置。RandomAcessFile类有个位置指示器(指针),指向当前读写处的位置,当读写n个字节后,文件指针将指向这n个字节后下一字节的位置,随后的读写操作将从新的位置开始。RandomFileAccess类在等长记录格式文件的随机读取时有很大的优势,但不能访问文件以外的其他I/O设备。,RandomAccessFile可以以只读或读写方式打开文件,具体取决于我们创建RandomAccessFile类对象时使用的构造方法有关。 new RandomAccessFile(f,”rw
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州六盘水市参加第十三届贵州人才博览会事业单位人才引进261人模拟试卷附答案详解(黄金题型)
- 2025黑龙江哈尔滨工程大学哈军工纪念馆宣讲员招聘1人考前自测高频考点模拟试题及答案详解(全优)
- 反垄断法实施效果评估-洞察与解读
- 2025春季中国太平实习生招聘考前自测高频考点模拟试题及参考答案详解一套
- 2025广东惠州市博罗县东部自来水有限公司招聘及考前自测高频考点模拟试题附答案详解
- 2025湖南娄底市纪委监委、市委巡察办所属事业单位公开选调、公开招聘工作人员9人模拟试卷及答案详解1套
- 2025江苏镇江市卫生健康委员会所属镇江市第一人民医院招聘工作人员50人模拟试卷及答案详解(历年真题)
- 2025年春季江苏凤凰新华书店集团有限公司市县分公司招聘考前自测高频考点模拟试题附答案详解(模拟题)
- 2025广西百色西林县生态移民发展中心公开招聘3人考前自测高频考点模拟试题及答案详解(夺冠)
- 2025年春季中国邮政储蓄银行湖南省分行校园招聘模拟试卷及答案详解(网校专用)
- 型钢混凝土结构钢筋施工
- 石群邱关源电路(第1至7单元)白底课件
- JJF 1338-2012相控阵超声探伤仪校准规范
- GB/T 40529-2021船舶与海洋技术起货绞车
- GB 31603-2015食品安全国家标准食品接触材料及制品生产通用卫生规范
- 关于公布2016年度中国电力优质工程奖评审结果的通知
- 港口集团绩效考核方案
- 送达地址确认书(诉讼类范本)
- 2023版北京协和医院重症医学科诊疗常规
- 三坐标测量基础知识(基础教育)
- 宜家战略分析(课堂PPT)
评论
0/150
提交评论