前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进。随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式有下列两个好处:
1、文件长度以字节为单位计量,可以分配等长的字节数组,却无法分配合适长度的字符数组,因此采用字节方式便于从文件中读取数据。
2、字符流工具主要以字符为单位处理数据,意味着它适合用来读写文本文件,不适用于二进制文件(包括图片文件、音频文件、视频文件等等),而字节方式不存在此类限制。
虽说随机文件工具已经实现了以字节方式读写文件,但它更适合大文件的任意位置读写,倘若用于一般文件的处理就显得大材小用了。毕竟杀鸡焉用牛刀,何况牛刀也太笨重了,远不如普通的刀子灵活。可是字符流工具力有不逮,随机文件工具又未恰到好处,难不成还有更方便易用的工具吗?其实文件读写可以抽象为对某个设备的输入输出操作,写文件相当于向文件输出数据,读文件相当于从文件输入数据。类似的操作还有很多,例如打印文件可看作是向打印机输出待打印的文本,敲代码可看作是从键盘输入每个按键对应的字符。Java把这些相关的输入输出操作统一为I/O流,其中字母I表示输入Input,字母O表示输出Output。先前介绍的FileReader和FileWriter属于I/O流中的字符流,而以字节为单位的则是I/O流中的字节流,字节流本身是个大家族,它有两个基类,分别是输入流InputStream和输出流OutputStream,由这两个类派生出丰富多样的输入输出流,各自用于不同的业务场景。
文件字节流是输入输出流当中最常见的一种,它包括文件输出流FileOutputStream和文件输入流FileInputStream,其中FileOutputStream用来将数据写入文件,FileInputStream用来从文件读取数据,并且二者都采取字节数组保存信息。文件输出流的构造方法支持直接填入文件路径,其对象可调用write方法把字节数组写入文件,也可调用close方法关闭文件,用起来FileOutputStream像是File与FileWriter的结合体,当然就更加好用。同时不管是输出流还是输入流,它们都实现了AutoCloseable接口,故而支持try-with-resources方式的资源自动释放。下面是利用文件输出流FileOutputStream写文件的代码例子:

 private static String mFileName = "D:/test/aae.txt";// 利用文件输出流写入文件。注意FileOutputStream处理的是字节信息private static void writeFile() {String str = "白日依山尽,黄河入海流。\n欲穷千里目,更上一层楼。";// 根据指定路径构建文件输出流对象try (FileOutputStream fos = new FileOutputStream(mFileName)) {fos.write(str.getBytes()); // 把字节数组写入文件输出流// 在try(...)里面创建的输入输出流,程序会在处理完成后自动关闭,所以下面的close方法不必显式调用//fos.close(); // 关闭文件输出流} catch (Exception e) {e.printStackTrace();}}

依此类推,文件输入流的构造方法同样支持直接填入文件路径,也拥有read读文件方法和close关闭文件方法,像是File与FileReader的结合体。另外FileInputStream有几个方法值得一提,一个是skip方法,它命令当前位置跳过若干字节,注意该方法跳过的是字节数而非字符数。另一个是available方法,它返回文件当前位置后面的剩余部分大小,刚创建文件输入流对象之时调用available方法,得到的就是文件大小;如果先调用skip方法再调用available方法,得到的数值为文件大小减去跳过的字节数。下面是利用文件输入流读文件的代码例子:

  // 利用文件输入流读取文件private static void readFile() {// 根据指定路径构建文件输入流对象try (FileInputStream fis = new FileInputStream(mFileName)) {// 分配长度为文件大小的字节数组。available方法返回当前位置后面的剩余部分大小byte[] bytes = new byte[fis.available()];fis.read(bytes); // 从文件输入流中读取字节数组String content = new String(bytes); // 把字节数组转换为字符串System.out.println("content="+content);// 在try(...)里面创建的输入输出流,程序会在处理完成后自动关闭,所以下面的close方法不必显式调用//fis.close(); // 关闭文件输入流} catch (Exception e) {e.printStackTrace();}}

  

更多Java技术文章参见《Java开发笔记(序)章节目录》

转载于:https://www.cnblogs.com/pinlantu/p/10753179.html

Java开发笔记(八十八)文件字节I/O流相关推荐

  1. Android开发笔记(十八)书籍翻页动画PageAnimation

    前面几节的动画都算简单,本文就介绍一个复杂点的动画--书籍翻页动画.Android有自带的翻页动画ViewPager,不过ViewPager只实现了平移效果.即便使用补间组合动画或者属性动画,也只是把 ...

  2. Docker最全教程之使用Docker搭建Java开发环境(十八)

    前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...

  3. 【Java学习笔记之十八】Javadoc注释的用法

    Javadoc注释的用法 Java 文档 // 注释一行 /* ...... */ 注释若干行 /** ...... */ 注释若干行,并写入 javadoc 文档 通常这种注释的多行写法如下: /* ...

  4. 【Visual C++】游戏开发笔记三十八 浅墨DirectX提高班之六 携手迈向三维世界 四大变换展身手

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...

  5. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...

  6. Django笔记三十八之发送邮件

    这一篇笔记介绍如何在 Django 中发送邮件. 在 Python 中,提供了 smtplib 的邮件模块,而 Django 在这个基础上对其进行了封装,我们可以通过 django.core.mail ...

  7. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  8. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  9. SAP UI5 应用开发教程之四十八 - 如何在 SAP UI5 应用里开发条形码扫描功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. 详解javascript: void(0);
  2. 位域(bit fields)简介
  3. VS2010下使用dmp文件和pdb文件定位程序异常代码行号的注意事项
  4. Discuz!6.1.0 用户密码如何加密的?
  5. python3虚拟环境搭建_python3 =虚拟环境的搭建
  6. NOIP模拟测试30「return·one·magic」
  7. 对比linux终端模式和图形模式,Linux知识-2. Linux初学(CnetOS Linux7)之切换命令模式和图形模式...
  8. virtualbox ,centos 的多网卡如何设置
  9. docker搭建replication集群
  10. 腾讯申请自动驾驶相关专利 可实现自动变道
  11. java反射(测试下用onenote把笔记发送到oschina上,文章来源网络)
  12. 第六篇 | 解决linux环境中mysql默认端口3306无法连接问题
  13. 【微信数据迁移】微信数据怎么恢复到另一部手机
  14. Javaweb面试题(一)———更新中
  15. 如何创作属于自己的NFT?
  16. java解析edi报文_EDI文件解析语法规则
  17. 【前端——Node.js】:身份认证
  18. -- 27、 查询出只有两门课程的全部学生的学号和姓名(不重点)(自己做出)
  19. 计算机网络1-6章考研题
  20. 2017北京ICPC -G - Liaoning Ship’s Voyage (HihoCoder - 1633)几何

热门文章

  1. 位于地下88米,一晚6000块,上海这家酒店房间内竟还有玄机!
  2. 年会季来临,年会会场管理一招搞定!
  3. 简说设计模式——组合模式
  4. Java 学习笔记之 Synchronized锁重入
  5. Android 6.0 Permission权限与安全机制
  6. linux man命令汉化 操作
  7. Linux 下 Open××× 安装和 Windows Open××× GUI 安装笔记
  8. Python 代码覆盖率统计工具 coverage.py
  9. 用Python解压tgz文件
  10. 大括弧之战 代码风格