• 1. Java I/O流1、File类 2、I/O流概述 3、字节流 4、字符流 5、对象流 6、随机访问文件
  • 2. File类File:文件,跟他名字一样,这个类主要是用来操作文件的。 主要包括文件/文件夹的创建、删除、读写属性等等。
  • 3. Iinput (输入), Ooutput(输出) 。 I/O流也就是输入/输出流。 大部分程序都需要输入/输出处理,比如从键盘读取数据、向屏幕中输出数据、从文件中读或者向文件中写数据、在一个网络连接上进行读写操作等。在Java中,把这些不同类型的输入、输出源抽象为流(Stream),而其中输入或输出的数据则称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了。I/O流概述
  • 4. 流一般分为输入流(Input Stream)和输出流(Output Stream)两类,但这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。当然,键盘只是一个输入流,而屏幕则只是一个输出流。 在Java开发环境中,主要是由包java.io中提供的一系列的类和接口来实现输入/输出处理。标准输入/输出处理则是由包java.lang中提供的类来处理的,但这些类又都是从包java.io中的类继承而来。 输入流:数据提供者,可从中读取数据出来 输出流:数据接受者,可往其中写数据 小技巧:不管是输入还是输出流,都是针对内存来说的,对内存进行写操作,那么源就是输入流;对内存进行读操作,那么源就是输出流。
  • 5. 标准流 语言包java.lang中的System类管理标准输入/输出流和错误流。 System.in:从InputStream中继承而来,用于从标准输入设备中获取输入数据(通常是键盘)。 System.out:从PrintStream中继承而来,把输出送到缺省的显示设备(通常是显示器)。 每当main方法被执行时,就自动生成上述三个对象。
  • 6. 下面是一个获取键盘输入的简单示例: import java.io.IOException; public class SystemStream_demo { public static void main(String[] args) { try{ byte b[]=new byte[1000]; String str; System.out.println("请输入一些字符,并以回车键结束输入:"); int index=System.in.read(b); str = new String(b, 0,index); System.out.print("你输入的内容是:"); System.out.println(str); }catch(IOException ioe){ System.out.println(ioe.toString()); } } }
  • 7. 字节流InputStream ByteArrayInputStream FileInputStream FilterInputStream BufferedInputStream DataInputStream LineNumberInputStream PushbackInputStream ObjectInputStream PipedInputStream SequenceInputStream StringBufferInputStreamOutputStream ByteArrayOutputStream FileOutputStream FilterOutputStream BufferedOutputStream DataOutputStream PrintStream ObjectOutputStream PipedOutputStream
  • 8. 所谓字节流,表示这个流所传输的数据单位是字节。 Java中每一种字节流的基本功能依赖于基本类InputStream和OutputStream,它们是抽象类,不能直接使用。 属于InputStream类的方法有:  read():从流中读入数据 skip():跳过流中若干字节数 available():返回流中可用字节数  mark():在流中标记一个位置 reset():返回标记过的位置 markSupport():是否支持标记和复位操作 close():关闭流
  • 9. 在InputStream类中,方法read()提供了三种从流中读数据的方法: int read():从输入流中读一个字节,形成一个0~255之间的整数返回(是一个抽象方法)。 int read(byte b[]):读多个字节到数组中,填满整个数组。  int read(byte b[], int off, int len):从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取得字节数。 对于后两个方法,若返回-1,表明流结束,否则,返回实际读取的字节数。
  • 10. 属于OutputStream类的方法有:  write(int b):将一个整数输出到流中(只输出低位字节,为抽象方法) write(byte b[]):将字节数组中的数据输出到流中 write(byte b[], int off, int len):将数组b中从off指定的位置开始,长度为len的数据输出到流中  flush():刷空输出流,并将缓冲区中的数据强制送出  close():关闭流
  • 11. 字节流分类文件流 过滤流:缓冲流、数据流、其他过虑流 标准流 对象流 管道流 内存流 顺序输入流
  • 12. 文件流 FileInputStream类用来打开一个输入文件,若要打开的文件不存在,则会产生例外FileNotFoundException,这是一个非运行时例外,必须捕获或声明抛弃;  FileOutputStream类用来打开一个输出文件,若要打开的文件不存在,则会创建一个新的文件,否则原文件的内容会被新写入的内容所覆盖。 注意:在进行文件的读/写操作时,会产生非运行时例外IOException,必须捕获或声明抛弃(其它的输入/输出流处理时也同样需要进行输入/输出例外处理)。
  • 13. 文件流的构造方法: FileInputStream(File f) 打开一个以f描述的文件作为输入。 FileInputStream(String name) 打开一个文件路径名为name的文件作为输入。  FileOutputStream(File f) 创建一个以f描述的文件作为输出,文件如果已经存在,则其内容清 空。  FileOutputStream(String name) 创建一个文件路径名为name的文件作为输出,文件如果已经存在,则其内容被清空。  FileOutputStream(String name, boolean append) 创建一个文件路径名为name的文件作为输出,文件如果已经存在,则在该输出上输出的内容被接到原有内容之后。
  • 14. 一个简单文件流的示例: import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileInputStream_demo { public static void main(String[] args) { try { //指定输入的文件 FileInputStream f=new FileInputStream("e:/goods.txt"); //指定输出的文件 FileOutputStream f1=new FileOutputStream("e:/demo.txt");
  • 15. //创建一个字节数组,用来保存在文件中读取的字符 byte[] b=new byte[1000]; //定位数组中存在的元素 int index=0; try { //判断是否已经读取到最后 同时保存数组中的元素个数 while((index=f.read(b))!=-1) { String str=new String(b,0,index); //写入文件 f1.write(b); //在控制台打印 System.out.print(str); } f.close(); f1.close();
  • 16. } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } } }
  • 17. 缓冲流: 类BufferedInputStream和BufferedOutputStream实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流"捆绑"到缓冲流上,可以提高该I/O流的读取效率。 在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。缺省时是用32字节大小的缓冲区;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等; 下面是缓冲流的构造方法: BufferedInputStream(InputStream in[, int size]) BufferedOutputStream(OutputStream out[, int size])
  • 18. 将缓冲流与文件流相接: FileInputStream in = new FileInputStream("file1.txt"); FileOutputStream out = new FileOutputStream ("file2.txt"); BufferedInputStream bin = new BufferedInputStream(in,256) BufferedOutputStream bout = new BufferedOutputStream(out,256); int len; byte b []=new byte[256]; len=bin.read(b); //len中得到的是实际读取的长度, b中得到的是数据
  • 19. 缓冲流中的大部分方法是和文件输入输出流一样的,只是在构造的时候会有一些不一样而已(需要嵌套一个基础流)。 注意:流关闭的顺序,应该是先关闭缓冲流,再关闭基础流。虽然很多时候我们会发现即使不关闭流也不会对程序的最终结果有什么影响,但是对于一个大的系统来说,使用流之后不关闭一定会造成资源的浪费,导致整个程序的效率变慢。 下面我们来看一个文件复制的示例,使用到了文件输入输出流和缓冲流。 public class file_copy { public static void main(String args[]) { int num=0; int b=0; FileInputStream fis=null; FileOutputStream fos=null; BufferedInputStream f1=null; BufferedOutputStream f2=null; File file=new File("F:/电影/MVI_1111.avi");
  • 20. try{ fis=new FileInputStream("F:/电影/MVI_1111.avi"); fos=new FileOutputStream("e:/1.avi"); f1=new BufferedInputStream(fis); f2=new BufferedOutputStream(fos); while((b=f1.read())!=-1) { f2.write(b); } f1.close(); f2.close(); fis.close(); fos.close(); }catch(FileNotFoundException e1) { System.out.println("找不到指定文件!"); System.exit(-1); }
  • 21. catch(IOException e2) { System.out.println("文件复制错误!"); System.exit(-1); } System.out.println("文件已经复制!"); } }
  • 22. 数据流接口DataInput和DataOutput,设计了一种较为高级的数据输入输出方式:除了可处理字节和字节数组外,还可以处理int、float、boolean等基本数据类型,这些数据在文件中的表示方式和它们在内存中的一样,无须转换,如read(), readInt(), readByte() …,write(), writeChar(),writeBoolean()…此外,还可以用readLine()方法读取一行信息。 下面我们来了解一下这两个接口中的方法。
  • 23. DataInput接口中的方法boolean readBoolean() byte readByte() short readShort() char readChar() int readInt() long readLong() double readDouble() float readFloat() int readUnsignedByte() int readUnsignedShort()
  • 24. void readFully(byte[] b) 读满字节数组,不同于InputStream.read void readFully(byte[] b, int off, int len) 读满指定长度,不同于InputStream.read int skipBytes(int n) 与InputStream.skip等价 String readUTF() 安类UTF-8形式从输入中读取字符串 String readLine() 按回车(\r)换行(\n)为分割符读取一行字符串 不完全支持UNICODE
  • 25. DataOutput接口中的方法void writeBoolean(boolean v) void writeByte(int v) void writeShort(int v) void writeChar(int v) void writeInt(int v) void writeLong(long v) void writeFloat(float v)  void writeDouble(double v)
  • 26. void write(byte[] b) 与OutputStream.write同义 void write(byte[] b, int off, int len) 与OutputStream.write同义 void write(int b) 与OutputStream.write同义 void writeBytes(String s) 只输出每个字符的低8位;不完全支持UNICODE。 void writeChars(String s) 每个字符在输出中都占两个字节。
  • 27. putDataInputStream和DataOutputStream数据流类 DataInputStream和DataOutputStream的处理对象除了是字节 或字节数组外,还可以实现对文件的不同数据类型的读写。 下面是这两个类的一些基本特点: 1、分别实现了DataInput和DataOutput接口 2、在提供了字节流的读写手段的同时, 3、以统一的通用的形式向输入流中写入boolean,int,long,double等基本数据类型,并可以在次把基本数据类型的值读取回来。 4、提供了字符串读写的手段。 5、分别是FilterInputStream 和FilterIOutputStream 的子类,所以他们也属于过滤流。
  • 28. 数据流类DataInputStream和DataOutputStream属于过滤流,所以他们并不能够直接使用。和缓冲流一样,他们在构造的时候需要嵌套一个基础流。 下面是数据流的一个示例: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class DateInputStream { public static void main(String args[]) throws IOException { //连接文件(写入文件) FileOutputStream fos = new FileOutputStream("e:/a.txt"); //数据流 DataOutputStream dos = new DataOutputStream (fos);
  • 29. //往文件中写入数据 dos.writeBoolean(true); dos.writeByte((byte)123); dos.writeChar(‘G'); dos.writeDouble(3.1415926); dos.writeFloat(2.7182f); dos.writeInt(1234567890); dos.writeLong(998877665544332211L); dos.writeShort((short)11223); dos.writeUTF("测试"); //关闭连接 dos.close(); fos.close(); //连接文件(读取文件数据) FileInputStream fis = new FileInputStream("e:/a.txt"); //数据流 DataInputStream dis = new DataInputStream(fis);
  • 30. //读取相关数据 System.out.println(dis.readBoolean()); System.out.println(dis.readByte()); System.out.println(dis.readChar()); System.out.println(dis.readDouble()); System.out.println(dis.readFloat()); System.out.println(dis.readInt()); System.out.println(dis.readLong()); System.out.println(dis.readShort()); System.out.println(dis.readUTF()); //关闭连接 dis.close(); fis.close(); } }
  • 31. 这个程序表面上看是没有任何问题的,但是实际上问题很严重。 我们可以打开E盘下的a.txt文件,很遗憾,和我们所插入的并不一样,所有数据都已经变成了乱码。 事实上,我们很多时候不会使用数据流来读写文件,数据流更多的被用在网络数据的传输上。 出现乱码的原因是编码的问题,关于编码,我们将在后面有一个专门的补充。到时候我们再回过头来看这个问题就会容易理解的多。
  • 32. (本页无文本内容)
  • 33. (本页无文本内容)
  • 34. (本页无文本内容)
  • 35. (本页无文本内容)
  • 36. (本页无文本内容)
  • 37. (本页无文本内容)
  • 38. (本页无文本内容)
  • 39. (本页无文本内容)
  • 40. 做一个文件查看器 CD C:// 进入一个目录 dir 显示当前目录的子目录 delete c://file.text 删除文件 tree 显示所有子文件 create aa 创建文件 delete all/清除垃圾文件 创建一个500M的文件 等等 做一个游戏数据保存文件