Java I/O操作

Java_I/O操作


作者:@云都小生(Author)


I/O 概述



I/O实际上指的就是输入(input)、输出(output)操作。Java需要从一些文件上读取信息,或者是写信息,就需要了解这些概念,掌握Java I/O相关类的操作。

Java中的数据传输是基于“流”的方式进行的,这个“流”也可以理解成数据流。


流的分类



从不同的角度,我们可以对流进行分类。

从流的方向上来说,如果我们从程序向文件输出数据,那就是输出流,如果我们的程序从文件中读取数据,那就是输入流

如果从处理数据的大小来说,流又可以分为8位一字节的字节流和16位两字节的字符流

最后,按照实现功能的不同,我们又可以分为节点流和处理流。节点流是直接与数据源相连,而处理流是间接形式,使用处理流可以提高一些效率,这个后面再谈。


Java I/O类的结构



Java提供的I/O类,主要继承自四个基类:Reader、Writer、InputStream和OutputStream。前两者是字符输入与输出,后两者是字节输入与输出。

每一个基类下面,又分出许多不同功能的I/O子类。

关于I/O类之间的关系,我挖了几张图过来。

这里写图片描述
图1是I/O类中的四个基类,它们都是抽象类,按照操作数据的长度可以分为字节流和字符流。再根据流的方向,可以分为字符输出流、字符输入流和字节输出流、字节输入流。

这里写图片描述
图2是InputStream,可以看到,这里又分出了节点流和处理流,FileInputStream是文件向程序的输入操作类。如果需要从文件中读取数据,就要···

FileInputStream fis = new FileInputStream(new File("d:\\Test.txt"));
fis.read();

ByteArraysInputStream这个类,用的是创建一个Byte[]缓冲区供InputStream使用。处理流中的BufferedInputStream和DataInputStream是用来一次性读取更多的数据。

FileInputStream用来创建一个文件作为InputStream,以实现文件操作。

如果我们直接用InputStream,每次都是读取一个字节,这样要频繁的对硬盘进行操作。我们使用BufferedInputStream就可以获取内存上一小块空间,一次性的读取,然后再去做其他处理。

简单而通俗的说,InputStream是一滴水一滴水的输入,DataInputStream是一瓢水一瓢水,而BufferedInputStream是一桶水一桶水。

这里写图片描述
图3是字节输入流OuputStream与子类的结构,也是分字节流和处理流。如果你仔细看,处理流里面有一个printStream,这个是用来格式化输出流的,一般是输出到控制台。

这里写图片描述

这里写图片描述
图4 图5就不多解释了,其实跟字节流的区别,就是在于操作数据的长度变了。

图片源地址戳我! 感谢博主分享,这也是一篇I/O相关的文章。

接下来我们就来学习一些常用的I/O类。


常用I/O方法大阅兵


基于InputStream有以下的方法:

markSupported():返回的是boolean类型,因为不是所有的stream都可以调用mark方法的,这个方法就是用来判断stream是否可以调用mark方法和reset方法。

read():从流中读取一个byte字节;

read(byte[]):将流中读取的内容存放到一个byte[]字节缓冲数组;

read(byte[],int x):从流中的offset开始读取长度为x的内容存放到byte[]缓冲数组;

mark(int index)设置标记点index;

reset()回到当初设置的mark标记点;

close()关闭该流;

available()返回流中的可读字节数。



基于 OutputStream又以下方法:

write(int):写入一个字节到OutputStream中;

write(byte[]):写入一个Byte[]数组到OutputStream中;

write(byte[],int x):把byte[]数组从文件指针开始的位置,写入长度为x的数据;

close()关闭一个OutputStream流;

flush()刷新流中的数据,将缓冲区的数据进行强制输出。

剩下的Reader和Write两个抽象类,就不说了,方法其实差不多,只是换成了字符流。也就是说,操作不再只是一个字节了,而是一个字符一个字符。


使用规则


当需要对文件进行操作的时候,就用FileInputStream和FileOutputStream,如果操作的是字符,就用FileReader和FileWrite。

如果操作的是byte[]就用ByteArrayInputStream和ByteArrayOutputStream;

如果是char[]就用CharArrayInputStream和CharArrayOutputStream;

如果是String····,就用StringBufferInputStream和StringBufferOutputStream;

如果需要格式化输出就用printStream和printWriter。前者用来格式化输出字节流,后者是字符流。

缓冲区相关的类有BufferedInputStream和BufferedOutputStream。


2017/10/6 23:41:22 @Author:云都小生(Cloudking)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值