Java学习之I/O流

最近学习了I/O,按照老规矩写上一篇。

I/O流

什么是I/O流?

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
----转自百度百科

了解了是那么是I/O流,那么Java的I/O流主要应用的业务场景有哪些?

负责文件上传和下载,包括,文档、音频、视频、图片等都可以使用I/O流进行读和写

缓冲的概念

缓冲其实在我们的日常生活中早已是个常见的名词
看视频卡顿?暂停一下,等视频加载缓冲。
那么缓冲主要发生在哪?
举个例子:
快递:
商家发出----> 送到物流中转站,物流中转站------->分批次发出,一次可以运输好多件快递。------>快递员送货上门
假设,我们没有物流中转站,那么,商家不得不每次有人购买产品都要单独发出,所有的快递也不存在集中运输那么,快递到达我们每个人的手中所需要的时间就不会是短短的3天了。

I/O流中的缓冲

I/O流就是对电脑文件的读和写。计算机通过CPU读取磁盘上的文件数据,一次读取一个字节。但可以加上缓冲的概念,每次读取4kb。提高效率。

  • 字节输入缓冲流:BufferedInputStream()
  • 字节输出缓冲流:BufferedOutputStream()
  • 字符输入缓冲流: BufferedReader()
  • 字符输出缓冲流: BufferedWriter()

I/O的分类
需要注意的是,在Java中I/O的定义是以内存为参照物的。

  • 从磁盘读取数据到内存。:输入流
  • 从内存写入数据到磁盘。:输出流

输入流

从磁盘中读取数据到内存中,将数据展示
输入流可以分为:

  • 字节输入流:FileInputStream()
  • 字符输入流:FileReader()(只适用于纯文本内容)

案例:磁盘上有一个1.txt文件,将1.txt内容读取到java内存中
1、使用字节输入流:FileInputStream和字节输入缓冲流:BufferedInputStream

import java.io.*;

public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        //1.创建一个file对象
        File file = new File("d:/Test/1.txt");
        //2.创建文件字节输入流对象,来操作1.txt文件
        FileInputStream inputStream = new FileInputStream(file);
        //3.这个流不具备缓冲的效果,使用缓冲流BufferInputStream为另外一个流提供缓冲功能
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        //将inputStream传给BufferInputStream,附魔具有缓冲功能
        //使用字节缓冲流操作1.txt。
        //4.创建一个内部缓冲区数组  byte[] 类型的数组
        //byte[] buf = new byte[4*1024];//4096个字节
        byte[] buf = new byte[3];//3个字节
        //缓冲数组是多长,一次就只能读取多少字节。
        //5.读取数据read()   返回的是字节数。
        //int readNumber =  bis.read(buf);
        //6.调用buf数组的输出,展示字符数组
        //System.out.println(new String(buf,0,readNumber));
        //String(字节数组,偏移量,取值长度)
        //偏移量规定了从数组的什么位置开始取值
        //当字节数过多的时候,字符数组不可能无限大,所以使用循环来多次读取,
        //后边每一次读取都会覆盖前面的内容
        int length = -1;//如果length=-1,证明读取到了流的末尾,就停止读取
        while ((length = bis.read(buf))!= -1){
            System.out.print(new String(buf,0,length));//打印到控制台
        }
        //7.关闭流释放资源
        inputStream.close();
        bis.close();
    }
}

2、使用字符输入流:FileReader和字符输入缓冲流:BufferedReader

import java.io.*;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        //将c盘下面的aaa文件夹下面的1.txt文件的内容 读取到Java内存中
        //和字节流一模一样
        //1.新建一个File对象
        File file = new File("c:/aaa/1.txt");
        //2.新建FileReader  对象 字符输入流
        FileReader fr = new FileReader(file);
        //3.FileRFeader没有缓冲的效果,可以加上缓冲的效果
        BufferedReader br = new BufferedReader(fr);
        //4.字节的缓冲数组 是字节
        //字符的缓冲数组  是字符
        char[] cbuf = new char[4];//缓冲区是4个字符
        //这个方法是用的!!!
        //5.	read(char[] cbuf) 将文件内容读取到字符数组中(缓冲区)
        int length = -1;  
        while ((length = br.read(cbuf)) != -1) {
            //6.将数组展示到控制台
            System.out.println(new String(cbuf, 0, length));
        }

        //7.关闭流
        br.close();
        fr.close();

    }
}

输出流

从内存中输出的数据写到磁盘中,将数据存储
输出流可以分为:

  • 字节输出流:FileOutputStream()
  • 字符输出流:FileWriter()(只适用于纯文本内容)

案例:将字符串内容写到一个.txt文件中
1、使用字节输出流:FileOutputStream和字节输出缓冲流:BufferedOutputStream

import java.io.*;

public class FileOutputStreamDemo {
    public static void main(String[] args) throws IOException {
        //内存到磁盘,输出流
        //1.创建一个file对象
        File file = new File("d:/Test/2.txt");
        if (!file.exists()){
            file.createNewFile();
        }
        //2.创建流
        FileOutputStream fos = new FileOutputStream(file);
        //3.加上缓冲效果
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //4.将字符串转成byte
        String str = "A接W接A接E接外圈刮接诺克萨斯断头台";
        byte[] bytes = str.getBytes();
        //5.将数据写到磁盘中
        bos.write(bytes);
        //6.刷新,释放资源
        bos.flush();
        bos.close();//BufferedOutputStream要先关闭,后开先关
        fos.close();
    }
}

2、使用字符输出流:FileWriter和字符输入缓冲流:BufferedWriter

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        //从内存写入数据到磁盘的文件中
        File file = new File("c:/aaa/2.txt");
        FileWriter fw = new FileWriter(file);
        //加缓冲流
        BufferedWriter bw = new BufferedWriter(fw);
        //viod writer(char[] cbuf, int off, int length);
        String str = "一杯茶,一包烟,一个功能码一天!";
        //将字符串转为char数组
        char[] chars = str.toCharArray();
        //将chars数组中  从0 开始  取3个字符写入到缓冲流中
        bw.write(chars, 3, 3);
        bw.close();
        fw.close();
    }
}

至此结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值