1、实验6 文件IO练习实验6 文件IO练习一. 实验目的1. 通过阅读本课件知识点和例题,了解文件I/O的类型、原理、程序资源(类族)和编程方法。2. 参考本课件对文件I/O类方法的描述及其给出的例题,寻找解决方案并编写程序,实现所要求的输入输出功能,以加深对本章内容的理解、提高文件I/O的实际运用能力。二. 知识点和例题1. 文件I/O的概念和分类 什么是文件文件是存储于外存储器 (如硬盘、U盘) 上 的一组信息的集合。文件在外存储器上以树形层次结构存储,由操作系统管理。例如在Windows资源管理器上“我的电脑”是树根,文件是树叶,期间有驱动器和一系列文件夹作为树杈。文件由文件名以及表示在树
2、上位置的一个路径来标识,文件名由主名和表示文件类型的扩展名构成,例如:C:Documents and SettingsJavaMyProg.java盘符 路径 文件名 扩展名 何谓及如何实现文件I/O内存与文件的信息交换称为文件/,即从文件输入()和向文件输出()。广义的文件也包括/设备,如打印机等。这些信息交换由程序来控制,不同的程序设计语言有不同的文件/控制方法。如C用fscanffprintf、freadfwrite等几套函数; C+用fstream中的ifstream/ofstream对象; C#用stream类及其下面的一系列子类;Java则用InputStreamOutputStr
3、eam、ReaderWriter类族来实现文件/。 文件的类型要正确实现文件/,必须根据文件的性质及/方式将文件分为几种不同的类型:文本文件保存以ASCII、UNICODE等编码方式存储的文本。二进制文件保存以二进制方式存储的数据,如整数、浮点数、声音、图像等。顺序读写文件以顺序读写方式打开的文件,按照字节或进出数据的顺序进行读写。随机读写文件以随机读写方式打开的文件,按照数据在文件中的位置(字节序号)进行定长数据的读写。 流的概念流 (stream) 是一组有序的、有起点和终点的字节集合,是对输入输出的抽象。引入流的目的是使/操作与具体设备无关。对流的操作以字节为单位进行,并常常使用缓冲区(
4、buffer)技术,这是因数据在内存中流动的速度要比文件存取的速度快得多,而文件存取的时间又与存取的频率成正比,为减小存取频率,系统让/先对缓冲区进行,当缓冲区空、满或文件关闭时,才发生物理的读入或写出。 字节流和字符流字节流是 Java 文件/的基本类型,即以字节为单位的、顺序方式的输入和输出。根据数据源、是否使用缓冲区,以及一次输入输出数据的类型等因素,在这种基本类型之上又派生出一系列子类型。字符流是以字符为单位的/。由于Java使用的是UNICODE编码,因此单次输入输出的若是一个字节,则汉字等非英文字符将无法正确显示。根据是否有缓冲区等因素,字符流亦派生出一系列子类型。 操作方式和类族
5、流操作方式字节流类族字符流类族不使用缓冲区InputStreamOutputStreamReaderWriter使用缓冲区BufferedInputStreamBufferedOutputStreamFileReaderFileWriter 将字节流转化为基本类型流DataInputStreamDataOutputStream将字节流转化为字符流InputStreamReaderOutputStreamWriter将流转化为StringPrintStreamPrintWriter将字节流转化为对象流ObjectInputStreamObjectOutputStream 关于序列化在面向对象程序
6、中,有时我们需要把对象的数据(往往由各种不同的类型的数据项组成)按照原来的结构一并向文件写入,或从文件读出到对象中,并且将一个个对象的值首尾串接构成一个序列,怎样写入,就怎样读出,这种/方式称为序列化 (serialization)。由于不同类对象的数据结构不同,因此任何打算序列化的对象,其所属类都必须实现java.io.Serializable接口规范。 文件/作业的一般流程读操作 (I)写操作 (O)1import java.io.*;import java.io.*;2try 打开(open)一个流try 打开(open)一个流3 while (还有数据) 读出数据; /其它处理 whi
7、le (还有数据) 写入数据; /其它处理 4 关闭(close)打开的流 catch(IOException e) 关闭(close)打开的流 catch(IOException e) 2. File类和JfileChooser类 File类概述一个文件的信息分外部信息和内部信息,外部信息除了路径、文件名和扩展名之外,还包括是否只读、是否隐藏等属性信息;内部信息则是文件中的内容。File类封装了文件的外部信息,并提供了对它的一系列操作,如修改文件属性、重命名等。除此之外,File类的对象还用作流方法的参数,用来将流对象与物理文件绑定,例如:File f = new File(e:, 0614
8、3.txt);FileReader in = new FileReader(f); File类的方法 构造方法方法原型功能说明和实例File(File parent, String child)利用File对象与字符串构成的路径创建一个File对象,例如:File d = new File(e:folder);File f = new File(d, me.txt);File(String pathname)利用字符串指定的路径和文件名创建一个File对象,例如:File f = new File(e:me.txt);File(String parent, String child)利用字符串
9、指定的路径和文件名创建一个File对象,例如: File f = new File(e:,me.txt);File(URI uri)利用URI对象创建一个File对象 测试文件状态方法原型功能说明和实例boolean exists()测试File对象代表的文件是否存在,例如: if(f.exists() in = new FileReader(f);boolean isFile()测试File对象是否代表文件boolean isDirectory()测试File对象是否代表文件夹boolean isAbsolute()测试File对象代表的是否为绝对路径boolean isHidden()测试
10、File对象代表的是否为隐藏文件boolean canRead()测试File对象代表的文件是否为只读boolean canWrite()测试File对象代表的文件是否可写 测试文件属性方法原型功能说明和实例String getName()返回File对象代表的文件的名称,例如:File f = new File(e:06143.txt); System.out.print(f.getName(); / 打印“06143.txt”long length()返回File对象代表的文件的大小,例如:File f = new File(e:06143.txt); System.out.print(f
11、.length(); / 打印“2175”long lastModified()返回File对象代表的文件的最近一次修改时间,可通过Date转换为可读格式String getParent()返回File对象代表的文件的上层文件夹File getParentFile()返回File对象代表的文件的上层文件夹相关的File对象 测试文件路径方法原型功能说明和实例String getPath()返回File对象所代表文件的路径总称, 如果创建时未设置,则返回文件名称String getAbsolutePath()返回File对象所代表文件的绝对路径: File f = new File(e:0614
12、3.txt);System.out.println(f.getAbsolutePath();String getCanonicalPath()返回File对象所代表文件的规范路径:File f = new File(e:06143.txt);try System.out.println(f.getCanonicalPath(); catch / 必须包含在trycatch块中File getAbsoluteFile()以File形式返回File对象所代表文件的绝对名称File getCanonicalFile()以File形式返回File对象所代表文件的规范名称 设置文件属性方法原型功能说明和
13、实例boolean renameTo(File dest)将File对象代表的文件更名为dest代表的文件的名称,例如:File f = new File(e:06143.txt); f.renameTo(newFile(e:123.txt);System.out.print(f.getName();经过这一操作后,磁盘上的文件被改名,但对象f的值不变boolean setReadOnly()将File对象代表的文件更改为具有只读属性boolean setLastModified(long time)设置File对象所代表的文件的最近一次修改时间 创建和删除文件夹方法原型功能说明和实例bool
14、ean mkdir()创建一个文件夹,并以File对象中的文件名作为文件夹名,例如:File f = new File(e:Java2);f.mkdir(); / 在e:盘根目录下创建文件夹Java2boolean mkdirs()创建一个包含有上层文件夹的文件夹,并以File对象中的路径作为文件夹名,例如:File f = new File(e:Javaworkspace);f.mkdirs(); / 在e:盘下创建 Javaworkspaceboolean delete()删除File对象代表的文件或文件夹,例如:File f = new File(e:Java2);f.delete();
15、void deleteOnExit()程序结束时删除File对象代表的文件或文件夹 列出文件方法原型功能说明和实例String list()返回File对象所代表的文件夹下的文件和文件夹String list(FilenameFilter filter)返回File对象代表的文件夹下、符合给定文件名约束条件的文件和文件夹File listFiles()返回File对象代表的文件夹下所有File对象File listFiles(FileFilter filter)返回File对象代表的文件夹下符合给定内部信息约束条件的File对象File listFiles(FilenameFilter fil
16、ter)返回File对象代表的文件夹下符合给定文件名约束条件的File对象static File listRoots()列出所有可取得的文件系统的根目录 JFileChooser类概述JFileChooser类是Swing类库中的一个成员, Swing类库是Sun开发的一个图形用户界面(GUI) 工具包,将在“用户界面”一章详细介绍,这里引入JFileChooser类的目的是想配合File类,让用户在一个可视化的环境下对所需文件进行选择,这样,作业Student中的文件“06143.txt”也就不必写入源程序了。要使用JFileChooser类,需要在源文件头部使用以下语句:import ja
17、vax.swing.JFileChooser; JFileChooser的方法 构造方法方法原型功能说明JFileChooser()在默认目录下选择文件JFileChooser(File currentDirectory)在File代表的目录下选择文件JFileChooser(File currentDirectory,FileSystemView fsv)利用FileSystemView在当前目录下选择文件JFileChooser(FileSystemView fsv)利用FileSystemView选择JFileChooser(String currentDirPath)在指定目录下选择文
18、件JFileChooser(String currentDirPath,FileSystemView fsv)利用FileSystemView在指定的目录下选择文件 打开窗口方法原型功能说明int showOpenDialog(Component parent)打开一个“Open”文件对话框int showSaveDialog(Component parent)打开一个“Save”文件对话框int showDialog(Component parent,String approveButtonText)自定义Open或Save按钮文本showOpenDialog的返值及其意义:JFileCho
19、oser.APPROVE_OPTION 用户点击取消以外的按钮JFileChooser.CANCEL_OPTION 用户点击取消按钮JFileChooser.ERROR_OPTION 发生错误或不正常关闭 选择文件方法原型功能说明File getSelectedFile()返回被选中的文件File getSelectedFiles()返回所有被选中的文件boolean isMultiSelectionEnabled()返回是否允许多重选择void setMultiSelectionEnabled(boolean b)设置是否允许多重选择 设置外观方法原型功能说明void setApproveB
20、uttonText(String approveButtonText)设置“确定”按钮的文字内容void setApproveButtonToolTipText(String ToolTipText)设置“确定”按钮的ToolTip文字File getCurrentDirectory()返回代表当前目录的对象String getDialogTitle()返回文件设置窗口标题 JFileChooser类应用实例import java.io.*;import javax.swing.JFileChooser;public class UseJFileChooser public static vo
21、id main(String args) File f = new File(我的文档); JFileChooser fileChooser = new JFileChooser(f); if (fileChooser.showOpenDialog(null) = FileChooser.APPROVE_OPTION) f = fileChooser.getSelectedFile(); System.out.print(您选择的文件是: + f.getPath(); else System.out.print(用户取消); 3. 字节流类族 层次结构图 抽象基类 InputStream抽象类
22、方法功能InputStream()构造方法:创建字节输入流对象int available()测试有多少字节可供读取abstract int read()抽象方法:读取一个字节int read(byte b)将读取的字节存入byte数组int read(byte b, int off, int len)将自off读取len个字节存入数组long skip(long n)读标志从数据源跳过n个字节boolean markSupported()测试可否在数据源中加标记void mark(int readLimit)在数据源的给定位置加标记void reset()重置上次加注的标记void close
23、()关闭数据源并释放资源 OutputStream抽象类方法功能OutputStream()构造方法:创建字节输出流对象abstract void write(int data)抽象方法:写出data中1字节数据void write(byte b)将byte数组中的数据写出void write(byte b, int off, int len)从off开始写出数组中len字节数据void flush()清空数据源对象void close()关闭数据源 文件字节流子类这组子类分别继承自抽象基类InputStream和OutputStream,并将外部文件作为流的来源(数据源),即从文件读,向文件
24、写。文件名可由已创建的File对象给出,也可由一个字符串给出,例如文件名为1.txt,则:File fi = new File(e:1.txt);FileInputStream fis = new FileInputStream(fi);或:FileInputStream fis = new FileInputStream(e:1.txt);在创建该对象的同时,文件也被打开。1 FileInputStream子类方法功能FileInputStream(File file)创建以File对象作为数据源的对象FileInputStream(String name)创建以文件name作为数据源的对象
25、int available()测试有多少字节可以从文件读取int read()从给定文件读取一个字节int read(byte b)读取数据放入byte数组, 并返回字节数int read(byte b, int off, int len)读取len个字节存入byte数组off位置long skip(long n)读标志从数据源跳过n个字节boolean markSupported()测试可否在数据源中加注标记void mark(int readLimit)在数据源的给定位置加注标记void reset()重置上次加注的标记void close()关闭数据源并释放资源 FileOutputSt
26、ream子类方法功能FileOutputStream(File file)创建以File作为数据源的对象FileOutputStream(String name)创建以name作为数据源的对象FileOutputStream(String name,boolean append)创建以name作为数据源的对象并指出是否以追加的方式写出void write(int data)向给定文件写出一个字节void write(byte b)将byte数组中的数据写到文件void write(byte b, int off, int len)从off开始写出数组len字节数据void flush()清空数
27、据源对象void close()关闭数据源程序实例:import java.io.*;public class UseFileInputStream public static void main(String args) File fi = new File(e:06143.txt); File fo = new File(d:06143.txt); try FileInputStream fis = new FileInputStream(fi); FileOutputStream fos = new FileOutputStream(fo); int ch, n = fis.availa
28、ble(); for (int i = 0; i n; i +) ch = fis.read(); fos.write(ch); fis.close(); fos.close(); catch (IOException e) System.err.println(e.getMessage(); 数组字节流子类这组子类分别继承自InputStream和OutputStream,但使用一个字节数组byte作为流的来源,该字节数组在ByteArrayInputStream中是作为构造方法参数表中的一个参数被引用;而在ByteArrayOutputStream中,则是作为类的属性被封装,即从给定的一个
29、byte数组读;向封装在对象内部的一个byte数组写。对数组进行I/O的目的是:因为数组在内存中,I/O速度远比文件快得多,当程序需要高速度、非永久性的I/O时,数组是最好的选择。 ByteArrayInputStream子类方法功能ByteArrayInputStream(byte d)创建以byte数组作为数据源的对象ByteArrayInputStream(byte d,int off, int len)创建以byte数组作为数据源的对象,数据的存储从off开始,使用len个字节int available()测试有多少字节可以从byte数组中读取int read()从byte数组读取一个字节int read(byte b)从byte数组读取数据到另一个byte数组int read(byte b, int off, i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1