Java学习之 IO

什么是I/O流

I/O流用来完成java的输入输出工作,包括磁盘文件、设备、其他程序以及内存数据等等的输入输出

I/O流支持多种数据类型,如:简单的二进制类型、原始类型、本地字符以及各种对象

        基于流技术可以用来传递数据,还可以用来操作或格式化数据

         所有的流都使用相同的模型来编写程序

        一组I/O流指明了输入源和输出目的地

         一种流是一组顺序的数

2  I/O流的基本原理

输入流:程序从一个数据源读取数据到本程序中,这些数据的方向是从程序的外部到程序内部,这样就构成了一个输入流。
输出流:把当前程序中保存的数据输出到程序外部的目的源中,方向从程序内部到外部,这样就构成了输出流

3 字节流

字节流为输入输出提供了最原始的环境,字节流可以直接操作二进制数据
InputStream是定义Java的流式字节输入模式的抽象类,该类的所有方法在出错情况下都将引发IOException异常
OutputStream是定义流式字节输出的抽象类,所有该类的方法都返回一个void值并在出错条件下引发IOException异常
InputStream 类的体系结构

OutputStream 类的体系结构


字节流的使用-1

字节流的使用-2
总是关闭流
  关闭一个不在使用的流十分重要,必须关闭流,以免引起资源漏洞
 通常使用finally来关闭流
 什么时候不要使用二进制流
 二进制流是一种低级别流,应该避免使用
 输入源是一个文本文件,最好的方式是使用字符流来处理
 在Java I/O中还有其他流来处理更复杂的数据,二进制流仅仅用来处理最原始的bit流但是所有的非二进制流都是基于二进制流来构建的

字节流操作的理解

输入流循环的从文件中每次读取一个bit的数据到目的文件中,整个过程如下图所示
注意:read() 返回的是一个int值,那么为什么输入的是一个二进制流返回的却不是一个byte值呢? 用一个int类型的值允许read() 方法用-1来标记已经到达流的结束位置
 在字节流操作中字节存在int类型变量的后8bits中
在对字符流操作中int变量c在16bits中保存了一个字符的值

带缓冲字节流的使用

4 字符流-1

尽管字节流提供了处理任何类型输入/输出操作的足够的功能,但它们不能直接操作字符,字符流面向字符,读写
的单位是2字节,字符流以Reader和Writer为顶层
Reader是定义Java的流式字符输入模式的抽象类,该类的所有方法在出错情况下都将引发IOException异常
 Writer是定义流式字符输出的抽象类,所有该类的方法都返回一个void值并在出错条件下引发IOException异常
字符流-2
 Java平台使用的字符集在Java内部会自动转换成本地字符集
 对应程序开发,使用字符流比字节流更简便,因为输入输出流会自动转换成本地的字符编码标准
程序使用字符流代替字节流,自动匹配到本地字符编码,适应国际化 ,这样就不需要程序员做额外的工作
Reader 类的体系结构

Writer 类的体系结构

字符流的使用-1

缓冲流的使用-1

字符流常常遇到比单字符更大的字符单元,一般,使用一个行终止符来结束串字符。行结束符使用回车符和换行符(“\r\n”),或者单个回车符 (“\r”),,或者单个换行符("\n")
Java支持在所有操作系统上创建的文本文件可能的行结束符
 为了使用line-oriented的高效率 I/O我们必须使用BufferedReader 和 BufferedWriter
缓冲流的使用-2
在前面的应用中我们使用的都是无缓冲 I/O,这意味着每次读写操作都依赖于低层的操作系统,这样效率很低,因为,每次请求常常要引发disk access, network activity,或者一些其他操作 。为了解决此问题,Java平台实现了缓冲I/O 流,缓冲输入流从内存中的一块缓冲区中读取数据,而当缓冲区为空时才调用本地的输入API, 类似的,缓冲输出流输出数据到缓冲区中,当输出缓冲区满时才调用本地的输出API
一个无缓冲的I/O程序能转换成有缓冲的程序通过使用特定的包装类:
read= new BufferedReader(new FileReader("xanadu.txt"));
writer= new BufferedWriter(new FileWriter("characteroutput.txt"));
有4个缓冲流类常常用来包装无缓冲流:
BufferedInputStream 和 BufferedOutputStream 创建二进制缓冲流,
BufferedReader 和 BufferedWriter 创建字符缓冲流
缓冲流的使用-3

字符流的使用-2(字符流中使用字节流)
 字符流是包装后的字节流,当字符流在字符和字节流之间进行传递操作时,字符流使用字节流来完成物理平台的I/O操作。例如:BufferedReader使用 FileInputStream, BufferedWriter使用FileOutputStream
当没有字符流类使用时,能够使用字节流创建字符流,在用sockets和networking设计程序时我们能使用字节流创建字符流
BufferedReader reader = new BufferedReader(newInputStreamReader(new FileInputStream("./text1.txt")));

数据流的使用-1

Data streams 支持原始类型值的(boolean, char, byte,short, int, long, float, double)二进制流,所有的数据流都实现了DataInput interface 或 DataOutput interface
常用的数据流DataInputStream 和 DataOutputStream
数据流的使用-2

对象流的使用-1

对象输入流支持对象的输入输出
ObjectInput/ObjectOutput实现了DataInput 和DataOutput的方法, 因此对象流也能对原始类型进行输入输出
对象流的使用-2

标准流

大多数操作系统标准流都有标准流,默认他们从键盘读取数据显示到显示器上,同时也支持用命令行来控制程序间的输入输出操作
 Java提供三种标准流,其中输入流:System.in,输出流:System.out、System.err,错误输出可以允许用户将错误信息保存到持久化介质中,这些流已经被自动定义不需要再打开.
 标准流都是二进制流,System.out和system.err 是 PrintStream 对象System.in是二进制流没有字符流对象,为了把它变成字符流可以把System.in包装进InputStreamReader.
InputStreamReader cin = newInputStreamReader(System.in);
文件的操作-1
到目前为止我们关注的都是流,流能够在多种多样的输入源输出源上工作,这些源包括磁盘文件。然而,
流不支持操作系统磁盘文件级别的操作,下面我们将关注如下两个主题:
① File: 帮助编写对文件、目录进行操作的依赖于平台的代码
② Random access files :支持随机访问磁盘文件
文件的操作-2

文件的随机访问-1
输入流FileInputStream和输出流 FileOutputStream,实现的是对磁盘文件的顺序读写,而且读写要分别创建不同对象,相比之下RandomAccessFile类则可对文件实现随机读写操作
 RandomAccessFile对象的文件位置指针遵循下面的规律:
① 新建RandomAccessFile的对象文件位置指针位于文件的开头处
② 每次读写操作之后,文件位置的指针都相应后移到读写的字节数
③ 可以通过getFilePointer方法来获得文件位置指针的位置,通过seek方法来设置文件指针的位置
如果某个文件有30个字节,读取数据过程中,从20-30读取,用skip( )跳过方法,但在读取的过程中,前面的字节都被删除掉了,如果用户有这样的需求,先读取10-20字节,之后再读1-10之间的数,再20-30之间
随机访问文件类 java.io.RandomAccessFile,所有已实现的接口:Closeable, DataInput, DataOutput
文件的随机访问-2



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值