java IO 字节流详解及实例代码

发布时间 - 2026-01-11 00:09:32    点击率:

java IO 字节流详解

1.         如何理解输入输出流?

这是我当初在学习Java IO这一块很难理解的一块,输入输出流我们可必须以一个为参照物:我们以内存为参照物,凡是写入内存的我们叫输入流,从内存中写出的我们叫输出流。看下面的示例图

有了这样的一个概念对于我们再学习Java中的IO流我相信就会变得特别简单了。 

2.         再看流的分类

流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕。流分类的方式很多:

1、按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序。(InputStream OutPutStream)
2、按照处理数据的单位不同分,字节流和字符流,字节流读取的最小单位是一个字节(1byte=8bit),而字符流一次可以读取一个字符(1char = 2byte = 16bit)。(InputStream Reader)
3、按照功能的不同分,分节点流和处理流,节点流是直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的 一种流,FileInputStream是一个接点流,可以直接从文件读取数据,但是BufferedInputStream可以包装 FileInputStream,使得其有缓冲功能。(FileInputStream BufferedInputStream)
其实除了以上三种分类外,还有一些常常听到的一些分类比如:对象流、缓冲流、压缩流、文件流等等。其实都是节点流和处理流的子分类。当然你也可以创建新的流类型,只要你需要。

3.         字节流:

字节流主要操作byte类型数据,以byte数组为准,主要操作类有InputStream(字节输入流)、OutputSteam(字节输出流)由于IputStream和OutputStream都是抽象类,所要要用这两个类的话,则首先要通过子类实例化对象。下面就是这两个类的一些子类结构图 

 

1)        字节输出流:OutputStream

OutputStream是一个抽象类,要想使用它,必须通过子类来实例化它。 

OutputStream类的常用方法

方法名称

描述

public void close() throws IOException

关闭输出流

public void flush() throws IOException

刷新缓冲区

public void write(byte[] b) throws IOException

将一个byte数组写入数据流

public void write(byte[] b,int off,int len) throws IOException

将一个指定范围的byte数组写入数据流

public abstract void write(int b) throws IOException

将一个字节数据写入数据流

  

实例1:Helloworld从HelloWorld开始

功能:(向一个名为”hello.txt”的文本文件中写一个“HelloWorld”) 

public static void main(String[] args) throws Exception { 
 
  // 创建一个以当前工程目录下的名为“helloworld.txt”的文本文件 
 
  File file = new File("hellowolrd.txt"); 
 
  OutputStream outputStream = null; 
 
  // 通过FileOutPutStream的子类实例化OutputStream对象 
 
  outputStream = new FileOutputStream(file); 
 
  // 声明一个字符串 
 
  String str = "hello,world"; 
 
  // 将字符串转换成字节数组 
 
  byte[] b = str.getBytes(); 
 
  // 写入数据 
 
  outputStream.write(b); 
 
  // 关闭输出流 
 
  outputStream.close(); 
 
  outputStream.flush(); 
 
} 

我们可以看到当前工程目录下已经有一个helloworld.txt且里面已经有数据,如果我们把str的值改变的话,文本文件里的数据也会改变,所以我们想是不是可以不删除原来的数据,在追尾上追加上。

我们只要在构造FileOutputStream对象的时候选择另一种构造方法就可以了

FileOutputStream(File file,boolean append)

第二个参数就是是否采用追加的方式写入到文本文件中

把上面的代码修改下就可以了

outputStream = new FileOutputStream(file,true);

 再从例子1我们理解我们对输入输出流的理解,在这个例子里,我们声明的字符串肯定是在内存中的,现在我们要从内存中把数据写到文本中,所以我们用到输出流。这也正符合了我对输入输出流的理解,当然大家肯定还有其他的理解方式。

2)        字节输入流:InputStream

 InputStream类的常用方法

方法名称

描述

public void avaliable() throws IOException

可以取得输入文件的大小

public void close() throws IOException

关闭输入流

public abstract int read() throws IOException

读取内容,以数字的方式读取

public int read (byte b) throws IOException

将内容读到byte数组,同时返回读入的个数

与OutputStream类一样,InputStream本身也是一个抽象类,要想使用它,也必须依靠其子类。

实例2:还是HelloWorld

在上一个例子的基础上我们从文本中读取数据并且把它显示在控制台上

public static void main(String[] args) throws Exception { 
 
    // 创建一个以当前工程目录下的名为“helloworld.txt”的文本文件 
 
    // 这个文件在上一个例子里已经创建,并且里面已有数据 
 
    File file = new File("hellowolrd.txt"); 
 
    // 声明InputStream对象 
 
    InputStream inputStream = null; 
 
    // 通过FileInputStream子类实例化InputStream对象 
 
    inputStream = new FileInputStream(file); 
 
    // 声明一个字节数组用以接收读入的数据 
 
    byte[] b = new byte[1024]; 
 
    // 开始读入数据,将数据内容读到此数组中 
 
    inputStream.read(b); 
 
    // 关闭输入流 
 
    inputStream.close(); 
 
    // 在控制台打印 
 
    System.out.println(new String(b)); 
 
  } 

如果以这种方式打印,我们可以看到虽然控制台里是打印出了文本文件中的内容,但是后面跟了很多空格,这是我们不需要的,对于这种情况我们有两种解决方式

方式一:声明字节数组的时候指定字节数组的长度为文本内容的长度

byte[] b=new byte[(int)file.length()]; 

方式二:在将字节数组转换成字符串的调用String(byte b,int off,int len)这个构造函数

System.out.println(new String(b,0,(int)file.length()));

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


# java  # IO  # 字节流  # 字节流详解  # Java编程中字节流与字符流IO操作示例  # Java中IO流 字节流实例详解  # Java文件(io)编程_文件字节流的使用方法  # 【Java IO流】字节流和字符流的实例讲解  # 详解Java中IO字节流基本操作(复制文件)并测试性能  # Java字节流和字符流总结IO流!  # Java 超详细讲解IO操作字节流与字符流  # Java I/O (Input/Output)文件字节流举例详解  # 子类  # 文本文件  # 是一个  # 都是  # 基础上  # 这两个  # 要想  # 可以看到  # 在上  # 转换成  # 目录下  # 抽象类  # 创建一个  # 读到  # 就可以  # 的人  # 这是  # 这一  # 就会  # 是在 


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


相关推荐: laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  如何用西部建站助手快速创建专业网站?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  ,怎么在广州志愿者网站注册?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Python3.6正式版新特性预览  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  微信小程序 闭包写法详细介绍  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  JS中对数组元素进行增删改移的方法总结  如何在腾讯云服务器快速搭建个人网站?  晋江文学城电脑版官网 晋江文学城网页版直接进入  昵图网官方站入口 昵图网素材图库官网入口  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  常州企业网站制作公司,全国继续教育网怎么登录?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel storage目录权限问题_Laravel文件写入权限设置  javascript基本数据类型及类型检测常用方法小结  Laravel怎么在Controller之外的地方验证数据  Laravel如何实现用户密码重置功能?(完整流程代码)  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  浅析上传头像示例及其注意事项  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  JavaScript常见的五种数组去重的方式  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  js实现点击每个li节点,都弹出其文本值及修改  Laravel如何配置任务调度?(Cron Job示例)  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  敲碗10年!Mac系列传将迎来「触控与联网」双革新  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Android okhttputils现在进度显示实例代码  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何快速搭建个人网站并优化SEO?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何登录建站主机?访问步骤全解析  如何快速搭建高效服务器建站系统?  Laravel如何使用Vite进行前端资源打包?(配置示例)  Linux系统命令中tree命令详解  网站建设保证美观性,需要考虑的几点问题!