Java的IO输入输出

可将Java 库的IO 类分割为输入与输出两个部分,这一点在用Web 浏览器阅读联机Java 类文档时便可知道。通过继承,从InputStream(输入流)衍生的所有类都拥有名为read()的基本方法,用于读取单个字节或者字节数组。类似地,从OutputStream 衍生的所有类都拥有基本方法write(),用于写入单个字节或者字节数组。然而,我们通常不会用到这些方法;它们之所以存在,是因为更复杂的类可以利用它们,以便提供一个更有用的接口。因此,我们很少用单个类创建自己的系统对象。一般情况下,我们都是将多个对象重叠在一起,提供自己期望的功能。我们之所以感到Java 的流库(Stream Library)异常复杂,正是由于为了创建单独一个结果流,却需要创建多个对象的缘故。


一、InputStream

InputStream 的作用是标志那些从不同起源地产生输入的类。这些起源地包括(每个都有一个相关的InputStream 子类):
(1) 字节数组
(2) String 对象
(3) 文件
(4) “管道”,它的工作原理与现实生活中的管道类似:将一些东西置入一端,它们在另一端出来。

(5) 一系列其他流,以便我们将其统一收集到单独一个流内。
(6) 其他起源地,如Internet 连接等


InputStream 的类型:


ByteArrayInputStream        允许内存中的一个缓冲区作为InputStream 使用

构建器参数:从中提取字节的缓冲区/作为一个数据源使用

使用方法:通过将其同一个FilterInputStream 对象连接,可提供一个有用的接口

StringBufferInputStream     将一个String 转换成InputStream

构建参数:一个String(字串)

使用方法:基础的实施方案实际采用一个StringBuffer(字串缓冲)/作为一个数据源使用。通过将其同一个FilterInputStream 对象连接,可提供一个有用的接口
FileInputStream                  用于从文件读取信息

构建参数:代表文件名的一个String,或者一个File 或FileDescriptor 对象/作为一个数据源使用。

使用方法:通过将其同一个FilterInputStream 对象连接,可提供一个有用的接口
PipedInputString                产生为相关的PipedOutputStream 写的数据。实现了“管道化”的概念
构建参数:PipedOutputStream/作为一个数据源使用。

构建方法:通过将其同一个FilterInputStream 对象连接,可提供一个有用的接口
SequenceInputStream       将两个或更多的InputStream 对象转换成单个InputStream

构建参数:使用 两个InputStream 对象或者一个Enumeration,用于InputStream 对象的一个容器/作为一个数据源使用。

构建方法:通过将其同一个FilterInputStream 对象连接,可提供一个有用的接口
FilterInputStream               对作为破坏器接口使用的类进行抽象;那个破坏器为其他InputStream 类提供了有用的功能。


二、OutputStream

这一类别包括的类决定了我们的输入往何处去:一个字节数组(但没有String;假定我们可用字节数组创建一个);一个文件;或者一个“管道”。除此以外,FilterOutputStream 为“破坏器”类提供了一个基础类,它将属性或者有用的接口同输出流连接起来。


OutputStream的类型:


ByteArrayOutputStream 在内存中创建一个缓冲区。我们发送给流的所有数据都会置入这个缓冲区。

构建参数:可选缓冲区的初始大小/用于指出数据的目的地。

构建方法:若将其同FilterOutputStream 对象连接到一起,可提供一个有用的接口
FileOutputStream 将信息发给一个文件

构建参数:用一个String 代表文件名,或选用一个File 或FileDescriptor 对象/用于指出数据的目的地。

构建方法:若将其同FilterOutputStream 对象连接到一起,可提供一个有用的接口
PipedOutputStream 我们写给它的任何信息都会自动成为相关的PipedInputStream 的输出。实现了“管道化”的概念

构建参数:PipedInputStream/为多线程处理指出自己数据的目的地

构建方法:将其同FilterOutputStream 对象连接到一起,便可提供一个有用的接口
FilterOutputStream 对作为破坏器接口使用的类进行抽象处理;那个破坏器为其他OutputStream 类提供了
有用的功能。


三、如何使用IO

利用层次化对象动态和透明地添加单个对象的能力的做法叫作“装饰器”(Decorator)方案。FilterInputStream 和FilterOutputStream (这两个名字不十分直观)提供了相应的装饰器接口,用于控制一个特定的输入流InputStream)或者输出流(OutputStream)。它们分别是从InputStream 和OutputStream 衍生出来的。此外,它们都属于抽象类,在理论上为我们与一个流的不同通信手段都提供了一个通用的接口。事实上,FilterInputStream 和FilterOutputStream 只是简单地模仿了自己的基础类,它们是一个装饰器的基本要求。

(1)通过F i l t e r I n p u t S t r e a m 从I n p u t S t r e a m 里读入数据

FilterInputStream 类要完成两件全然不同的事情。其中,DataInputStream 允许我们读取不同的基本类型数据以及String 对象(所有方法都以“read”开头,比如readByte(),readFloat()等等)。伴随对应的DataOutputStream,我们可通过数据“流”将基本类型的数据从一个地方搬到另一个地方。若读取块内的数据,并自己进行解析,就不需要用到DataInputStream。但在其他许多情况下,我们一般都想用它对自己读入的数据进行自动格式化。
剩下的类用于修改InputStream 的内部行为方式:是否进行缓冲,是否跟踪自己读入的数据行,以及是否能够推回一个字符等等。后两种类看起来特别象提供对构建一个编译器的支持(换言之,添加它们为了支持Java 编译器的构建),所以在常规编程中一般都用不着它们。
无论连接的是哪个IO 设备也许几乎每次都要缓冲自己的输入,所以IO 库最明智的做法就是将未缓冲输入作为一种特殊情况处理,同时将缓冲输入接纳为标准做法。

FilterInputStream 的子类:

DataInputStream 与DataOutputStream 联合使用,使自己能以机动方式读取一个流中的基本数据类型
(int,char,long 等等)

构建参数:InputStream

构建方法:包含了一个完整的接口,以便读取基本数据类型
BufferedInputStream 避免每次想要更多数据时都进行物理性的读取,告诉它“请先在缓冲区里找”
构建参数:InputStream

构建方法:没有可选的缓冲区大小/本身并不能提供一个接口,只是发出使用缓冲区的要求。要求同一个接口对象连接到一起
LineNumberInputStream 跟踪输入流中的行号;可调用getLineNumber()以及setLineNumber(int) 只是添加对数据行编号的能力,所以可能需要同一个真正的接口对象连接
PushbackInputStream 有一个字节的后推缓冲区,以便后推读入的上一个字符

构建参数:InputStream

构建方法:通常由编译器在扫描器中使用,因为Java 编译器需要它。一般不在自己的代码中使用


(2)通过F i l t e r O u t p u t S t r e a m 向O u t p u t S t r e a m 里写入数据

与DataInputStream 对应的是DataOutputStream,后者对各个基本数据类型以及String 对象进行格式化,并将其置入一个数据“流”中,以便任何机器上的DataInputStream 都能正常地读取它们。所有方法都以“wirte”开头,例如writeByte(),writeFloat()等等。
若想进行一些真正的格式化输出,比如输出到控制台,请使用PrintStream。利用它可以打印出所有基本数据类型以及String 对象,并可采用一种易于查看的格式。这与DataOutputStream 正好相反,后者的目标是将那些数据置入一个数据流中,以便DataInputStream 能够方便地重新构造它们。System.out 静态对象是一个PrintStream。
PrintStream 内两个重要的方法是print()和println()。它们已进行了覆盖处理,可打印出所有数据类型。print()和println()之间的差异是后者在操作完毕后会自动添加一个新行。
BufferedOutputStream 属于一种“修改器”,用于指示数据流使用缓冲技术,使自己不必每次都向流内物理性地写入数据。通常都应将它应用于文件处理和控制器IO。


四、一些实例

使用File创建文件实例

  1. package com.hxw.io;  
  2. import java.io.*;  
  3.    
  4. public class FileExample{  
  5.     public static void main(String[] args) {  
  6.        
  7.         createFile();  
  8.     }  
  9.    
  10.   /** 
  11.    * 文件处理示例 
  12.    */  
  13.   public static void createFile() {  
  14.      File f=new File("E:/电脑桌面/jar/files/create.txt");  
  15.         try{  
  16.             f.createNewFile();  //当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。  
  17.             System.out.println("该分区大小"+f.getTotalSpace()/(1024*1024*1024)+"G"); //返回由此抽象路径名表示的文件或目录的名称。  
  18.              // f.mkdirs();  //创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。可以直接使用creatNewFile时直接创建
  19.             // f.delete();   //删除此抽象路径名表示的文件或目录  
  20.            System.out.println("文件名  "+f.getName());  //  返回由此抽象路径名表示的文件或目录的名称。  
  21.            System.out.println("文件父目录字符串 "+f.getParent());// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。  
  22.             
  23.         }catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.   }  
  27. }  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值