I/O流 (字节流的概述与操作)

I/O流 (字节流的概述与操作)


1.0 定义I/OInput/Output)流,即输入/输出流,是Java中实现输入/输出的基础,它可以方便地实现数据的输入/输出操作。

1.1 分类:

字节流的和字符流        根据流操作的数据单位的不同,可以分为字节流和字符流。
输入流和输出流根据流传输方向的不同,又可分为输入流和输出流。
节点流和处理流            根据流的功能不同,可以分为节点流和处理流。

1.2 结构:Java中的I/O流主要定义在java.io包中,该包下定义了很多类,其中有4个类为流的顶级类,分别为InputStreamOutputStreamReaderWriter

说明

InputStreamOutPutStream是字节流,而ReaderWriter是字符流

InputStreamReader是输入流,而OutPutStreamWriter是输出

图中的4个顶级类都是抽象类,并且是所有流类型的父类。

1.3 字节流概述

定义:在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流

说明:1.字节流是程序中最常用的流。

           2.在JDK中,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OutputStream。


2.1 字节流概述——InputStreamOutputStream示意图

 说明 如上图,InputStream看成一个输入管道,数据通过InputStream从源上输入到程序,再通过OutputStream从程序输出到目标,从而实现数据的传输。

字节流概述——InputStream的常用方方法声明

方法功能
int read()

从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数。当没有可用字节时,将返回-1

int read(byte[] b)

从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目

int read(byte[] b,int off,int len)从输入流读取字节,把它们保存到参数b的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目
void close()

关闭此输入流并释放与该流关联的所有系统资源

说明

如上图,前三个read()方法都是用来读数据的,分按字节读取和按字节数组读取

进行I/O流操作时,应该调用close()方法关闭流,从而释放当前I/O流所占的系统内存。

字节流概述——OutputStream的常用方法

方法       功能
void write(int b)

向输出流写入一个字节

void write(byte[] b)

把参数b指定的字节数组的所有字节写到输出流

void write(byte[] b,int off,int len)

将指定byte数组中从偏移量off开始的len个字节写入输出流

void flush()

刷新此输出流并强制写出所有缓冲的输出字节

void close()

关闭此输出流并释放与此流相关的所有系统资源

说明

如上图,前三个write()方法是用来写数据的,分按字节读取和按字节数组写入。

flush()方法用来将当前输出流缓冲区(通常是字节数组)中的数据强制写入目标设备,此过程称为刷新。

close()方法是用来关闭流并释放与当前I/O流相关的系统资源。

字节流概述——InputStreamOutputStream的继承体系

 

 字节流读写文件

针对文件的读写操作,JDK专门提供了两个类,分别是FileInputStream和FileOutStream。

FileInputStream是InputStream的子类,他是操作文件的字节输入流,专门用于读取文件中的数据。

从文件读取数据是重复的操作,因此需要通过循环语句来实现数据的持续读取。

2.2 字节流读写文件

示例(读取包含“helo”内容的txt文件):

    FileInputStream in = new FileInputStream("test.txt");
    int b = 0;
    while((b=in.read()) != -1){
          System.out.println(b); 
    }
    in.close();

注意:在读取文件数据时,必须保证文件在相应目录存在并且是可读的,否则会抛出FileNotFoundException

结果 

 示例(向txt文件写入数据)

    FileOutputStream out = new FileOutputStream("out.txt");
    String str = "hello";
    out.write(str.getBytes());
    out.close();

结果

注意通过FileOutputStream向一个已经存在的文件中写入数据,该文件中的数据首先会被清空,再写入新的数据。若希望在已存在的文件内容之后追加新内容,则可使用构造函数FileOutputStream(String fileName, boolean append)来创建文件输出流对象,并把append参数的值设置为true

示例(向txt文件写入数据)

    FileOutputStream out = new FileOutputStream("out.txt",true);
    String str = " world";
    out.write(str.getBytes());		
    out.close();

结果

注意I/O流在进行数据读写操作时会出现异常,为了保证I/O流的close()方法一定执行来释放占用的系统资源,通常会将关闭流的操作写在finally代码块

    finally{
          try{
                if(in!=null)       in.close();
          }catch(Exception e){
	e.printStackTrace();
          }
          try{
	if(out!=null)     out.close();
          }catch(Exception e){
	e.printStackTrace();
          }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值