栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java之I/O流入门

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java之I/O流入门

I/O流之I/O流入门
  • I/O流
    • 1、定义
    • 2、分类
      • 2.1 字节流和字符流
      • 2.2 输入流和输出流
      • 2.3 节点流和处理流
    • 3、结构
    • 4、字节流
      • 4.1 定义
      • 4.2 说明
      • 4.3 字节流概述
      • 4.4 InputStream的常用方法
      • 4.5 OutputStream的常用方法
    • 5、字节流读写文件
      • 5.1 说明
      • 5.2 注意
      • 5.3 字节输入流——相关代码
      • 5.4 字节输出流——相关代码
    • 6、文件的拷贝
      • 6.1 需求
      • 6.2 分析
      • 6.3 注意
      • 6.4 快捷键
      • 6.5 相关代码
    • 7、字节流的缓冲区
      • 7. 相关代码
    • 8、字节缓冲流
      • 8.1 说明
      • 8.2 特点
      • 8.3 相关代码
      • 8.4 过程

I/O流 1、定义

I/O流(Input/Output)流,即输入/输出流,是java中实现输入/输出的基础,他可以方便实现数据的输入/输出操作。(数据的传输)

2、分类 2.1 字节流和字符流

根据流操作的数据单位的不同,可以分为字节流和字符流

2.2 输入流和输出流

根据流传输方向的不同,又可以分为输入流和输出流

2.3 节点流和处理流

根据流的功能不同,可以分为节点流和处理流

3、结构

java中的I/O流主要定义在java.io包中,该包下定义了很多类,其中有四个类为流的顶级类,分为InputStream和OutputStream, Reader和Writer
(1)InputStream和OutPutStream是字节流,而Reader和Writer是字符流
(2)InputStream和Reader是输入流,而OutPutStream和Writer是输出流
(3)这四个顶级类都是抽象类,并且是所有流类型的父亲。

4、字节流 4.1 定义

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

4.2 说明

字节流是程序中最常用的流
在JDK中,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OutputStream。

4.3 字节流概述

InputStream被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。

4.4 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流所占的系统资源。

4.5 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()方法是用来关闭流并释放与当前IO流相关的系统资源。

5、字节流读写文件 5.1 说明

(1)针对文件的读写操作,JDK专门提供了两个类,分别是FileInputStream和FileOutputStream
FileInputStream是InputStream的子集,它是操作文件的字节输入流,专门用于读取文件中的数据。
(2)从文件读取数据是重复的操作,因此需要通过循环语句来实现数据的持续读取

5.2 注意

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

5.3 字节输入流——相关代码
//假如在D盘已经有个a.txt文件,里面的内容是a,b,c
//read(): 一次读取一个字节,如果读取到了文件末尾,将会返回-1的标识
public class Demo1_FileStream{
    public static void main(String[] args) throws FileNotFoundException{
        //1.创建字节输入流对象
        FileInputStream fis = new FileInputStream("D:\a.txt");

        //2.读取文件中的数据
        int i = fis.read();
        System.out.println(i);    //97

        //2.读取文件中的数据
        int i2 = fis.read();
        System.out.println((char)i2);    //b
        
    }
}


//假如在D盘已经有个a.txt文件,里面的内容是a,b,c
//read(): 一次读取一个字节,如果读取到了文件末尾,将会返回-1的标识
public class Demo2_FileStream{
    public static void main(String[] args) throws FileNotFoundException{
        //1.创建字节输入流对象
        FileInputStream fis = new FileInputStream("D:\a.txt");

        //2.循环读取文件中的数据
        int i;
        //2.1 在循环中不断地调用read方法,并把读取到的数据给i赋值,只要没有读到-1,说明没有达到文件末尾
        while((i = fis.read())!=-1){
             System.out.println((char)i);
        }
        
        //3.关闭流释放资源
        fis.close();

    }
}

5.4 字节输出流——相关代码
public class Demo3_FileStream{
    //字节输出流: FileOutputStream
    //输出流写出数据,关联文件的时候,如果文件不存在,则自动创建
    
    public static void main(String[] args) throws IOException{
        //1.创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("D:\1.txt", true);
     
        //2.写出数据
        fos.write(98);

        //或者
        byte[] bytes = "你好,世界".getBytes();
        System.out.println(Arrays.toString(bytes));
        fos.write(bytes);

        //等价于
        fos.write("你好,世界2".getBytes());

        //3.关闭流释放资源
        fos.close();
}


6、文件的拷贝 6.1 需求

使用JavaIO技术完成文件的拷贝

6.2 分析

(1)创建输入流和输出流对象
输入流对象关联要拷贝的数据源
输出流对象关联要拷贝的数据目的

(2)在读取过程中,将数据写出到目标文件当中

(3)关闭流释放资源

6.3 注意

建议IO流的异常使用try…catch进行处理,并加入finally代码块将关闭流释放资源的代码,放在finally当中。

6.4 快捷键

alt + shift + z --> try…catch

6.5 相关代码
public class Test1_Copy{
    public static void main(String[] args) {
        FileInputStream fis = null;
         FileOutputStream fos = null;

        try{
            //1. 创建输入流和输出流对象
            FileInputStream fis = new FileInputStream("D:\abc.txt");
            FileOutputStream fos = new FileOutputStream("E:\copy.txt");

            //2. 在读取的过程中,将数据写出到目标文件当中
            int i;
            while((i = fis.read())! = -1){
                fos.write(i);
            }
            
            //3.关闭流释放资源
            fis.close();
            fos.close();
        } catch (IOException e){
            e.printStackTrace();
        } finally{
            //3.关闭流释放资源
            if(fis!=null){
                try{
                    fis.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }

            if(fos!=null){
               try{
                    fos.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }

}

7、字节流的缓冲区

在文件拷贝过程中,通过以字节形式逐个拷贝,效率很低,因此可以定义一个字节数组缓冲区,在拷贝文件时,就可以
一次性读取多个字节的数据。

7. 相关代码
//假如:已经在D盘创建了a,b两个文件
//read方法如果传入了数组,那么会根据数组容器大小,决定一次读取多少个字节
//read方法的返回值是: 读取到的(有效)字节个数

public class Test2_CopyFile{
    public static void main(String[] args) throws IOException{
        long start = System.currentTimeMillis();

        //1. 创建输入输出流,关联数据源和数据目的
        FileInputStream fis = new FileInputStream("D:\a.flv");
        FileOutputStream fos = new FileOutputStream("D:\b.flv");

        //创建字节缓冲区
        byte[] bys = new byte[1024];

        //2.在读取的过程中,将数据写出到数据目的
        int len;
        while((len = fis.read(bys))!=-1){
            //3.写出的时候,从数组容器中取出,0-len(有效字节个数)
            fos.write(bys,0,len);
        }
        
        fis.close();
        fos.close();

        long end = System.currentTimeMillis();
        System.out.println("花费时间为:"+ (end-start) + "毫秒");
    }
}

8、字节缓冲流 8.1 说明

除了定义字节缓冲区来提高文件拷贝效率外,IO中还提供了两个字节缓冲流来提高文件拷贝效率:
BufferedInputStream 和 BufferedOutputStream
他们的构造方法中分别接收InputStream和OutputStream类型的参数作为对象,在读写数据时提供缓冲功能。

8.2 特点

由于两个流对象中,内置了字节(数组) ,从而提高IO流的读写效率。

8.3 相关代码
public class Demo_BufferedStream{
    
    public static void main(String[] args) throws IOException{
         long start = System.currentTimeMillis();

        //1.创建字节缓冲,输入输出流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\a.flv"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileInputStream("D:\b.flv"));

        //2.读写操作
        int i;
        while((i=bis.read())!=-1){
            bos.write(i);
        }

        //3.关闭流释放资源
        bis.close();
        bos.close();

        long end = System.currentTimeMillis();
        System.out.println("花费时间为:"+ (end-start) + "毫秒");
    }
}

8.4 过程

数据源(源设备)——>FileInputStream(字节流)——>BufferedInputStream(字节缓冲流)——>JAVA(应用程序)——>BufferedOutputStream(字节缓冲流)——>FileOutputStream(字节流)——>数据目的(目标设备)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/871378.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号