在Java中IO操作是有相应步骤的,以文件操作为例,主要的操作流程如下:

  1. 使用File类打开一个文件;
  2. 通过字节流或字符流的子类指定输出的位置;
  3. 进行读/写操作
  4. 关闭输入/输出

字节流和字符流

区别:

  • 读写单位:顾名思义,字节流以字节(byte)为读写单位,而字符流以字符为读写单位,根据码表映射字符,一次可能读入多个字符。
  • 处理对象:字节流可以处理所有类型的数据(包括图片等),而字符流只能处理字符类型的纯文本数据。
  • 字节流:一次写入或读出8位二进制。
  • 字符流:一次写入或读出至少8位二进制。不同的字符所占的字节是不同的。
    • ASCII码:

      一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。

    • UTF-8编码:

      一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

    • Unicode编码:

      一个英文等于两个字节,一个中文(含繁体)等于两个字节。

1、字节流

字节输出流OutputStream

OutputStream是整个IO包中字节输出流的最大父类,作为一个抽象类,如果要使用此类,则必须通过子类实例化对象。

OutputStream类的常用方法:

方法 返回类型 描述 备注
close() void 关闭输出流
flush() void 刷新缓冲区
write(byte[] b) void 将一个byte数组写入数据流
write(byte[] b, int off, int len) void 将一个指定范围的byte数组写入数据流
write(int b) void 将一个字节数据写入数据流 抽象方法abstract

现在要操作的是一个文件,可以使用FileOutputStream类,通过向上转型后,可以为OutputStream实例化。

字节输入流InputStream

InputStream与OutputStream类一样,也是一个抽象类,必须依靠其子类。

InputStream类的常用方法:

方法 返回类型 描述 备注
available() int 可以取得输入文件的大小
close() void 关闭输入流
read(byte[] b) int 将内容读到byte数组中,同时返回读入的个数
read() int 读取内容,以数字的方式读取 抽象方法abstract

现在要操作的是一个文件,可以使用FileInputStream类,通过向上转型后,可以为InputStream实例化。

实例

1、将数据写到TXT中

// 1. 使用File类打开一个文件;
File file = new File("d:" + File.separator + "test.txt"); //声明File对象
// 2. 通过字节流或字符流的子类指定输出的位置
OutputStream fos = new FileOutputStream(file); // 若是追加文件内容,则(file, true)
// 3. 进行写操作
String str = "你好,世界";
fos.write(str.getBytes("UTF-8")); //将字符串变成字节byte数组,使用UTF-8编码
// 4. 关闭输出
fos.close();

2、将TXT导入到内存

// 1. 使用File类打开一个文件;
File file = new File("d:" + File.separator + "test.txt");
// 2. 通过字节流或字符流的子类指定输出的位置
InputStream fis = new FileInputStream(file);
// 3. 进行读操作
byte[] buf = new byte[1024]; // 所有的内容读到此数组中临时存放
int len; //用于记录读取的数据个数
String myStr = "";
while((len = fis.read(buf)) != -1) { //将内容读到byte数组中,同时返回个数,若为-1,则内容读到底
myStr += new String(buf, 0, len, "UTF-8");
}
// 4. 关闭输出
fis.close(); System.out.println(myStr);

2、字符流

缓冲区:可以简单地理解为一段内存区域。
某些情况下,如果一个程序频繁地操作一个资源(如 文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。

注意:字符流使用了缓冲区,而字节流没有使用缓冲区。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。

字符输出流Writer

Writer是一个字符流的输出类,作为一个抽象类,如果要使用此类,则肯定要使用其子类。

Writer类的常用方法:

方法 返回类型 描述 备注
close() void 关闭输出流 abstract
write(String str) void 将字符串输出
write(char[] cbuf) void 将字符数组(缓冲区)输出
flush() void 强制性清空缓存 abstract

此时如果是向文件中写入内容,应该使用FileWriter子类。

字符输入流Reader

Reader是使用字符的方式从文件中取出数据,作为一个抽象类,如果要使用此类,则肯定要使用其子类。

Reader类的常用方法:

方法 返回类型 描述 备注
close() void 关闭输入流 abstract
read() int 读取单个字符
read(char[] cbuf) int 将内容读到字符数组中,返回读入的长度

此时如果是向文件中读取内容,应该使用FileReader子类。

实例

1、将数据写到TXT中

// 1. 使用File类打开一个文件;
File file = new File("d:" + File.separator + "test.txt");
// 2. 通过字节流或字符流的子类指定输出的位置
Writer fw = new FileWriter(file);
// 3. 进行写操作
fw.write(str);
// 4. 关闭输出
fw.close();

2、将TXT导入内存中

// 1. 使用File类打开一个文件;
File file = new File("d:" + File.separator + "test.txt");
// 2. 通过字节流或字符流的子类指定输出的位置
Reader fr = new FileReader(file);
// 3. 进行读操作
char[] buf2 = new char[1024]; // 所有的内容读到此数组中临时存放
int len2;
String myStr2 = "";
while((len2 = fr.read(buf)) != -1) {
myStr2 += new String(buf2, 0, len2); //将缓冲区buf2数组中的0到len2字符串读出
}
// 4. 关闭输入
fw.close(); System.out.println(myStr2);

3、转换流

整个IO包实际上分为字节流和字符流,但是除了这两个流之外,还存在一组字节流-字符流的转换类。

  • OutputStreamWriter:是Writer的子类,将输出字符流变为字节流字符流→字节流),即 将一个字符流的输出对象变为字节流的输出对象。
  • InputStreamReader:是Reader的子类,将输入字节流变为字符流,(字节流→字符流),即 将一个字节流的输入对象变为字符流的输入对象。

提示:
FileOutputStream 是 OutputStream 的直接子类
FileInputStream 也是 OutputStream 的直接子类
而 FileWriter 并不直接是 Writer 的子类,而是 OutputStreamWriter 的之类
而 FileReader 并不直接是 Reader 的子类,而是 InputStreamReader 的之类
所以,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入/输出流的。

PS : 所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。

结论:只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。

Java IO 导入导出TXT文件的更多相关文章

  1. Java IO 导入导出Excel表格

    1.将excel导入到内存 1. 调用工作簿Workbook的静态方法getWorkbook(),获得工作簿Workbook对象 InputStream in = new FileInputStrea ...

  2. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  3. Tomcat9.0.13 Bug引发的java.io.IOException:(打开的文件过多 Too many open files)导致服务假死

    问题背景: 笔者所在的项目组最近把生产环境Tomcat迁移到Linux,算是顺利运行了一段时间,最近一个低概率密度的(too many open files)问题导致服务假死并停止响应客户端客户端请求 ...

  4. Java代码输出到txt文件(申请专利贴源码的必备利器)

    最近公司在申请专利,编写不少文档,项目的代码量实在是过于庞大.如果一个一个的复制粘贴虽然能够完成,但是对于程序员而言实在没有这个必要.shell或者python就能解决这个问题.由于我个人对于shel ...

  5. Java中导入导出Excel -- POI技术

    一.介绍: 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实 ...

  6. ASP.NET Core导入导出Excel文件

    ASP.NET Core导入导出Excel文件 希望在ASP.NET Core中导入导出Excel文件,在网上搜了一遍,基本都是使用EPPlus插件,EPPlus挺好用,但商用需要授权,各位码友若有好 ...

  7. MYSQL导入导出.sql文件

    MYSQL导入导出.sql文件   一.MYSQL的命令行模式的设置:桌面->我的电脑->属性->环境变量->新建->PATH=“:path\mysql\bin;”其中p ...

  8. 【转】 (C#)利用Aspose.Cells组件导入导出excel文件

    Aspose.Cells组件可以不依赖excel来导入导出excel文件: 导入: public static System.Data.DataTable ReadExcel(String strFi ...

  9. (C#)利用Aspose.Cells组件导入导出excel文件

    Aspose.Cells组件可以不依赖excel来导入导出excel文件: 导入: public static System.Data.DataTable ReadExcel(String strFi ...

随机推荐

  1. 《ServerSuperIO Designer IDE使用教程》- 5.树形结构管理设备驱动,小版本更新。发布:v4.2.3.1版本

    v4.2.3.1 更新内容:1.选择和管理设备驱动,增加树状结构显示.2.优化ide代码,核心代码没有改动.下载地址:官方下载 5. 树形结构管理设备驱动,小版本更新 5.1    概述 此次升级主要 ...

  2. IOS 修改图片的地理位置信息

    直接上代码: // // ViewController.m // changeLocation // // Created by 陈飞 on 16/10/31. // Copyright © 2016 ...

  3. Python 实现整数线性规划:分枝定界法(Branch and Bound)

    今天做作业,要实现整数线性规划的分枝定界法算法.找了一些网上的博客,发现都很屎,感觉自己写的这个比较清楚.规范,所以在此记录.如有错误,请指正. from scipy.optimize import ...

  4. 手把手教你从ESXI部署到vSphere web Client管理控制

    作为实验环境,一台物理机即可 既然是实验环境,那么首先把这个物理机装成ESXI6.5的宿主机并配置网络系统 第二步骤就是在ESXI上面导入OVF文件,注册一台虚机,作为数据管理中心 第三步骤就是基于这 ...

  5. 2018-2019-2 网络对抗技术 20165239Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165239 Exp3 免杀原理与实践 win10 ip地址 192.168.18.1 fenix ip地址为 192.168.18.128 (1)杀软是如何 ...

  6. Kali安装Docker

    ---恢复内容开始--- 第一周 计划安装好docker     准备 审计thinkphp 框架 先把docker 安装的笔记补上 本来是在unbuntu 安装了一遍 并run 了几个镜像和基本操作 ...

  7. 在WINDOWS中安装使用GSL(MinGW64+Sublime Text3 & Visual Studio)

    本文介绍在Windows下安装使用GSL库,涉及GSL两个版本(官方最新版及GSL1.8 VC版).msys shell.GCC.G++等内容,最终实现对GSL安装及示例基于MinGW64在Subli ...

  8. java 堆、栈、方法区/ 类变量、成员变量、局部变量

    方法区:类信息.类变量(静态变量和常量).方法 堆:对象.成员变量 栈:局部变量 (1)当程序运行时,首先通过类装载器加载字节码文件,经过解析后装入方法区!在方法区中存了类的各种信息,包括类变量.类常 ...

  9. 使用ACR122U NFC读卡器对M1卡进行读写操作(可以读写中文)

    因为项目需要,第一次接触到了ACR122U NFC读卡器(非接触式)和M1卡,首先介绍一下想要读写应该知道的基本知识. 我就根据我的理解先叙述一下: ACR122U 是一款连机非接触式智能卡读写器,可 ...

  10. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...