Java学习之FileInputStream与FileReader的区别

2023-11-19

我们对于文件中数据的操作无非就有两种:读出与写入
对于Java来说,对数据的操作有字节流(FileOutputStream、FileInputStream)与字符流(FileWriter、FileReader),这两种方法其实差不多,都是从文件中写入数据或读出数据,他俩的区别就是字节流是以字节为单位进行操作的,而字符流是以字符为单位进行操作的。
我们都知道一个英文字母占一个字节,一个中文汉字占两个字节,而一个英文字母与一个中文汉字我们都称之为一个字符,所以说我们要根据文件中所存储的数据内容的不同而选择不同的操作方法。
假如说我们一个文本文档中存储了这样一句话:

321爱就像蓝天白云,晴空万里,突然暴风雨!

这句话中有数字、汉字以及标点符号,
数字:1个字节
中文汉字:2个字节
中文标点符号:2个字节
英文标点符号:1个字节
而他们都属于1个字符

如果我们使用字节流来进行读取文件的操作,部分代码如下

FileInputStream in;
try {
            in=new FileInputStream(file);
            byte bytRead[]=new byte[1024];
            int len=in.read(bytRead);
            System.out.println("文件中的内容是:"+new String(bytRead,0,4));//注意这里我们只读取了文件中的前四个字节
            in.close();
        }catch(IOException e) {
            e.printStackTrace();
        }

输出结果为:

文件中的内容是:321?

我们发现前面三个数字可以正常输出,但是文本中的“我”却没有正常输出,而是输出了一个“?”,这就是字节流的特点,它是以字节为单位来进行操作的,他只输出了前4个字节的内容,而“321我”是5个字节,所以“我”没有被正常输出出来

然后我们再来看字符流的操作,部分代码如下

FileReader fr=null;
try {
            fr=new FileReader(file);
            char chRead[]=new char[1024];
            int hasread=-1;
            try {
                while((hasread=fr.read(chRead))!=-1) {//hasread表示文本中的字符数
                    System.out.println("文件中的内容是:"+new String(chRead,0,hasread));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }catch(FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            try {
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

输出结果:

文件中的内容是:321爱

我们发现在输出的时候,传入的参数同样都是4,而我们此时用字符流进行操作的时候就可以完整把原数据输出出来
字节流:

System.out.println("文件中的内容是:"+new String(bytRead,0,4));

字符流:

System.out.println("文件中的内容是:"+new String(chRead));

以上就是字节流与字符流的主要区别,对于FileOutputStream和FileWriter也是同样的道理,只不过他们两个是对文件进行写入的操作。我们只要清楚他们操作的单位不一样就可以了:
字节流:以字节为单位进行数据操作
字符流:以字符为单位进行数据操作

注:
1、我们用字节流来操作的时候,创建的是字节型的数组来存储读出来的数据

byte bytRead[]=new byte[1024];

我们用字符流来操作的时候,创建的是字符型的数组来存储读出来的数据

char chRead[]=new char[1024];

2、一定要区分开哪一个是写入,哪一个是读出
写入:
FileOutputStream
FileWriter
读出:
FileInputStream
FileReader

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java学习之FileInputStream与FileReader的区别 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐