第十五章 I/O(输入/输出)

在变量、数组和对象中存储的数据是暂时存在的,程序结束后它们就会丢失。想要永久的储程序创建的数据,就需要将保存在磁盘文件中,而只有数据存储起来才可以在其他程序中使用它们。

流的概念和作用
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

15.1输入/输出流

流是一组有序的数据序列。根据操作的类型,可分为输入流和输出流两种。I/O(Input/Qutput,输入/输出),就提供了一条通道程序,可以使用这条通道把源中和目的地也可以是键盘、鼠标、内存或显示窗口等。

Java有数据流处理输入/输出模式,程序从指向源的输入流中读取源中的数据,如图15.1所示。源文件可以是文件、网络、压缩包或其他数据源。

输出流的指向是数据要到达目的地。程序通过向输出流中写入输出流中写出数据把信息传递到目的地,如图15.2所示。输出流的目标可以是文件、网络、压缩包、控制台和其他数据输出目标。

Java语言定义了许多类专门负责各种方式的输入/输出,这些类都被放在java.io包中。其中,所有输入流类都是抽象类InputStream(字节流入流)或抽象类Reader(字符输入流)的子类;而所有输入流类都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。

15.1.1输入流

InputStream类是字节输入流的抽象类,它是所有字节输入流的父类。InputStream类的具体层次的构图15.3所示。

该类中所有方法遇到错误时都会引发IOException异常。下面是对该类中一些方法的简要说明:

<read()方法:从输入流中读取数据的下一个字节。返回0~255的int字节数。如果因为已经到达流末尾而没有可用的字节,则返回值为-1。

<read(int readlimit):从输入流中读入一定长度的字节,并以整数的形式返回字节数。

<:mark(int readlimit)方法:在输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数。

<rest()方法:将输入指针返回到当前所做的标记处。

<skip(long n)方法:跳过输入流上的n个字节并返回实际跳过的字节数。

<markStream()方法:如果当前流支持mark()/reset()操作就返回true。

<close方法:关闭此输入流并释放与该流关联的所有系统资源。

Java中的字符是Unicode编码,是双字节的。InputStream类是用来处理字节的,并不是处理字符文本。Java为字符文本的输入专门提供了一套单独的类,即Reader类,但Reader类并不是InputStream类的替换者,只是在处理字符串时简化了编程。Reader类是字符输入流的抽象类,所有字符处理流的实现都是它的子类。Reader类的具体层次结构如图15.4.

Reader类中的方法与InputStream类中的方法类似,读者在需要时可查看JDK文档。

15..1.2输出流

QutputStream 类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类。QutputStream类的具体层次如图15.5所示。

QutputStream类中的所有方法均返回void ,在遇到错误时会因引发IEOception异常。下面是对QutputStream类中的一些方法的简要说明:

<write(int  b)方法:将指定的字节写入此输出流。

<write(byte[]b)方法:将b个字节从指定的byte数组写入此输出流。

<write(byte[] b,int off,int len) 方法:将指定的数组中从偏移量off开始的len个字节写入此输出流。

<flush()方法:彻底完成输出并清空缓存区。

<close()方法:关闭输出流的抽象类,所有字符输出类的实现都是它的子类。Writer 类的层次结构如图15.6所示。

15.2File类

File类是java.io包中唯一代表磁盘文件本身的类。File 类定义了一些与平台无关的方法来操作文件,可用通过调用File类中的方法,实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等。数据流可用将数据写入文件中,文件也是数据流最常用的数据媒体。

15.2.1文件的创建与删除

可用使用File类创建一个文件对象。通常使用以下3种构造方法来创建文件对象。

1.File(String pathname)

该构造方法通过将给定的路径名字符串名字转换为抽象路径名来创建一个新的File实例。

语法如下:

new File (String pathname)

其中,pathname代表路径名称(包含文件名)。例如:

File file =new File("d:/1.txt"); 

2.File(String parent,String child)

该构造方法根据定义的父路径和子路径字符串(包含文件名)创建一个新的File对象。语法如下:

new File (String parent  String child) 

代码如下:

运行结果如下:

如果D盘没有word.txt文件,输出内容:文件已创建  如果D盘有word.txt文件,输出内容:文件已删除。

获取文件信息

代码如下:

运行结果如下:

代码如下:

运行结果如下:


IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
字节流:一次读入或读出是8位二进制。
字符流:一次读入或读出是16位二进制。
设备上的数据无论是图片或者视频,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。
结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
输入流和输出流
输入流只能进行读操作,输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

输入字节流 InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类。ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。
输出字节流 OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类。ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据。
ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。

文件输入/输出流
       程序运行期间,大部分数据都在内存中进行操作,当程序结束或关闭时,这些数据将消失。如果需要将数据永久保存,可使用文件输入
输出流与指定的文件建立连接,将需要的数据永久保存文件中。 
FileInputStream 类与 FileOutputStream 类 
      FileInputStream 类与 FileOutputStream 类 都用来操磁盘文件。如果用户的文件读取要求比较简单,则可以使用  FileInputStream 类,该类继承自 InputStream 类。FileOutputStream 类是 OutputStream 类的子类。
        FileInputStream 类常用的构造方法:
FileInputStream(String name)
FileInputStream(File file)

代码如下:

运行结果如下:

代码如下:

运行代码如下:

带缓存的输入/输入流
        缓存时 I/O 的一种性能优化。缓存流为 I/O 流增加了内存缓存区,使得再流上执行 skip()、mark()、和 reset()方法成为可能。BufferedReader 与 BufferedWriter 类 
        BufferedReader 类与 BufferedWriter 类分别继承 Reader 与 Writer 类。这两个类同时具有内部缓存机制,并能够以行单位进行输入\输出。
BufferedReader 类常用的方法如下: 
read()方法:读取单个字符
readLine()方法:读取一个文本行,并将其返回为字符串。若无数据可读,返回null。
BufferedWriter 类中的方法都返回void。常用的方法如下:
write(String s,int off,int len)方法:写入字符串的某一部分
flush()方法:刷新该流的缓存
ewLine()方法:写入一个行分隔符

代码案例:

运行结果如下:

数据输入/输出流 
       数据输入/输出流 (DataInputStream 类与 DataOutputStream 类)允许应用程序以与机器无关的方式从底层输入流中读取基本 Java 数据类型。也就是说,当读取一个数据时,不必关心这个数值应当是哪个字节。
DataInputStream 类提供了将字符串、double 数据、int 数据、Boolean 数据写入文件的方法;DataOutputStream 类只提供了一个readUTF()方法返回字符串。
DataInputStream 类与 DataOutputStream 类的构造方法:
DataInputStream(DataInputStream in):使用指定的基础 InputStream 对象创建一个 DataInputStream 对象。DataOutputStream(DataOutputStream out):创建一个新的数据输出流,将数据写入一个指定基础输出流。

代码案例:

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值