java基础知识I/O流使用详解

 更新时间:2014年01月03日 09:57:18   作者:  
编程语言的I/O类库中常常使用流这个抽象的概念,它代表任何有能力产生数据的数据源对象或时有能力接收数据的接收端对象,本文为大家介绍Java中I/O系统基础知识

“流”概念源于UNIX中的管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等,它屏蔽了实际的I/O设备中处理数据的细节。   一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 流的方向是重要的,根据流的方向,流可以分为两类:输入流和输出流。其实输入/输出是想对于内存来说的。实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对于输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。

a.流:一组有序的数据序列。
b字节流:数据流中最小的数据单元是字节。
c.字符流:数据流中最小的数据单元是字符。

 一.  java.io包中的类对应两类流

一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流,其他的流则称为过滤流(包装流)

过滤流:一些流可以从文件以及其他地方接收字节,另一些流可以将字节组合成更有用的数据类型。将一个已经存在的流传递给另一个流的构造方法,将这两种流结合起来,结合后的流被称为过滤流。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流也类似。我们很少用单一的类来创建流对象,而是通过叠合多个对象来提供所期望的功能(即装饰器设计模式)。

java的常用输入、输出流其实都是继承自4个抽象类,分别是:

基于单字节的InputStream,OutputStream类(面向字节形式的I/O)
基于双字节的Unicode代码单元的 Reader, Writer类(面向字符形式的I/O)
一旦打开输入流后,程序就可从输入流串行地读数据。从输入流读/写数据的过程一般如下:打开一个流通道-->读取/写信息-->关闭流通道。

在java平台中,有以下两种方式能获得本地平台的字符编码类型:

(a)System.getProperty("file.encoding");

(b) Charset cs=Charset.defaultCharset();

所有的输入流、输出流都可以分为字节(输入、输出)流,字符(输入、输出)流,处理字节的主要是(OutputStream/InputStream) 系列,处理字符的,主要是(Reader/Write)系列

二.以字节(Byte)为导向的输入流(InputStream系列),这几个类都可以与FileInputStream对象相连以提供有用接口:

ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
StringBufferInputStream(在java1.1中已经弃用了):把一个String对象作为InputStream,底层实现使用StringBuffer
FileInputStream:把一个文件作为InputStream,实现对文件的读取操作(文件名、文件、FileDescriptor对象)
PipedInputStream:实现了pipe的概念,主要在线程中使用(作为多进程中的数据源)
SequenceInputStream:把多个InputStream合并为一个InputStream
以字节(Byte)为导向的输出流(OutputStream系列),可以与FilterOutputStream对象相连以提供有用接口:

ByteArrayOutputStream:在内存中创建缓冲区,把信息存入内存中的一个缓冲区中,缓冲区初始化尺寸(可选)
 FileOutputStream:把信息存入文件中(文件名、文件、FileDescriptor)
PipedOutputStream:实现了pipe的概念,主要在线程中使用(指定用于多线程的数据的目的地)

三.与之对应的(Reader/Writer)系列

Reader:                 与InputStream相对应,适配器InputStreamReader
Writer:                 与OutputStream相对应,适配器为OutputStreamWriter
FileReader:              与FileOutputStream相对应
 FileWriter:             与FileOurputStream相对应
 StringReader:           无相对应的类
StringWriter:           与ByteArrayInputStream相对应
CharArrayReader:        与ByteArrayOutputStream相对应
 CharArrayWriter:        与ByteArrayOutputStream相对应
 PipedReader:            与PipedInputStream相对应
 PipedWriter:            与PipedOutputStream相对应

四.两种不限导向的stream之间的转换(使用适配器类)

InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集

.通过FilterInputStream从InputStream读取数据

DataInputStream:从stream中读取基本类型(int、char,long等)数据。
BufferedInputStream:使用缓冲区 ,使用它可以防止每次读取都得进行实际的读操作
LineNumberInputStream:会记录input stream内的行数,然后可调用getLineNumber()和setLineNumber(int)
PushbackInputStream:很少用到,一般用于编译器开发
通过FilterOutputStream向OutputStream写入:

DataIOutputStream:可以按照移植方式往stream中输出基本类型(int、char,long等)数据。
 BufferedOutputStream:使用缓冲区 ,使用它可避免每次发送数据都进行实际的写操作
 PrintStream:产生格式化输出 ,其中DataOutputStream处理数据的存储,PrintStream处理显示

六.更改流的行为

尽管BufferedOutputStream是FilterOutputStream的子类,但是BufferedWriter并不是FilterWriter的子类,(FilterWriter是抽象类,没有任何子类)

没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
BufferedReader:与BufferedInputStream对应
 LineNumberReader:与LineNumberInputStream对应
PushBackReader:与PushbackInputStream对应
BufferedWrite:与BufferedOutStream对应
PrintWrite:与 PrintStream对应

七.自我独立的类:RandomAccessFile

这个类适用于有大小已知的记录组成的文件,RandomAccessFile除了实现了DataInput和DataOutput接口(DataInputStream和DataOutputStream也实现了这两个接口)之外,这个类是个完全独立的类,它拥有和别的I/O类型本质不同的行为,可以在一个文件内向前和向后移动,直接从Object派生而来。

可通过RandomAccessFile对象完成对文件的读写操作
在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
可以直接跳到文件中指定的位置
RandomAccessFile的大部分功能(不是全部)有nio存储映射文件所取代

相关文章

  • VScode 打造完美java开发环境最新教程

    VScode 打造完美java开发环境最新教程

    这篇文章主要介绍了VScode 打造完美java开发环境最新教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 使用spring aop统一处理异常和打印日志方式

    使用spring aop统一处理异常和打印日志方式

    这篇文章主要介绍了使用spring aop统一处理异常和打印日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • springboot整合mybatis plus与druid详情

    springboot整合mybatis plus与druid详情

    这篇文章主要介绍了springboot整合mybatis plus与druid详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的下伙伴可以参考一下
    2022-09-09
  • 用3个实例从原理到实战讲清楚Log4j史诗级漏洞

    用3个实例从原理到实战讲清楚Log4j史诗级漏洞

    最近应该很多人都在关注着一个漏洞Apache Log4j 2远程代码执行,该漏洞一旦被攻击者利用会造成严重危害,这篇文章主要给大家介绍了关于如何用3个实例从原理到实战讲清楚Log4j史诗级漏洞的相关资料,需要的朋友可以参考下
    2021-12-12
  • Java实现二维码QRCode的编码和解码与示例解析

    Java实现二维码QRCode的编码和解码与示例解析

    本文主要介绍Java实现二维码QRCode的编码和解码,这里给大家一个小示例以便理解,有需要的小伙伴可以参考下
    2016-08-08
  • Java安全编码:防范Java安全漏洞的最佳实践

    Java安全编码:防范Java安全漏洞的最佳实践

    Java作为一种跨平台的编程语言,在广泛应用的同时,也会从时至时出现安全漏洞,这些漏洞可能会对Java应用程序的安全性造成严重威胁,因此,必须采取必要的措施,以确保Java应用程序的安全性,以最佳实践来防范Java安全漏洞,是应对安全威胁的最好方法之一,
    2024-01-01
  • Required request body is missing的问题及解决

    Required request body is missing的问题及解决

    这篇文章主要介绍了Required request body is missing的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringCloud中Eureka的配置及使用讲解

    SpringCloud中Eureka的配置及使用讲解

    Eureka 服务注册中心,主要用于提供服务注册功能,当微服务启动时,会将自己的服务注册到 Eureka Server,这篇文章主要介绍了SpringCloud中Eureka的配置及详细使用,需要的朋友可以参考下
    2023-01-01
  • Java的封装类和装箱拆箱详解

    Java的封装类和装箱拆箱详解

    Java中存在基础数据类型,但是在某些情况下,我们要对基础数据类型进行对象的操作,例如,集合中只能存对象,而不能存在基础数据类型,于是便出现了封装类,本文将详细给大家介绍Java封装类和装箱拆箱,需要的朋友可以参考下
    2023-05-05
  • Spring如何基于注解配置使用ehcache

    Spring如何基于注解配置使用ehcache

    这篇文章主要介绍了Spring如何基于注解配置使用ehcache,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10

最新评论