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

如何在不使用Java进行任何缓冲的情况下读取文件?

印晋
2023-03-14
问题内容

我正在解决Programming Pearls,第二版,第1列中的问题。其中一个问题涉及编写一个程序,该程序仅使用大约1
MB的内存将文件内容存储为位数组,每个位代表是否或文件中没有7位数字。由于Java是我最熟悉的语言,因此即使作者似乎已经想到了C和C
++,我还是决定使用它。

由于我是为了解决我正在处理的问题而假装有限的内存,因此我想确保读取文件的过程完全没有缓冲。

InputStreamReader在我阅读Java文档中的内容之前,我认为这将是一个很好的解决方案:

为了实现字节到字符的有效转换,与满足当前读取操作所需的字节数相比,可以从基础流中提前读取更多字节。

理想情况下,只会从流中读取必要的字节-换句话说,我不需要任何缓冲。


问题答案:

问题之一涉及编写仅使用大约1兆字节内存的程序来将文件内容存储为位数组,每个位代表文件中是否存在7位数字。

这意味着您需要以字节(不是字符)的形式读取文件。

假设您确实有真正的要求,无需缓冲就可以读取文件,那么您应该使用FileInputStream该类。它没有缓冲。它精确地读取(或尝试读取)您要求的字节数。

如果随后需要将这些字节转换为字符,则可以通过将适当的String构造函数应用于byte或来实现byte[]。请注意,对于诸如的多字节字符编码UTF-8,您
需要 读取足够的字节才能完成每个字符。做到没有预读的可能性有点棘手……并且需要您正在阅读的字符编码的“知识*”。

(您可以通过CharsetDecoder直接使用来避免该知识。但是随后您需要使用decodeBuffer对象进行操作的html" target="_blank">方法,这也有些复杂。)

就其价值而言,Java 明确 区分了字节流和字符流I /
O。前者由InputStream和支持OutputStream,后者由Reader和支持Write。该InputStreamReader班是一个Reader,即
适应InputStream。您不应该考虑将其用于想要按字节读取内容的应用程序。



 类似资料:
  • 问题内容: 我必须用Java读取CSV文件,我用Google对其进行了搜索,但是我有办法使用标题进行读取;但我没有文件中可用的列标题和列数的信息。在这种情况下,我该如何读取CSV文件。 谢谢 问题答案: 您可以假设每一行都是String类,并将所有内容读取到二维数组中。之后,您可以尝试将字符串解析为适当的格式。 但是,如果您不知道行数据类型,这只是一个猜测。

  • 问题内容: 是否有一种隐藏的方法可以在 不 读取整行的 情况下 从文件或类似文件的对象读取令牌?我立即拥有的应用程序(其他人的问题,不是我的问题)正在将具有几个非常长的行的大型矩阵转置,本质上是对选择单个列元素的迭代器执行操作。这个想法不是在迭代过程中将整个文件存储在内存中。 这些行是用空格分隔的ASCII十进制数字。 对于Java的Scanner类,问题可能很简单,但我没有在Python标准库中

  • 问题内容: 我已经在Swift 2中使用了这种方法 但是不知道如何在不使用 NSDictionary(contentsOfFile:path)的* 情况下在Swift3中读取plist * 问题答案: Swift的本机方法是使用 ~~~~ 您还可以使用类型强制转换: 但您明确地写道: 不使用NSDictionary(contentsOf … 基本上,不要在Swift中不进行强制转换而使用,您将丢弃

  • 在我的情况下,登录应用程序时需要通过UID从realTime Database获取用户配置文件 在文档中必须使用添加值事件通知程序才能从实时数据库读取 //如果我有obj的id,如何直接从实时firebase获取值 //我的问题是,这里不能使用这种方法

  • 假设我有两个数据帧,df1和df2。df1和df2都包含“id”列。我想过滤df1,这样得到的df,df1prime,有 只有在df1中找到的ID 在df2中没有找到所有ID 而不使用任何连接。我该怎么做?返回RDDs而不是DFs会有帮助吗?pyspark和scala响应都受到欢迎。 谢谢! 编辑:我想保留df1中的所有行

  • 我想参加一场比赛。Java一直是我编写游戏的工具,所以很自然我会想在这个游戏中使用它。问题是,它不能需要其他软件。我相信这包括Java。那么,有没有办法在某种exe文件中包含java?或者以其他方式包括它?资产不必包含在内,但总体大小必须小于1GB,因此我需要足够的空间来存放实际的游戏和资产。