Java——I/O流(一):字节流(概念理解+应用举例)

简介: Java——I/O流(一):字节流(概念理解+应用举例)

1.I/O流概述


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

可分为如下几类:👇👇👇 

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

说明:InputStream OutPutStream 是字节流,而 Reader Writer 是字符流。

          InputStreamReader是输入流,而OutPutStreamWriter是输出流。

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

 

2.字节流概述


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

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

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

2.1 字节输入流InputStream常用的方法


2.2 字节输出流OutputStream常用的方法

2.3 InputStreamOutputStream的继承体系

 

3.字节流读写文件


说明:针对文件的读写操作,JDK专门提供了两个类,分别是FileInputStream FileOutputStream

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

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


3.1 字节输出流读写文件


写入数据的原理(内存-->硬盘):

Java程序 → Java虚拟机操作系统操作系统调用写数据的方法把数据写到文件中

写数据的时候,会把要写入的数据转换为二进制数。在打开文件的时候,都会查询编码表(例如:ASCII表),把字节转换为字符表示。

import java.io.*;
public class IODemo01 {
  public static void main(String[] args) throws IOException {
    //使用文件名创建字节流对象
    FileOutputStream fos1=new FileOutputStream("FOS1.txt");
    fos1.write(65);//依次写出三个字节的数据
    fos1.write(66);
    fos1.write(67);
    fos1.close();//关闭字节输出流,并释放资源
    FileOutputStream fos2=new FileOutputStream("FOS2.txt");
    byte[] bytes2={97,98,99};//创建一个byte数组
    fos2.write(bytes2);//将bytes2字节数组中的所有字节写入fos2输出流
    fos2.close();//关闭字节输出流,并释放资源
    FileOutputStream fos3=new FileOutputStream("FOS3.txt");
    byte[] bytes3={97,98,99,100,101,102};
    //将bytes3数组中从1开始往后的4个字节写入fos3输出流
    fos3.write(bytes3,1,4);//即字节98,99,100,101
    fos3.close();//关闭字节输出流,并释放资源
    FileOutputStream fos4=new FileOutputStream("FOS4.txt");
    String str1="大佬,你好!";//创建一个字符串
    byte[] bytes4=str1.getBytes();//调用String类的getBytes()方法将该字符串转为byte数组
    fos4.write(bytes4);//将bytes4字节数组中的所有字节写入fos4输出流
    fos4.close();//关闭字节输出流,并释放资源
    /**字节输出流的续写,有如下两个构造方法
     * public FileOutputStream(File file, boolean append)
     * 创建文件输出流以写入,由指定的File对象表示的文件
     * 
     * public FileOutputStream(String name, boolean append)
     * 创建文件输出流以指定的名称写入文件
     * 参数中有一个boolean类型的值:true表示追加数据,false表示清空原有数据 
     */
    FileOutputStream fos5=new FileOutputStream("FOS5.txt",true);
    String str2="一路相遇,";
    byte[] bytes5=str2.getBytes();
    fos5.write(bytes5);//第一次向"FOS5.txt"文件中写入相应的内容
    String str3="感谢有你!";
    byte[] bytes6=str3.getBytes();
    fos5.write(bytes6);//第二次向"FOS5.txt"文件中追加写入相应的内容
    fos5.close();//关闭字节输出流,并释放资源
    FileOutputStream fos6=new FileOutputStream("FOS6.txt",true);
    String str4="天行健,君子以自强不息!";
    byte[] bytes7=str4.getBytes();
    fos6.write(bytes7);//第一次向"FOS6.txt"文件中写入相应内容
    String str5="\n";
    byte[] bytes8=str5.getBytes();
    fos6.write(bytes8);//第二次向"FOS5.txt"文件中写入一个换行
    String str6="地势坤,君子以厚德载物!";
    byte[] bytes9=str6.getBytes();
    fos6.write(bytes9);//第三次向"FOS5.txt"文件中写入相应内容
    fos6.close();//关闭字节输出流,并释放资源
  }
}

在运行上述代码之后,我们就可以在指定的文件路径下,找到我们所写的文件以及相应的内容。如下图:👇👇👇 

3.2 字节输入流读写文件


读取数据的原理(硬盘-->内存):
Java
程序 → Java虚拟机操作系统操作系统调用读取数据的方法读取文件 

1.  构造方法:

2.  //通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名

3.  public FileInputStream(String name) throws FileNotFoundException

4.   

5.  //通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的File对象file命名

6.  public FileInputSt

构造方法:
//通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名
public FileInputStream(String name) throws FileNotFoundException
//通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的File对象file命名
public FileInputStream(File file) throws FileNotFoundException


import java.io.*;
public class IODemo02 {
  public static void main(String[] args) throws IOException {
    //创建FileInputStream对象,构造方法中绑定要读取的数据源
    FileInputStream fis1=new FileInputStream("E:/Eclipse/Java Project/Love/FOS1.txt");
    System.out.println("读取文件FOS1中的内容:");
    int len=0;
    //read()方法是一个字节一个字节的进行读取
    while((len=fis1.read())!=-1) {
      System.out.print((char)len + " ");
    }
    /*int byte0=fis1.read();
    char ch0=(char)byte0;//65 对应字符 A
    System.out.println(byte0 + " 对应:" + ch0);
    int byte1=fis1.read();
    char ch1=(char)byte1;//66 对应字符 B
    System.out.println(byte1 + " 对应:" + ch1);
    int byte2=fis1.read();
    char ch2=(char)byte2;//67 对应字符 C
    System.out.println(byte2 + " 对应:" + ch2);
    int byte3=fis1.read();
    char ch3=(char)byte3;
    System.out.println(byte3 + " 对应:" + ch3);
    此时已将FOS1文件中的内容全部读完,再进行读取,将输出-1*/
    fis1.close();//关闭字节输入流,并释放资源
                System.out.print();
    FileInputStream fis2=new FileInputStream("E:/Eclipse/Java Project/Love/FOS2.txt");
    System.out.println("读取文件FOS2中的内容:");
    byte[] bytes1=new byte[3];
    int len1=fis2.read(bytes1);
    for(int i=0;i<len1;i++) {
      char ch3=(char)bytes1[i];
      System.out.print(ch3 + " ");
    }
    fis2.close();//关闭字节输入流,并释放资源
    System.out.println();
    FileInputStream fis3=new FileInputStream("E:/Eclipse/Java Project/Love/FOS3.txt");
    System.out.println("读取文件FOS3中的内容:");
    byte[] bytes2=new byte[5];
    int len2=fis3.read(bytes2,1,4);//len2=4
    for(int i=1;i<=4;i++) {
      char ch4=(char)bytes2[i];
      System.out.print(ch4 + " ");
    }
    fis3.close();//关闭字节输入流,并释放资源
    System.out.println();
  }
}

在运行上述代码之后,可以看到下面的运行结果,以及我们拷贝文件的结果。如下图:👇👇👇


3.3 字节缓冲流的效率测试


缓冲流,也叫高效流。能够高效读写缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化对象等等。它是四个基本File流的增强,所以也是4个流,按照数据类型分类。

·       字节缓冲流:BufferedInputStreamBufferedOutputStream

·       字符缓冲流:BufferedReaderBufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO读取次数,从而提高读写的效率。

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

构造方法:
//创建一个新的字节缓冲输入流
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
//创建一个新的字节缓冲输出流
BufferedOutputStream(OutputStream out)//将数据写入指定的底层输出流
BufferedOutputStream(OutputStream out, int size)//将具有指定缓冲区大小的数据写入指定的底层输出流
//参数:
InputStream in:字节输入流
OutputStream out:字节输出流
int size:缓冲区大小,不写的话,默认
import java.io.*;
public class IODemo03 {
  public static void main(String[] args) throws IOException {
    //普通的文件拷贝
    long beginTime1=System.currentTimeMillis();
    FileInputStream FIS1=new FileInputStream("E:/Eclipse/Java Project/Love/集合.jpg");
    FileOutputStream FOS1=new FileOutputStream("E:/Eclipse/Java Project/Love/集合1.jpg");
    System.out.print("普通的文件拷贝");
    int length1=0;
    while((length1=FIS1.read())!=-1) {
      FOS1.write(length1);
    }
    FIS1.close();//关闭字节输入流,并释放资源
    FOS1.close();//关闭字节输出流,并释放资源
    long endTime1=System.currentTimeMillis();
    System.out.println("花费的时间为:" + (endTime1-beginTime1) + "ms");
    //使用字节流的缓冲区进行文件拷贝
    long beginTime2=System.currentTimeMillis();
    FileInputStream FIS2=new FileInputStream("E:/Eclipse/Java Project/Love/集合.jpg");
    FileOutputStream FOS2=new FileOutputStream("E:/Eclipse/Java Project/Love/集合2.jpg");
    System.out.print("使用字节流的缓冲区进行文件拷贝");
    int length2=0;
    byte[] bytes1=new byte[1024];
    while((length2=FIS2.read(bytes1))!=-1) {
      FOS2.write(bytes1,0,length2);
    }
    FIS2.close();//关闭字节输入流,并释放资源
    FOS2.close();//关闭字节输出流,并释放资源
    long endTime2=System.currentTimeMillis();
    System.out.println("花费的时间为:" + (endTime2-beginTime2) + "ms");
    //使用字节缓冲流进行文件拷贝
    long beginTime3=System.currentTimeMillis();
    BufferedInputStream BIS=new BufferedInputStream(new FileInputStream("E:/Eclipse/Java Project/Love/集合.jpg"));
    BufferedOutputStream BOS=new BufferedOutputStream(new FileOutputStream("E:/Eclipse/Java Project/Love/集合3.jpg"));
    System.out.print("使用字节缓冲流进行文件拷贝");
    int length3=0;
    byte[] bytes2=new byte[1024];
    while((length3=BIS.read(bytes2))!=-1) {
      BOS.write(bytes2,0,length3);
    }
    BIS.close();//关闭字节缓冲输入流,并释放资源
    BOS.close();//关闭字节缓冲输出流,并释放资源
    long endTime3=System.currentTimeMillis();
    System.out.println("花费的时间为:" + (endTime3-beginTime3) + "ms");
  }
}


从图中可以看出拷贝文件所消耗的时间明显减少了很多,这说明使用字节缓冲流同样可以有效的提高程序的传输效率。

这种方式与字节流的缓冲区类似,都对数据进行了缓冲,从而有效的提高了数据的读写效率。 

相关文章
|
26天前
|
存储 数据采集 搜索推荐
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
本篇文章探讨了 Java 大数据在智慧文旅景区中的创新应用,重点分析了如何通过数据采集、情感分析与可视化等技术,挖掘游客情感需求,进而优化景区服务。文章结合实际案例,展示了 Java 在数据处理与智能推荐等方面的强大能力,为文旅行业的智慧化升级提供了可行路径。
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
|
26天前
|
机器学习/深度学习 数据采集 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在城市空气质量监测与污染溯源中的应用(216)
本文探讨Java大数据可视化在城市空气质量监测与污染溯源中的创新应用,结合多源数据采集、实时分析与GIS技术,助力环保决策,提升城市空气质量管理水平。
Java 大视界 -- 基于 Java 的大数据可视化在城市空气质量监测与污染溯源中的应用(216)
|
26天前
|
存储 监控 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在企业生产运营监控与决策支持中的应用(228)
本文探讨了基于 Java 的大数据可视化技术在企业生产运营监控与决策支持中的关键应用。面对数据爆炸、信息孤岛和实时性不足等挑战,Java 通过高效数据采集、清洗与可视化引擎,助力企业构建实时监控与智能决策系统,显著提升运营效率与竞争力。
|
26天前
|
Java 大数据 数据处理
Java 大视界 -- 基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战(222)
本文探讨了基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战。文章分析了传统制造模式的局限性,介绍了工业互联网带来的机遇,并结合实际案例展示了 Java 在多源数据采集、实时处理及设备协同优化中的关键技术应用。同时,也深入讨论了数据安全、技术架构等挑战及应对策略。
|
26天前
|
数据采集 搜索推荐 Java
Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用(221)
本文探讨 Java 大数据在智能教育虚拟学习环境中的应用,涵盖多源数据采集、个性化推荐、实时互动优化等核心技术,结合实际案例分析其在提升学习体验与教学质量中的成效,并展望未来发展方向与技术挑战。
|
26天前
|
机器学习/深度学习 人工智能 自然语言处理
Java 大视界 -- Java 大数据机器学习模型在自然语言生成中的可控性研究与应用(229)
本文深入探讨Java大数据与机器学习在自然语言生成(NLG)中的可控性研究,分析当前生成模型面临的“失控”挑战,如数据噪声、标注偏差及黑盒模型信任问题,提出Java技术在数据清洗、异构框架融合与生态工具链中的关键作用。通过条件注入、强化学习与模型融合等策略,实现文本生成的精准控制,并结合网易新闻与蚂蚁集团的实战案例,展示Java在提升生成效率与合规性方面的卓越能力,为金融、法律等强监管领域提供技术参考。
|
26天前
|
存储 人工智能 算法
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)
本文探讨 Java 大数据在智能医疗影像压缩与传输中的关键技术应用,分析其如何解决医疗影像数据存储、传输与压缩三大难题,并结合实际案例展示技术落地效果。
|
26天前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
26天前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
26天前
|
机器学习/深度学习 搜索推荐 数据可视化
Java 大视界 -- Java 大数据机器学习模型在电商用户流失预测与留存策略制定中的应用(217)
本文探讨 Java 大数据与机器学习在电商用户流失预测与留存策略中的应用。通过构建高精度预测模型与动态分层策略,助力企业提前识别流失用户、精准触达,实现用户留存率与商业价值双提升,为电商应对用户流失提供技术新思路。

热门文章

最新文章