当前位置: 首页 > 面试题库 >

适用于读写文件的Java类?

穆嘉
2023-03-14
问题内容

阅读有关Java文件I / O管理的一些资料,我知道输入和输出操作有不止一种选择。

这些是:

  • BufferedReaderBufferedWriter
  • FileReaderFileWriter
  • FileInputStreamFileOutputStream
  • InputStreamReaderOutputStreamWriter
  • Scanner

以下什么是文本文件管理的最佳选择? 序列化的最佳替代方法是什么?Java NIO对此有何评论?


问题答案:

两种数据

一般来说,有两个“世界”:

  • 二进制数据
  • 文字数据

当它是一个文件(或插座,或在DB,还是......一个BLOB),那么它总是二进制数据 第一次

这些二进制数据中的某些可以 视为
文本数据(其中包含所谓的“编码”或“字符编码”)。

二进制数据

每当您要处理 二进制
数据时,都需要使用InputStream/
OutputStream类(通常,Stream名称中包含的所有内容)。

这就是为什么有a
FileInputStream和a
的原因FileOutputStream:它们
文件中 读取写入 文件,并且它们处理二进制数据。

文字数据

每当您要处理 文本
数据时,都需要使用Reader/
Writer类。

每当您需要将二进制数据转换为文本(反之亦然)时,则需要某种编码(常见的编码是UTF-8,UTF-16,ISO-8859-1(以及相关的编码)以及比较好的旧US-
ASCII)。幸运的是,Java平台还具有一种称为“默认平台编码”的东西,它将在需要它时使用,但代码未指定它。

平台的默认编码是两把剑,但是:

  • 它使编写代码更加容易,因为您不必为每个操作指定编码, 但是
  • 它可能与您拥有的数据不匹配:如果平台默认编码为ISO-8859-1,并且读取的文件实际上为UTF-8,那么您将获得加扰的输出!

为了阅读,我们还应该提到BufferedReader可以将其包装在其他包装纸上,Reader并增加了一次处理整行的功能。

Scanner是一个特殊的类,用于将文本输入解析为令牌。它对
结构化文本 最有用,但通常用于System.in提供一种非常简单的方法来从stdin读取数据(即从用户在键盘上输入的内容)。

缩小差距

现在,令人困惑的是,有一些类在这些世界之间架起了一座桥梁,它们的名称通常都有 两个部分

  • 一个InputStreamReader 消耗 一个InputStream并且本身就是 一个Reader
  • 一个OutputStreamWriter Writer写入OutputStream

然后有一些“快捷方式类”,它们基本上将另外两个经常组合的类组合在一起。

  • a FileReader基本上是a FileInputStream与a的组合InputStreamReader
  • a FileWriter基本上是a FileOutputStream与a的组合OutputStreamWriter

请注意,FileReaderFileWriter较复杂的“手工构建”替代方案相比,它还有一个主要缺点:它们 始终
使用平台默认编码,这可能不是您要尝试的!

序列化呢?

ObjectOutputStream并且ObjectInputStream是用于系列化专用流。

正如类的名称所暗示的那样,序列化仅涉及二进制数据(即使序列化String对象),因此您将只想使用*Stream类。只要避免使用任何Reader/
Writer类,就应该没问题。

更多资源

  • 基本I / O路径。
  • Joel关于Unicode的陈旧文章(很好的介绍,对技术细节略有了解)
  • 关于平台默认编码的弊端(也是this)


 类似资料:
  • 背景: 最近我一直在开发一个程序,该程序对输入数据文件(用户以完整路径或名称的形式给出,如果它位于程序创建的名为inputFiles的文件夹中)执行一些数据分析并吐出一堆输出数据文件(使用CSV)。 问题: 我遇到的问题是,当我运行时。jar在我的Windows机器上,它将创建3个文件夹(InputFiles、TempFiles和OutPutFiles),但当程序在Mac上时,GUI会启动,但不会

  • 问题内容: 我正在读取2个csv文件:&。 我希望能够将CSV文件与进行比较。1)如果项目名称匹配,只需更新store_inventory中的数量。2)如果new_acquisitions具有不存在的新项目,则将其添加到中。 这是我到目前为止所做的,但是效果不是很好。我在需要添加taks 1 和 2的 地方添加了注释。 任何建议或执行上述任务的代码都将非常有用!谢谢。 再次感谢任何帮助。=] 问题

  • 本文向大家介绍Java使用FileInputStream / FileOutputStream读/写文件,包括了Java使用FileInputStream / FileOutputStream读/写文件的使用技巧和注意事项,需要的朋友参考一下 示例 写入文件test.txt: 从文件test.txt中读取: 请注意,自Java 1.7起引入了try-with-resources语句,这使得读/写操

  • 问题内容: 通过运行此… 我一直收到这个错误,我真的不知道该如何解决。该文件当前与.java文件位于我的源包中。通过指定路径,我可以很容易地读取文件,但是我打算在多台计算机上运行该文件,因此我需要文件可以随程序一起移植。这个问题不是关于读取文本文件,而是指定其位置而不使用绝对路径。香港专业教育学院寻找答案,但我得到的答案只是“指定名称”和“指定绝对路径”。ID张贴图像,使其更清晰,但我没有10代表

  • 打开文件及文件读写 打开文件及文件读写 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* * 代码清单:文件读写例子 * * 这个例子演示了如何读写一个文件。 */

  • 读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。 读文件 要以读文件的模式打