我试图在这段代码中使用常量而不是字符串文字:
new InputStreamReader(new FileInputStream(file), "UTF-8")
"UTF-8"
经常出现在代码中,并且改为引用一些 static final
变量会更好。你知道我在哪里可以在 JDK 中找到这样的变量吗?
顺便说一句,再想一想,这样的常量是不好的设计:Public Static Literals ... Are Not a Solution for Data Duplication
Files.newBufferedWriter(Path path, Charset cs)
。
在 Java 1.7+ 中,java.nio.charset.StandardCharsets 定义了 Charset
的常量,包括 UTF_8
。
import java.nio.charset.StandardCharsets;
...
StandardCharsets.UTF_8.name();
对于安卓:minSdk 19
现在我使用 commons-lang 中的 org.apache.commons.lang3.CharEncoding.UTF_8
常量。
org.apache.commons.lang3.CharEncoding.UTF_8
。 (注意“lang3”)。
Google Guava 库(如果您使用 Java 工作,我强烈推荐它)有一个 Charsets
类,其中包含 Charsets.UTF_8
、Charsets.UTF_16
等静态字段。
从 Java 7 开始,您应该只使用 java.nio.charset.StandardCharsets
来代替可比较的常量。
请注意,这些常量不是字符串,它们是实际的 Charset
实例。所有采用字符集名称的标准 API 还具有采用 Charset
对象的重载,您应该改用它。
java.nio.charset.StandardCharsets
,这不是第三方代码。此外,Guava Charsets 定义不是“不断修改”的,AFAIK 从未破坏向后兼容性,所以我认为你的批评是没有道理的。
Charsets
类有关。如果你想抱怨番石榴,那很好,但这不是抱怨的地方。
如果此页面出现在某人的网络搜索中,从 Java 1.7 开始,您现在可以使用 java.nio.charset.StandardCharsets 访问标准字符集的常量定义。
Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
该常量在类 org.apache.commons.codec.CharEncoding
中也可用(其中包括:UTF-16
、US-ASCII
等)。
没有(至少在标准 Java 库中)。字符集因平台而异,因此 Java 中没有它们的标准列表。
不过,有一些 3rd 方库包含这些常量。其中之一是 Guava(Google 核心库):http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html
StandardCharsets
中定义的所有字符集都保证存在于每个平台上的每个 Java 实现中。
您可以使用 Charset.defaultCharset()
API 或 file.encoding
属性。
但是如果你想要自己的常量,你需要自己定义它。
在 Java 1.7+ 中
不要使用“UTF-8”字符串,而是使用 Charset
类型参数:
import java.nio.charset.StandardCharsets
...
new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
如果您将 OkHttp 用于 Java/Android,则可以使用以下常量:
import com.squareup.okhttp.internal.Util;
Util.UTF_8; // Charset
Util.UTF_8.name(); // String
Charset.forName("UTF-8").name()
当您需要支持低于 API 19+ 的 Android 时,否则您可以使用:StandardCharsets.UTF_8.name()
标准的常量定义。这些字符集保证在 Java 平台的每个实现上都可用。从 1.7 开始
package java.nio.charset;
Charset utf8 = StandardCharsets.UTF_8;
在 Java 7 引入 java.nio.charset.StandardCharsets
后,类 org.apache.commons.lang3.CharEncoding.UTF_8
已弃用
@see JRE 字符编码名称
@从 2.1 开始
@deprecated Java 7 引入了 {@link java.nio.charset.StandardCharsets},它将这些常量定义为
{@link Charset} 对象。使用 {@link Charset#name()} 获取此类中提供的字符串值。
此类将在未来的版本中删除。
不定期副业成功案例分享
.toString()
可以工作,但正确的功能是.name()
。 99.9% toString 不是答案。.displayName()
也可以工作,除非它按预期被本地化覆盖。name()
。您可以直接将Charset
对象传递给InputStreamReader
构造函数。String
,可能是由于遗留原因。在这种情况下,我会保留一个Charset
对象,通常从StandardCharsets
派生,并在需要时使用name()
。