Java:I/O流之输入流和输出流、字节流和字符流详解,附带代码

目录

每日一讲

 1.IO流简介

1.1IO流的作用

1.2输入输出流应用

2. 应用代码实现

2.1读取txt文件,将文件内容输出到控制台

2.11代码实现

2.12代码实现流程

2.2文件复制 

 2.21什么是文件复制

 2.22一次一字节代码实现

 2.23代码改进之一次写入多字节

2.3音乐串烧

2.31代码实现

2.32结果显示


每日一讲

昨天是一张过期的支票,无法挽回,明天是一张尚未兑现的支票,你永远不知道能否兑现。而只有今天,是你手中流动的现金,可以买你喜欢的花和面包!

 1.IO流简介

IO流:指的是Input流和Output流,也就是输入流和输出流。

1.1IO流的作用

所谓的流,可以指流动、传输。那么,是什么流动呢?答案是数据!数据的流动与传输,而IO流的主要目的就是用来处理设备之间数据传输的问题。

在JDK11API帮助文档中对于java.io软件包是如下解释:通过数据流、序列化和文件系统提供系统输入和输出。除非另有说明,否则将null参数传递给此包中任何类或接口中的构造函数或方法将导致抛出NullPointException。

1.2输入输出流应用

  1. 音乐串烧(用代码实现将多段音乐合成一段)
  2. 文件复制
  3. 图片处理

2. 应用代码实现

用几个简单的例子来更加深入的理解IO流。

2.1读取txt文件,将文件内容输出到控制台

读取txt文件中的内容,首先我们要明白输入输出流中的特点:

  1. Java中所有的输入流都有xxxInput或者xxxReader,数据从硬盘流向内存。
  2. Java中所有的输出流都有xxxOutput或者xxxWriter,数据从内存流向硬盘。

2.11代码实现

在代码实现之前我们也还需要知道两个概念:字节流字符流 

  1. 字符流:用记事本打开文件可以读懂里面的内容,有xxxReader或xxxWriter的特点。
  2. 字节流:用记事本打开文件,都是乱码,比如图片、音视频文件等;有xxxStream的特点。

 1.单字符读取

    public static void main(String[] args) throws IOException {
        FileReader fileReader=new FileReader("D:/java/Test/myTest.txt");
        int ch=0;
        while((ch=fileReader.read())!=-1){
            System.out.println((char)ch);
        }
        fileReader.close();//关闭流、释放资源(内存)
    }

2. 整行读取

public static void main(String[] args) throws IOException {
    FileReader fileReader=new FileReader("D:/java/Test/tem.txt");
    BufferedReader bufferedReader =new BufferedReader(fileReader);
    String line="";
    while((line=bufferedReader.readLine())!=null)
    {
        System.out.println(line);
    }
    //关闭资源
    bufferedReader.close();
}

我们可以发现两段代码中有差别的是以下一句代码:

BufferedReader bufferedReader =new BufferedReader(fileReader);

这句代码可以帮助我们实现整行读取,因为它具有bufferedReader.readLine()方法,用于读取整行字符。

2.12代码实现流程

首先,我们要使用FileReader读取txt文件,也就是数据从硬盘流向内存,然后使用BufferedReader包装流FileReader,最终将读取到的结果输出到控制台中。

其中,涉及到了两个重要的概念:包装流流的末尾

  1. 包装流: 在原始的字节流或者字符流的基础上,为了提高代码效率而再次处理的流。
  2. 流的末尾:简单的说,则是上面while循环中结束的条件。

2.2文件复制 

 2.21什么是文件复制

文件复制,顾名思义,就是Ctrl cv工程。这样听起来是不是十分的简单,easy~,同样的,在代码中,我们也能根据这个思路来写。Ctrl+c就是相当于读取文件,Ctrl+v相当于写文件。所以文件复制需要做的是先读后写,用到的是字节流。

 2.22一次一字节代码实现

public static void main(String[] args) throws IOException {
    //使用的字节流
    FileInputStream fileInputStream=new FileInputStream("D:/java/Test/hi.txt");
    FileOutputStream fileOutputStream=new FileOutputStream("D:/java/Test/hiCopy.txt");
    //一次性读一个字节
    int ch=0;
    while((ch=fileInputStream.read())!=-1){
        //写1次
        fileOutputStream.write(ch);
    }
    //关闭资源
    fileInputStream.close();
    fileOutputStream.close();
}

结果显示原本文件夹中只有一个hi.txt文件。

文件的内容

 

运行代码后,我们发现文件夹中会多出一个hiCopy.txt文件。

文件内容显示,和hi.txt文件中一模一样。

我们发现如果类似于这个代码中的文件传输,是完全没有问题的,因为这个txt文件的内存大小只有1KB,如果文件大小是几百上千兆,那么这时候的传输效率则是非常低的,此时我们需要改善代码,使得每次写的字节更多。

 2.23代码改进之一次写入多字节

    public static void main(String[] args) throws IOException {
        //使用的字节流
        FileInputStream fileInputStream=new FileInputStream("D:/java/Test/hi.txt");
        FileOutputStream fileOutputStream=new FileOutputStream("D:/java/Test/hiCopy.txt");
        byte buff[]=new byte[1024];
        int ch=0;
        while((ch=fileInputStream.read(buff))!=-1){
            //写1次,1次1024字节
            fileOutputStream.write(buff,0,ch);
        }
        //关闭资源
        fileInputStream.close();
        fileOutputStream.close();
    }

此时此刻,我们发现,我们传输几百兆的文件也只需要几秒钟的时间咯。

2.3音乐串烧

所谓的音乐串烧就是多个音频文件合成一个音频文件。

2.31代码实现

/*
需求分析:实现音乐串烧(将多个音乐文件合并成一个)
 */
public static void main(String[] args) throws IOException {
    //建立一个String数组保存文件名
    String fileName[]={
            "D:/java/Test/败给爱情.mp3",
            "D:/java/Test/最初的爱.mp3"
            };
    //创建
    FileOutputStream fileOutputStream=new FileOutputStream("D:/java/Test/音乐串烧.mp3");
    for (int i = 0; i<fileName.length; i++) {
        //读取文件
        FileInputStream fileInputStream=new FileInputStream(fileName[i]);
        int ch=0;
        byte buff[]=new byte[1024*4];
        while((ch=fileInputStream.read(buff))!=-1) {
            fileOutputStream.write(buff,0,ch);
        }
        fileInputStream.close();
    }
    fileOutputStream.close();
}

此时需要注意,如果按照我上面所写的代码只能合成MP3格式的音频文件,如果需要合成其他格式的代码在网上另寻文章。

2.32结果显示

我们可以看到文件内存大小正确,打开音频时长正常,播放正常。

此外,使用IO流还能够进行图片文件合成与拆分,视频文件处理等等,后续也会进行更新。

 好咯,本期文章到此结束,希望对你有所帮助,加油陌生人,争取早日成为大佬!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值