Java中IO流 字节流实例详解

发布时间 - 2026-01-11 01:07:04    点击率:

Java中IO流 字节流实例详解

IO流(输入流、输出流),又分为字节流、字符流。

  流是磁盘或其它外围设备中存储的数据的源点或终点。

  输入流:程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道。

  输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。

字节流

  1.InputStream、OutputStream

  InputStream抽象了应用程序读取数据的方式

  OutputStream抽象了应用程序写出数据的方式

  2.读到文件结尾,称为EOF = end,读到-1就读到结尾

  3.输入流基本方法

  int b = in.read();读取一个字节,无符号填充到int的低八位.-1是EOF

  int.read(byte[] buf)读取数据填充到字节数组buf

  int.read(byte[] buf, int start, int size)读取数据填充到字节数组buf,从buf的start位置开始存储size长度的数据

  4.输出流基本方法

  out.write(int b);写出一个byte到流,b的低八位

  out.write(byte[] buf);将buf字节数组都写入到流

  out.write(byte[] buf, int start, int size);字节数组buf从start位置开始写size长度的字节到流

  5.FileInputStream是InputStream的子类,具体实现了在文件上读取数据

    6.FileOutputStream是OutputStream的子类,实现了向文件中写出字节数据的方法

  FileInputStream的demo:

package com.test.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtils {
  /**
   * 读取指定文件内容,按照十六进制输出到控制台
   * 并且每输出10个byte换行
   * @param fileName
   * @throws IOException
   */
  public static void printHex(String fileName) throws IOException {
    //把文件作为字节流进行读操作
    FileInputStream in = new FileInputStream(fileName);
    int b;
    int i = 1;
    while ((b = in.read()) != -1) {
      if (b <= 0xf) {
        System.out.print("0");
      }
      System.out.print(Integer.toHexString(b) + " ");
      if (i % 10 == 0) {
        System.out.println("");
      }
      i++;
    }
    in.close();
  }

  public static void printHexByByteArray(String fileName) throws IOException {
    FileInputStream in = new FileInputStream(fileName);
    byte[] buf = new byte[20*1024];
    
    //如果字节数组够大,可以一次性读完
    //从in中批量读取字节,放入到buf这个字节数组中,从第0个位置开始放,最多放buf.length个,返回的是读到的字节的个数
    /* int bytes = in.read(buf, 0, buf.length);
    int j = 1;
    for(int i = 0;i < bytes; i++) {
      if (buf[i] <= 0xf) {
        System.out.print("0");
      }
      System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
      if (j % 10 == 0) {
        System.out.println("");
      }
      j++;
    } */
    
    //如果字节数组不够大,不能一次性读完
    int bytes = 0;
    int j = 1;
    while ((bytes = in.read(buf, 0, buf.length)) != -1) {
      for (int i = 0; i <bytes; i++) {
        if (buf[i] <= 0xf) {
          System.out.print("0");
        }
        System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
        if (j % 10 == 0) {
          System.out.println("");
        }
        j++;
      }
    }
  }

}

  FileOutputStream的demo:

package com.test.io;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputDemo {

  public static void main(String[] args) throws IOException {
    //如果该文件不存在,则直接创建,如果存在,删除后创建。(如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。)
    FileOutputStream out = new FileOutputStream("F:\\javaio\\out.dat");
    out.write('A');//写入了‘A'的低八位(一次只写入一个字节)
    int a = 10;
    out.write(a >>> 24);
    out.write(a >>> 16);
    out.write(a >>> 8);
    out.write(a);
    
    byte[] b = "10".getBytes();
    out.write(b);
    
    out.close();
    
    IOUtils.printHex("F:\\javaio\\out.dat");    
  }
}

  7.DataOutputStream和DataInputStream,对流功能的扩展,可以更加方便的读取int,long,字符等类型数据。

package com.test.io;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOutputDemo {

  public static void main(String[] args) throws IOException {
    String file = "F:\\javaio\\b.txt";
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
    dos.writeInt(10);
    dos.writeInt(-10);
    dos.writeLong(10l);
    dos.writeDouble(10.5);
    dos.writeUTF("你好");
    dos.writeChars("中国");
    dos.close();
    IOUtils.printHex(file);
  }
}

  运行结果:

00 00 00 0a ff ff ff f6 00 00 
00 00 00 00 00 0a 40 25 00 00 
00 00 00 00 00 06 e4 bd a0 e5 
a5 bd 4e 2d 56 fd 

  其中,00 06两个字节是“你好”这两个中文的字节个数。

package com.test.io;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class DataInputDemo {

  public static void main(String[] args) throws IOException {
    String file = "F:\\javaio\\b.txt";
    DataInputStream dis = new DataInputStream(new FileInputStream(file));
    int i = dis.readInt();
    System.out.println(i);
    i = dis.readInt();
    System.out.println(i);
    long l = dis.readLong();
    System.out.println(l);
    double d = dis.readDouble();
    System.out.println(d);
    String s = dis.readUTF();
    System.out.println(s);
    dis.close();
  }

}

  运行结果:

10
-10
10
10.5
你好

   8.BufferedInputStream&BufferedOutputStream,这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种流模式提高了IO的性能。

  文件的拷贝:

package com.test.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtils {/**
   * 拷贝文件,字节批量读取
   * @param srcFile 源文件
   * @param destFile 目标文件
   * @throws IOException
   */
  public static void copyFile(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    byte[] buf = new byte[10*1024];
    int b;
    while ((b = in.read(buf, 0, buf.length)) != -1) {
      out.write(buf,0,b);
      out.flush();//最好加上,刷新此输出流并强制写出所有缓冲的输出字节。
    }
    in.close();
    out.close();
  }
  /**
   * 拷贝文件,利用带缓冲的字节流
   * @param srcFile
   * @param destFile
   * @throws IOException
   */
  public static void copyFileByBuffer(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    
    BufferedInputStream bis = new BufferedInputStream(in);
    BufferedOutputStream bos = new BufferedOutputStream(out);
    
    int c;
    while ((c = bis.read()) != -1) {
      bos.write(c);
      bos.flush();
    }
    
    bis.close();
    bos.close();
  }
  /**
   * 拷贝文件,通过单字节读取
   * @param srcFile
   * @param destFile
   * @throws IOException
   */
  public static void copyFileByByte(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    
    int c;
    while ((c = in.read()) != -1) {
      out.write(c);
      out.flush();
    }
    
    in.close();
    out.close();
  }
}

  测试文件拷贝:

package com.test.io;

import java.io.File;
import java.io.IOException;

public class IOUtilsTest {

  public static void main(String[] args) {
    //IOUtils.printHex("D:\\javaProgram\\Hello.java");
    try {
      long start = System.currentTimeMillis();
      //IOUtils.copyFile(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\2.mp3"));//211ms
      //IOUtils.copyFileByBuffer(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\3.mp3"));//18583ms
      IOUtils.copyFileByByte(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\4.mp3"));//37822ms
      long end = System.currentTimeMillis();
      System.out.println(end - start);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

  根据以上测试看出,文件拷贝,最快的方式是通过字节的批量读取。

        感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java—IO流  # 字节流  # java  # IO  # Java编程中字节流与字符流IO操作示例  # java IO 字节流详解及实例代码  # Java文件(io)编程_文件字节流的使用方法  # 【Java IO流】字节流和字符流的实例讲解  # 详解Java中IO字节流基本操作(复制文件)并测试性能  # Java字节流和字符流总结IO流!  # Java 超详细讲解IO操作字节流与字符流  # Java I/O (Input/Output)文件字节流举例详解  # 不存在  # 读到  # 子类  # 这两个  # 你好  # 流进  # 应用程序  # 够大  # 的是  # 源点  # 实现了  # 最多  # 希望能  # 第二个  # 即是  # 谢谢大家  # 或其它  # 该文件  # 中国  # 则将 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: 公司门户网站制作流程,华为官网怎么做?  如何快速生成可下载的建站源码工具?  如何在IIS中新建站点并配置端口与物理路径?  如何用虚拟主机快速搭建网站?详细步骤解析  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  zabbix利用python脚本发送报警邮件的方法  Android利用动画实现背景逐渐变暗  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何在企业微信快速生成手机电脑官网?  Android Socket接口实现即时通讯实例代码  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  太平洋网站制作公司,网络用语太平洋是什么意思?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何自定义建站之星模板颜色并下载新样式?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何快速搭建高效服务器建站系统?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何在IIS服务器上快速部署高效网站?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  C语言设计一个闪闪的圣诞树  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  nodejs redis 发布订阅机制封装实现方法及实例代码  如何快速建站并高效导出源代码?  详解MySQL数据库的安装与密码配置  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何用免费手机建站系统零基础打造专业网站?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  深圳网站制作的公司有哪些,dido官方网站?  ,在苏州找工作,上哪个网站比较好?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  php结合redis实现高并发下的抢购、秒杀功能的实例  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Python高阶函数应用_函数作为参数说明【指导】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  手机软键盘弹出时影响布局的解决方法  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  高端云建站费用究竟需要多少预算?  UC浏览器如何设置启动页 UC浏览器启动页设置方法