IO流-字节流

概述

一个流(stream)是一个有序的字节序列。当进行输入(读)或输出(写)数据操作时,数据从信息源流向目的地就像水在水管中流淌一样。给水管注入水的一端就是信息源。水流出的端就是目的地。流既可以作为输入流,也可以作为输出的目的地。流中的字节具有严格的顺序,按先进先出要求操作,因此流式I/O是一种顺序存取方法。
IO流是用来处理设备之间的数据传输。
java对数据的操作时通过流的方式。
java用于操作流的对象都在IO包中。

IO流的分类

IO流按照数据流向分为输入流和输出流。
输入流是从某种数据源(如:键盘、磁盘文件、网络等)到程序的一个流,程序可以从这个流中读取数据。程序从外部设备输入数据时要使用输入流。
输出流是从程序到某种目的地(如:键盘、磁盘文件、网络等)的一个流,程序可以将信息写入到这个流。将程序的数据输出到外部设备时要使用输出流。
一个程序可以同时处理多个输入流和输出流,但一个流不能同时即是输入流又是输出流。

IO流按数据类型分为字节流和字符流。
字节流可以读写任何类型的文件。
字符流只能读写文本文件。

字节流

字节流式面向字节的流,流中的数据以8位字节为单位进行读写。
字节流的基本抽象基类:
InputStream和OutpueStream
InputStream是字节输入流,用来读取数据。OutputStream是字节输出流,用来写入数据。
InputStream中的常用方法:

  • close()
    关闭流
  • read()
    读取一个字节
  • read(byte[] b)
    读取一个字节数组
  • read(byte[] b, int off, int len)
    读取一个字节数组,从指定位置开始到指定位置结束。
    OutputStream中的常用方法
  • flush()
    刷新一下
  • write(int b)
    写入一个字节
  • write(byte[] b)
    写入一个字节数组
  • write(byte[] b, int off, int len)
    写入一个数组的指定位置

FileOutputStream
FileOutputStream是OutputStream抽象类的子类
构造方法:

  • FileOutputStream(File file)
    此构造需要传入一个File类型对象
  • FileOutputStream(String name)
    此构造需要传入一个文件的绝对路径或者相对路径
  • FileOutputStream(File file, boolean append)
    创建一个字节输出流,是否开启追加
  • FileOutputStream(String name, boolean append)
    创建一个字节输出流,是否开启追加

如果使用FileOutputStream(String name)关联的文件不存在,那么它会自动的创建这个文件。
注意事项:创建字节输出流对象做的事情

  1. 调用系统资源创建xx.txt文件
  2. 创建了一个fos对象
  3. 把fos对象指向这个文件
    在每次使用完流之后要关闭。第一是通知系统释放关于管理xx.txt文件的资源。第二是让IO流对象变为垃圾,等待垃圾回收器对其回收。

FileOutputStream的常用方法:

  • public void write(int b)
    写入一个字节
  • public void write(byte[] b)
    写入一个字节数组
  • public void write(byte[] b,int off,int len)
    写入一个字节数组的指定部分。

FileOutputStream如何实现换行:
windows下的换行符只用是 \r\n
Linux \n
Mac \r
使用write方法只能传入一个字节或字节数组,如果要传入一个换行字符串,那么使用getBytes()方法,把换行符转换成字节数组再写入就实现了换行的功能。

FileInputStream
FileInputStream构造方法:

  • FileInputStream(File file)
    创建一个字节输入流,需要传入一个File类型的对象
  • FileInputStream(String name)
    创建一个字节输入流,需要传入一个文件的绝对路径或相对路径

FileInputStream的常用方法:

  • int read()
    读取一个字节
  • int read(byte[] b)
    读取一个字节数组

注意事项:
在使用FileInputStream和FileOutputStream都会产生异常。我们可以抛出异常也可以捕捉获取异常

案例:复制一个mp3文件

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("C:/音乐/我曾.mp3");
        FileOutputStream out = new FileOutputStream("C:/音乐/我曾2.mp3");
        int len=0;
        byte[] bytes = new byte[1024 * 8];
        while ((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();

    }
}

BufferedOutputStream和BufferedInputStream

BufferedOutputStream和BufferedInputStream称为高效字节输出流和高效字节输入流。我们在使用FileInputStream和FileOutputStream每一次只能读写一个字节(不创建字节数组的情况),这样效率会很低,所以我们会创建字节数组来提高效率,每次读写一个字节数组速度会变得很快。
java针对这种情况为我们提供了高效字节流,它的底层还是普通的字节流,但是在创建时候,会自动创建缓冲区,也就是字节数组。这样就不需要我们每次使用普通的字节流时主动的创建缓冲区。当然在创建高效字节流时我们要传入一个普通的字节流。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值