• 1. Copyright 2008 By Neusoft Group. All rights reserved流和文件I/O流和文件I/O概览 文本文件I/O File类 基本的二进制文件I/O 用对象流进行对象I/O
  • 2. 学习目标熟悉I/O流的概念。 理解二进制文件和文本文件之间的区别。 学习怎样用Java程序将数据保存到一个文件中。 学习如何用Java程序从一个文件中读取数据。 学习怎样分别使用ObjectOutputStream类和ObjectInputStream类向二进制文件中写入或从中读取对象。
  • 3. 流和文件I/O概览流的概念: Java Input/Output, 简称Java I/O 从键盘读取数据、操作文件和目录、对文件中进行读写、都是输入输出的处理。 Java语言用统一的接口------流(Stream),来抽象不同类型的输入输出源。 输入流:用于输入数据到程序的流。 输出流:用于从程序输出数据的流; Java API中通过类库 java.io 和java.nio(JDK1.4)来实现I/O处理。
  • 4. 流模型如同水管的水流一般输入源输出源程序读取输入流输出流写入
  • 5. 流和文件I/O概览为什么要用文件进行I/O: 暂时性数据 vs 永久性存储 文本文件 & 二进制文件 任意文件都是存储的二进制数字。 文本文件(text file):被当作字符序列,并拥有一些使二进制数字对程序和编辑器来说就像字符一样的流和方法。 二进制文件(binary file):保存的内容必须作为二进制数字序列处理的文件。
  • 6. 流和文件I/O概览文本文件和二进制文件的特点 文本文件(text file): 为人类使用而设计; 可以方便地迁移到不同的计算机上; 可用文本编辑器进行读、写操作; 二进制文件(binary file): 为程序操作而设计; 处理效率比文本文件高; 读入和写出通常由程序完成。
  • 7. 流和文件I/O概览字节流  stream 从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。 字符流  reader & writer 从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。
  • 8. 字节输入流结构图
  • 9. 字节输出流结构图
  • 10. 字符输入流结构图
  • 11. 字符输出流结构图
  • 12. 流和文件I/O概览文件处理 File、RandomAccessFile; 接口  interface DataInput、DataOutput、ObjectInput、ObjectOutput; 数据流:是指在计算机的输入输出之间运动的数据序列。 输入流:代表从外设流入程序的数据序列; 输出流:代表从程序流向外设的数据序列。 字节流:在输入输出过程中以字节为单位。 字符流:在输入输出过程中以字符为单位。
  • 13. 文本文件I/O用PrintWriter进行的文本文件输出 例:TextFileOutputDemo.java 注意: 程序中的文件名以String的形式存在; 例程中outputStream流被连接到out.txt文件,out.txt的原有内容会被清空,如果out.txt原本不存在,将被新建。 可以通过调用FileOutputStream(String name, boolean append )来向原有文件中添加内容。 流对象在完成输入/输出操作完成后,应该关闭:close()。
  • 14. 文本文件I/O带有BufferedReader的文本文件输入 缓冲区的概念 例:TextFileInputDemo.java 注意: BufferedReader 中没有像Scanner里的nextInt()等专门读取数字的方法,所以需要先作为String读入,再转换成数字。 BufferedReader中的方法read(),用于读取单个字符,但返回的是int类型的值。 例:TextFileInputDemo2.java
  • 15. 文本文件I/O使用路径名 全路径(绝对路径):包括从根目录开始的完整路径名; 相对路径:从程序所处目录开始,直到文件的路径。 可以使用“/”代替“\”作为路径名的分隔符。 对文件末尾进行测试 BufferedReader的readLine()去读取文件末尾的内容时,会返回null值。 而read()读取文件末尾返回-1 例:TextEOFDemo.java
  • 16. 文本文件I/O课堂练习 编写程序对一个保存数字的文本文件进行搜索,将文件中的最大数、最小数及文件中所有数字的平均值显示在屏幕上。文件中每一行保存一个数字。
  • 17. 文本文件I/OStringTokenizer类与String.split() BufferedReader没有读入单个单词的方法,可以用StringTokenizer将文本内容划分为单词。 但通常可以用String.split(String regex)代替该类的使用。 例:TokenTest.java
  • 18. File类使用File类 File类不是一个I/O流类。 File类用于获取磁盘中文件或目录的信息。 File类的对象并不打开文件,也不提供任何文件处理功能。然而,java.io包中的其它类经常使用File对象来指定要操作的文件或目录。 例:FileClassDemo.java FileClassDemo2.java
  • 19. File类图形界面编程补充 JTextArea:显示纯文本的多行区域。 JFileChooser:为用户选择文件提供了一种简单的机制。 常用方法: getSelectedFile( ) showOpenDialog(Component parent) showSaveDialog(Component parent) 例:JFileChooserDemo.java
  • 20. File类课堂练习 编写一段代码实现如下功能:将两个文本文件(文件A和文件B)中的内容合并,并写到一个新的文件(C)中。 修改前面的实例: JFileChooserDemo.java,实现功能: 将选中的文件内容显示在文本域(JTextArea)中; 将文本域(JTextArea)中的内容保存为一个新文件。
  • 21. 基本的二进制文件I/O用ObjectOutputStream类向二进制文件输出 该流可以自动将数字和字符转换成字节存储在文件中。 可以输出任意基本类型的值。 要输出String时,用的是writeUTF()。 例:BinaryOutputDemo.java
  • 22. 基本的二进制文件I/O用ObjectInputStream从二进制文件读入 经常配合ObjectOutputStream使用。 允许从同一个文件中读取不同类型的输入,但如果文件中的下一个数据条目不是读方法所期待的类型,结果很可能出错。 例:BinaryInputDemo.java OpenFileDemo.java
  • 23. 基本的二进制文件I/OEOFException 使用从二进制文件中读取数据的方法,都会在试图读取超出文件末尾的内容时抛出一个EOFException,因此可以用EOFException检测是否达到文件末尾。 例:EOFExceptionDemo.java FileInputStream和FileOutputStream类 用于对文件操作的字节流。 例:Doubler.java
  • 24. 基本的二进制文件I/O课堂练习 建立一个用户注册和登录的界面,注册界面输入用户名和密码,按照“用户名/密码”的格式以二进制的方式保存在user.dat文件中;登录界面输入用户名和密码,与user.dat文件中的数据进行比较,然后在界面上通过一个JLabel的文本显示验证的结果。
  • 25. 基本的二进制文件I/O文件的随机访问 RandomAccessFile类的实例支持对随机访问文件的读取和写入。 随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。 存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。 例:RandomAccessData.java
  • 26. 基本的二进制文件I/O课堂练习 对前面的注册/登录练习进行改写,利用RandomAccessFile记录多条用户/密码记录。
  • 27. 用对象流进行I/O类对象的二进制I/O 对象能记录自己状态以便将来再恢复的能力 ObjectOutputStream/ObjectInputStream writeObject()/readObject() 可串行化(serializable) 例:Species.java、ClassIODemo
  • 28. 用对象流进行I/OSerializable接口 串行码 在任何一个文件中只存储一种类型的数据 二进制文件中的数组对象 例:ArrayIODemo.java
  • 29. 其他常用流管道流 PipedInputStream和PipedOutputStream 用于在不同的线程间直接传送数据。 内存的访问 ByteArrayInputStream和ByteArrayOutputStream 为提高安全而禁止任何程序直接对内存进行操作。 内存虚拟/映像文件,是把内存中的数据存储缓冲区虚拟成一个文件,对这个特定的文件进行读取操作,而这个缓冲区就是一个大的字节数组,这两个类提供了许多方法实现虚拟内存或者映像文件类似的功能。
  • 30. 其他常用流压缩文件流 java.util.zip包 ZipOutputStream、GZIPOutputStream、JarOutputStream 顺序流 SequenceInputStream和SequenceOutputStream统一若干不同的流。
  • 31. Copyright © 2008 版权所有 东软集团