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

依赖默认编码,我应该使用什么,为什么?

颛孙麻雀
2023-03-14
问题内容

FindBugs报告一个错误:

依赖默认编码找到了对将执行字节到字符串(或字符串到字节)转换的方法的调用,并假定默认平台编码是合适的。这将导致应用程序行为在平台之间有所不同。使用备用API并明确指定字符集名称或字符集对象。

我像这样使用FileReader(仅是一段代码):

public ArrayList<String> getValuesFromFile(File file){
    String line;
    StringTokenizer token;
    ArrayList<String> list = null;
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(file));
        list = new ArrayList<String>();
        while ((line = br.readLine())!=null){
            token = new StringTokenizer(line);
            token.nextToken();
            list.add(token.nextToken());
    ...

要更正错误,我需要更改

br = new BufferedReader(new FileReader(file));

br = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.defaultCharset()));

当我使用PrintWriter时,发生了相同的错误。所以现在我有一个问题。什么时候可以(应该)使用FileReader和PrintWriter,如果不是一个好的习惯,请依靠默认编码?第二个问题是正确使用Charset.defaultCharset()吗?我决定使用此方法自动定义用户操作系统的字符集。


问题答案:

如果文件在应用程序的控制下,并且希望以平台的默认编码对文件进行编码,则可以使用默认的平台编码。明确指定它对于您和以后的维护者来说,这是您的意图。例如,对于文本编辑器来说,这将是一个合理的默认设置,它将随后编写该平台上任何其他编辑器都能够读取的文件。

另一方面,如果要确保可以在文件中写入任何可能的字符,则应使用通用编码,例如UTF8。

并且,如果文件来自外部应用程序,或者应该与外部应用程序兼容,那么您应该使用该外部应用程序期望的编码。

您必须意识到的是,如果您像在计算机上一样编写文件,然后在另一台计算机上读取文件,而该文件没有相同的默认编码,那么您不一定能够阅读您所写的内容。像UTF8一样,使用特定的编码进行写入和读取,以确保无论写入文件时使用何种平台,文件都将始终相同。



 类似资料:
  • 问题内容: 为什么我应该(或不应该)将gradle依赖项包含为, 有什么好处/缺点? 如您所见,我在支持它的下面的库中添加了@aar。但是一切似乎都还没有做完… 问题答案: 在大多数情况下,您可以使用或上载多种格式的库。 如果不指定后缀,则将以其默认格式(由作者定义,如果不是,则以默认格式)以及所有依赖项下载该库。 指定后缀时,将强制以指定的格式(可能存在或可能不存在)下载库。这很有用,例如当作者

  • 问题内容: 之间有什么区别: 和 我知道JPanel是GUI组件的容器,但我确实看不到使用它的实用程序。当然,我错了,但我是从Swing开始的,所以…为什么我应该使用JPanel?真正的目的是什么? 问题答案: 为什么我应该使用JPanel? 您可以使用JPanel获得以下一项或多项好处: 将组件分组在一起。 为了更好地组织您的组件。 为了使我们能够使用 多种布局 并组合其效果。(例如,用于数字键

  • 问题内容: UTF-8是Java中的默认编码吗? 如果没有,我怎么知道默认使用哪种编码? 问题答案: JVM的默认字符集是运行它的系统的默认字符集。对此没有特定的值,并且通常不应将默认编码视为任何特定的值。 可以在运行时通过对其进行访问,尽管这对你有用,但实际上你应该始终在明确指定编码的情况下这样做。

  • 问题内容: 为什么以及何时应该在php中使用该函数?使用后是否应该始终使用它?我读到我必须使用它来防止会话固定,这是唯一原因吗? 问题答案: 什么啊 就像函数名称所说的那样,它是一个函数,它将用新的ID替换当前的会话ID,并保留当前的会话信息。 它有什么作用? 它主要有助于防止会话固定攻击。会话固定攻击是恶意用户试图利用系统中的漏洞固定(设置)另一个用户的会话ID(SID)的地方。这样,他们将拥有

  • 为什幺应该使用流 在node中,I/O都是异步的,所以在和硬盘以及网络的交互过程中会涉及到传递回调函数的过程。你之前可能会写出这样的代码: var http = require('http'); var fs = require('fs'); var server = http.createServer(function (req, res) { fs.readFile(__dirname

  • 我的老师让我这样做,但在评论区我被告知我不应该这样做。 为什么?