Java的IO输入输出

来源:互联网 发布:泳道图制作软件 编辑:程序博客网 时间:2024/04/28 19:31

可将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. }  


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信身份信息验证未通过怎么办 快递地址填错了已经发到了怎么办 孩子威胁同学给她买东西吃怎么办 在超市买小孩米粉过期了怎么办 出口货物被海关扣了说仿牌怎么办 有一批仿牌被宁波海关查了怎么办 付了定金不想要车了怎么办 泥墙刮石灰上涂料现在刮腻子怎么办 月经最后一天同房了怎么办吃什么药 奶水太多了宝宝总是呛到了怎么办 婴儿刚吃完奶大量喷奶怎么办 我干活细致领导说我慢怎么办 怀孕初期吃了加明矾的粉皮怎么办 绿豆面黄豆面白面蒸馒头怎么办 画油画时把颜料染在衣服上怎么办 买的布衣柜少了一个管子怎么办 小2球刚好进2球怎么办 大2球刚好进2球怎么办 大球2进了2球怎么办 身上剩的几百块钱有掉了怎么办 刚买一天的手机电板有问题怎么办 宝宝长湿疹穿少了就感冒怎么办 照片跟视频被孩子删了怎么办 老公总是说一些不开心的话题怎么办 孩子沉迷手机篮球课不爱去怎么办 坐久了屁鼓会长疮怎么办 套胶的胶皮与海绵分离怎么办 换肾15天了沒尿怎么办? 妻子的绒癌怎么办?——急人! 孕妇结石掉在输尿管有血尿怎么办 吃葯时药片沾在食管臂上怎么办 八十多了膀胱癌手术复发了怎么办 尿蛋白和尿隐血2个加怎么办 小肝癌手术后两个月又复发了怎么办 膀胱癌血尿堵塞尿道和尿管怎么办 肾炎腰疼一条腿疼尿血怎么办 孕晚期尿常规检查尿蛋白高怎么办? 腰开车疼的不会动了怎么办 小孩跑完满头大汗就咳嗽怎么办 小孩剧烈咳嗽喘吃了药不管用怎么办 做什么事都有点轻微的手抖怎么办