• 1. Java文件与流第6章
  • 2. 6.1 引言和本章任务 理解Java流类的层次关系; 掌握InputStream和OutputStream类及其一些重要子类的用法; 能区分字节流和字符流的概念; 掌握随机访问文件的处理; 学会利用File类来获取文件的各种信息。2
  • 3. 6.2 基础知识链接3
  • 4. 6.2.1 Java文件与流概述 (1)ObjectRandomAccessFileInputStreanOutputStreanFileFileOutputStreanFilterOutputStreanPipeOutputStreanFileInputStreanFilterInputStreanPipeInputStrean4
  • 5. 流的分类(2)按处理数据的类型,流可以分为字节流与字符流,输入字节流的类为InputStream,输出字节流为OutputStream,输入字符流为Reader,输出字符流为Writer InputStream类和OutputStream类是Java的两个主要流类,这两个类主要用来处理字节流,它们都是抽象类。对于标准输入System.in和标准输出System.out都是它们的子类。 5
  • 6. 流的分类(3)Reader类与InputStream类基本功能相同,只是Reader类以字符(char)为单位读入。Writer类与OutputStream类基本功能也相同,只是Writer类也是以字符(char)为单位读入。 Java提供RandomAccessFile类来实现随机访问存储在文件不同位置的记录,即随机文件存取。 6
  • 7. 流的分类(4)Java还提供了一个File类用于获取磁盘中的文件或目录信息,File类的对象并不打开文件,也不提供任何文件处理功能。 7
  • 8. 6.2.2 标准输入输出(1)在JDK中提供了一个System类,该类用于管理标准输入输出流和错误流当用户开始运行Java应用程序或applet时,会自动建立3个对象:System.in、System.out、Syetem.err,与这些对象相联系的流可以为程序提供与指定文件或设备间的通信信道。 8
  • 9. 标准输入输出 (2)System.in是属于BufferedInputStream类型System.out是属于PrintStream类型 System.err也是属于PrintStream类型9
  • 10. PrintStream类PrintStream类 println() 是PrintStream类的方法,能提供复杂的输出 PrintStream类的方法有: write, flush, checkError,print, println,close. 其中println可以输出多种形式的数据.例如: println(String s), println(char c)等10
  • 11. 6.2.3 字节流InputStream类和OutputStream类用于来处理字节流,前面介绍了,这两个类都是抽象类,它们分别为其子类定义了文件处理一些通用处理方法。 11
  • 12. 字节流(2) :InputStream类属于InputStream类的方法有: read():从流中读入数据 skip():跳过流中若干字节数 available():返回流中可用字节数 mark():在流中标记一个位置 reset():返回标记过的位置 markSupport():是否支持标记和复位操作 close():关闭流12
  • 13. 字节流(3) :InputStream类InputStream类重要的子类有: FileInputStream, FilterInputStream ,PipedInputStream 13
  • 14. 字节流(4) : OutputStream类属于OutputStream类的方法有: write(int b):将一个整数输出到流中 write(byte b[]):将数组中的数据输出到流中 write(byte b[], int off,int len):将数组b中从off指定的位置开始len长度的数据输出到流中 flush():将缓冲区中的数据强制送出 close():关闭流14
  • 15. 字节流(5) : OutputStream类OutputStream类重要的子类有: FileOutputStream ,FilterOutputStream ,PipedOutputStream 15
  • 16. 文件输入输出流 从磁盘文件中读取数据,或者将数据写入文件,需要用文件输入、输出流类FileInputStream和FileOutputStream。 例如: File myFile = new File(“MyFile”); DataInputStream din = new DataInputStream (new FileInputStream(MyFile); DataOutputStream dout = new DataOutputStream (new FileOutputStream(MyFile);16
  • 17. 过滤流FilterInputStream和FilterOutputStream提供了一些额外的功能,这些功能提供监视行号、缓冲功能等。 其重要的子类有:BufferedInputStream,DataInputStream17
  • 18. 缓冲区流(1)增加缓冲区流,减少访问硬盘的次数,提高效率文件文件流 缓冲区流 file1.txtfile2.txt输入流输出流输入缓冲区输出缓冲区18
  • 19. 缓冲区流(2)缓冲区流: BufferedInputStream和 BufferedOutputStream 将它们与文件流相接 FileInputStream in=new FileInputStream(“file1.txt”); BufferedInputStream bin= new BufferedInputStream(in,256);//256字节大小的buffer19
  • 20. 缓冲区流(3)只有缓冲区满时,才会将数据送到输出流. Java在输出数据流中,当对方尚未将数据取走时,程序就会被阻塞. 有时要人为地将尚未填满的缓冲区中的数据送出,使用flush()方法.文件20
  • 21. 数据输入输出流(1)文件流和缓冲区流的处理对象是字节或字节数组,利用数据输入输出流可以实现对文件的不同数据类型的读写. DataInputStream、DataOutputStream 一种较为高级的数据输入输出方式,除了字节和字节数组,还可以处理int,float,boolean等类型. 还可以用readLine方法读取一行信息 可使用的方法: write,writeBoolean…,read,readByte…等 21
  • 22. 数据输入输出流(2)数据流的建立 FileOutputStream fos=new FileOutputStream(”file2.txt")); DataInputStream dis=new DataInputStream(fos) 数据输出流可以是一个已经建立好的输入数据流对象,例如网络的连结,文件等。 下面的例子显示如何利用数据输入输出流往文件中写不同类型的数据22
  • 23. 数据输入输出流(3)class Datainput_output{ public static void main(String args[]) throws IOException { FileOutputStream fos=new FileOutputStream(“a.txt”); DataOutputStream dos=new DataOutputStream (fos); try{ dos.writeBoolean(true); dos.writeByte((byte)123); dos.writeChar('J'); dos.writeDouble(3.141592654); dos.writeFloat(2.7182f); dos.writeInt(1234567890); dos.writeLong(998877665544332211L); dos.writeShort((short)11223); }finally{ dos.close(); }23
  • 24. 数据输入输出流(4) DataInputStream dis=new DataInputStream( new FileInputStream(”a.txt")); try{ System.out.println("\t "+dis.readBoolean()); System.out.println("\t "+dis.readByte()); System.out.println("\t "+dis.readChar()); System.out.println("\t "+dis.readDouble()); System.out.println("\t "+dis.readFloat()); System.out.println("\t "+dis.readInt()); System.out.println("\t "+dis.readLong()); System.out.println("\t "+dis.readShort()); }finally{dis.close();} }}24
  • 25. 6.2.4 字符流 InputStream类和OutputStream类用于来处理字节流 Reader类和Writer类则用来处理字符流 Reader类和Writer类提供的主要接口方法与InputStream类和OutputStream类非常类似,只是将基于byte类型的参数改为基于char的参数 Reader类和Writer类的接口方法都是抽象方法,没有具体的实现。25
  • 26. 6.3 案例6及其分析:对文件进行加密 具体分析见书上26
  • 27. 6.4 扩展知识 27
  • 28. 文件目录zip文件6.4.1 随机访问文件类RandomAccessFile 目录文件给出个文件的入口,可以随机读取. 创建一个随机文件 new RandomAccessFile(“file1.txt”, “r”); new RandomAccessFile(“file2.txt”, “rw”); 随机文件可以同时完成读和写操作.28
  • 29. pos随机存取文件(2)支持随机文件操作的方法: readXXX()或writeXXX() skipBytes();将指针乡下移动若干字节 seek():将指针调到所需位置 getFilePointer():返回指针当前位置 length():返回文件长度 利用seek(long pos)方法查找随机文件中的信息 例:把若干个32位的整数写到一个名为 “temp.txt”的文件中,然后利用seek方法,以相反的顺序再读取这些数据29
  • 30. 随机存取文件(3)import java.io.*; public class RandomFile{ public static void main(String args[]){ int data_arr[]={12,31,56,23,27,1,43,65,4,99}; try { RandomAccessFile randf=new RandomAccessFile("temp.txt","rw"); for (int i=0;i=0;i--) { randf.seek(i*4); System.out.println(randf.readInt()); } randf.close(); }catch (IOException e) { System.out.println("File access error: "+e); } } }30
  • 31. 随机存取文件(4)31
  • 32. 6.4.2 File类File类并不能真正打开一个文件或提供任何文件操作功能,它主要的功能是检查一个文件是否存在以及使用文件类获取文件的路径信息等 设f是一个文件对象 File f=new File(“data”,temp.dat”); f.getName():返回文件名 temp.dat f.getParent():返回文件所在目录名 data f.getPath():返回文件路径 data\temp.dat f.getAbsolutePath():返回绝对路径 c:\myprog\data\temp.dat32
  • 33. 文件的其它操作-File类例: 获取当前目录下所有文件名和文件的尺寸: import java.io.*; public class file_size{ public static void main(String args[]) { File files=new File(“.”); String file_list[]=files.list(); for(int i=0;i
  • 34. File类的其它方法boolean canRead():文件是否可读 boolean canWrite():文件是否可写 boolean exists():文件是否存在 boolean isFile():是否是文件 boolean isDirectory():是否是路径34
  • 35. 小结2-1在Java中有数据传输的地方都用到I/O流 (通常是文件,网络,内存和标准输入输出等) InputStream 和OutputStream是所有字符流的祖先,read和write是它们最基本的方法,读写单位是字节.35
  • 36. 小结2-2File, File(Input/Output)Stream, RandomAccessFile是处理本地文件的类 Data(Input/Output)Stream是一个过滤流的子类,借此可以读写各种基本数据, 在文件和网络中经常使用.如: readByte, writeBoolean等. Buffered(Input/Output)Stream的作用是在数据送到目的之前先缓存,达到一定数量时再送到目的,已减少阻塞次数.36