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

如何读取Java中具有特定字符编码的文件?

商德泽
2023-03-14
问题内容

我试图根据此方法的输出以UTF-8或Windows-1252格式读取文件:

public Charset getCorrectCharsetToApply() {
    // Returns a Charset for either UTF-8 or Windows-1252.
}

到目前为止,我有:

String fileName = getFileNameToReadFromUserInput();
InputStream is = new ByteArrayInputStream(fileName.getBytes());
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);

我遇到的问题是将BufferedReader实例转换为FileReader

此外:

  • 文件本身的名称(fileName)不能被认为是特定的Charset; 有时文件名将包含UTF-8字符,有时还包含Windows-1252。文件的内容也是如此(但是,如果文件名和文件内容 始终 具有匹配的字符集)。
  • 只有内部的逻辑getCorrectCharsetToApply()可以选择要应用的字符集,因此 调用此方法 之前 尝试按文件名读取文件的结果非常好,Java尝试使用错误的编码读取文件名…导致文件死亡!

提前致谢!


问题答案:

因此,首先要注意的是,一定要意识到,fileName.getBytes()有了文件名,就得到文件名的字节,而不是文件本身。

其次,阅读FileReader的文档:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。

因此,听起来好像FileReader实际上不是要走的路。如果我们采纳文档中的建议,那么您应该将代码更改为:

String fileName = getFileNameToReadFromUserInput();
FileInputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);

而不是尝试制作FileReader。



 类似资料:
  • 问题内容: 我想将字典中特定字符串之后的所有行读到字典中。我想对数千个文本文件执行此操作。 我可以使用以下代码(从此答案中得到)识别并打印出特定的字符串(): 但是如何告诉Python开始读取仅在字符串之后的行? 问题答案: 当您到达要开始的行时,只需开始另一个循环即可: 文件对象是其自己的迭代器,因此当到达其中的行时,我们将从该行继续进行迭代,直到消耗完迭代器为止。 一个简单的例子: 产生: 您

  • 问题内容: 我打开 记事本 (Windows)并编写 并转到“ 另存为… ”“ someFile.txt”,并将“ 编码” 设置为 UTF-8 。 在Java中,我有 但是我得到问号和类似的“特殊”字符。为什么? 编辑: 我有此输入(.txt文件中的一行) 和这段代码 和 吐司 输出(用于那些谁不熟悉与Android,吐司只是一个显示弹出式屏幕,在它特定的文本法)的罚款。控制台显示“奇怪的字符”(

  • 问题内容: 我在Linux(UTF-8)计算机上有一个要读取的.RData文件,但我知道该文件位于Latin1中,因为我是在Windows上自己创建的。不幸的是,我无权访问原始文件或Windows计算机,并且需要在Linux计算机上读取这些文件。 要读取Rdata文件,通常的过程是运行。诸如此类的函数具有可用于解决此类问题的参数,但没有这种功能。如果尝试,我只会收到此(预期)错误: 加载错误(“

  • 问题内容: 在Java中,是否有任何方法可以从文件中读取特定行?例如,读取第32行或任何其他行号。 问题答案: 除非你以前对文件中的行有一定的了解,否则没有阅读前31行就无法直接访问第32行。 所有语言和所有现代文件系统都是如此。 如此有效地,你只需阅读第32行,直到找到第32行为止。

  • 我有一个由10个名为Arr的唯一对象id组成的数组,我在一个名为xyz的集合中有10000个文档。 如何在只有一个请求的集合xyz中的数组Arr中使用对象ID查找文档? 有$all和$in运算符,但用于使用数组查询字段。 或者我是否需要发出等于Arr长度的请求并使用findOne获取单个文档? 编辑:我期待这样的事情: db.getCollection("xyz"). search({"_id":

  • 问题内容: 我得到了一个像这样的字符串 我该如何编写Java代码来解码编码字符,例如 在字符串中。是否有任何现有的类/方法可以对其进行解码? 谢谢。 问题答案: 要取消转义HTML / XML实体,请使用Apache Commons Lang 或homegrow one 。