为了实现字符的编码和解码,java中提供了许多类‘java.nio.charset’包。这个‘字符集编码器’该包的类执行重要的编码任务。在本文中,让我们了解这个类、它的语法、不同的方法以及错误处理和优化技术的一些示例。
什么是 CharsetEncoder?
‘字符集编码器’类是从导入的‘java.nio.charset’包。
该类的基本函数是使用某种字符集或称为编码的编码字符集。它将字符序列转换为字节格式。此类通常用于将文本数据写入文件、通过网络传输数据以及在不同字符编码之间对数据进行编码/解码等活动。
CharsetEncoder将字符输入转换为字节输出。 Java的内部字符表示通常是UTF-16,被编码并转换为所选字符编码的字节表示(例如UTF-8, 等等)。
CharsetEncoder 的语法
public abstract class CharsetEncoder extends Object
CharsetEncoder 的构造函数
与 CharsetEncoder 关联的构造函数及其说明。
构造函数 |
修饰符 |
说明 |
---|---|---|
CharsetEncoder(字符集 cs,浮点averageBytesPerChar,浮点maxBytesPerChar) |
protected |
给定字符集的新编码器使用 CharsetEncoder 构造函数指定的每个字符的最大和平均字节进行初始化。 |
CharsetEncoder(字符集 cs,浮点averageBytesPerChar,浮点maxBytesPerChar,字节[]替换) |
protected |
给定字符集的新编码器由 CharsetEncoder 构造函数初始化,其中包含每个字符的估计平均字节数和最大字节数以及无法映射的字符的唯一替代字节序列。 |
CharsetEncoder的方法
与 CharsetEncoder 相关的方法表及其说明。
修饰符和类型 |
方法 |
说明 |
---|---|---|
浮点数 |
averageBytesPerChar() |
返回为每个输入字符生成的平均字节数。 |
布尔值 |
canEncode(char c) |
指示该编码器是否可以对指定字符进行编码。 |
布尔值 |
canEncode(CharSequence cs) |
指示该编码器是否可以对提供的字符序列进行编码。 |
字符集 |
charset() |
返回创建此编码器的字符集。 |
ByteBuffer |
encode(CharBuffer in) |
将单个输入字符缓冲区中的剩余数据编码到 newly-allocated 字节缓冲区中 |
CoderResult |
encode(CharBuffer in, ByteBuffer out, boolean endOfInput) |
从提供的输入缓冲区编码尽可能多的字符后,将结果写入指定的输出缓冲区。 |
受保护的摘要CoderResult |
encodeLoop(CharBuffer in, ByteBuffer out) |
将一个或多个字符编码为一个或多个字节。 |
CoderResult |
flush(ByteBuffer out) |
冲洗编码器。 |
受保护CoderResult |
implFlush(ByteBuffer out) |
冲洗编码器。 |
受保护的无效 |
implReset() |
通过重置此编码器来清除特定于给定字符集的任何内部状态。 |
布尔值 |
isLegalReplacement(byte[] repl) |
指示提供的字节数组是否是该编码器的有效替换值。 |
浮点数 |
maxBytesPerChar() |
返回可为每个输入字符生成的最大字节数。 |
CharsetEncoder |
reset() |
重置编码器,清除任何内部状态。 |
字节[] |
replacement() |
返回该编码器的替换值。 |
CharsetEncoder |
替换(字节[]新替换) |
修改该编码器的替换值。 |
继承方法
Charset 类中包含的方法继承自java.lang.Object 。
CharEncoder 类示例
示例1:CharsetEncoder的基本使用
在此示例中,使用以下方法将输入字符串编码为字节:CharsetEncoder和UTF-8字符编码。
它涵盖了如何构造 CharsetEncoder、对字符进行编码、将输入文本放置在CharBuffer,然后输出已经编码的数据。它具有基本的错误处理函数,可以解决编码过程中可能出现的任何问题。
Java
// Java Program to construct a
// CharsetEncoder using CharBuffer
import java.nio.*;
import java.nio.charset.*;
//Driver class
public class Main {
// Main method
public static void main(String[] args){
// Create a Charset
Charset ch = Charset.forName("UTF-8");
// Initialize a CharsetEncoder
CharsetEncoder ec = ch.newEncoder();
// Input string
String str = "CharsetEncoder Example";
// Wrap the input text in a CharBuffer
CharBuffer charBuffer = CharBuffer.wrap(str);
try {
// Encode the characters
ByteBuffer bf = ec.encode(charBuffer);
// Print the encoded data
String ans = new String(bf.array());
System.out.println(ans);
}
catch (Exception e) {
// Handle the exception
e.printStackTrace();
}
}
}
输出:
CharsetEncoder Example
示例 2:错误处理
UTF-8字符编码只能对 Unicode 标准内的字符进行编码。有些特殊字符或符号无法通过此编码技术识别。为了防止出现问题,需要使用一些方法来处理错误。在下面给出的示例中,我们给出了一个包含特殊符号的输入字符串‘Ω’,这是不可映射的UTF-8。我们使用‘onUnmappableCharacter' 和 'CodingErrorAction.REPLACE' 用任何不同的字符替换这些不可映射的字符的方法。
在下面的代码中,每当我们遇到‘Ω’,它被替换为‘?‘ 表示特殊符号被替换为后备字符以进行错误处理。
Java
// Java Program for Error handling
// Using onUnmappableCharacter
import java.nio.*;
import java.nio.charset.*;
//Driver Class
public class Main {
//Main method
public static void main(String[] args){
// Create a Charset
Charset ch = Charset.forName("UTF-8");
// Initialize a CharsetEncoder
CharsetEncoder ec = ch.newEncoder();
// Input string (with Ω as an unmappable character)
String str = "Charset Ω Encoder";
// Handle the error by replacing the unmappable
// character with a question mark
ec.onUnmappableCharacter(CodingErrorAction.REPLACE);
ec.replaceWith("?".getBytes());
// Wrap the string into a CharBuffer
CharBuffer cb = CharBuffer.wrap(str);
try {
// Encode the characters
ByteBuffer bf = ec.encode(cb);
// Convert the ByteBuffer to a String
String ans = new String(bf.array());
System.out.println("Encoded String: " + ans);
}
catch (Exception e) {
// Handle the exception
System.err.println("Error: " + e.getMessage());
}
}
}
输出:
Encoded String: Charset ? Encoder
如何优化编码?
现在我们已经在以下的帮助下了解了编码操作CharsetEncoder类中,了解如何在处理大量数据时提高效率和性能非常重要。
- 缓冲区管理:使用CharBuffer和ByteBuffer,我们可以管理数据的大小,因为它可以避免频繁的重新分配。留出足以容纳预期数据的缓冲区。我们在上面给出的例子中讨论了这种方法
- 重用缓冲区:I而不是创建新的实例CharBuffer和ByteBuffer每次,请考虑在每个编码和解码操作中重复使用它们。这将显著减少内存分配。
- 批量编码:始终使用encode()方法与CharSequence或一个CharBuffer包含所有要编码或解码的字符。使用此函数,编码调用的数量将最小化,从而提高程序的效率。
- 预计算缓冲区大小:为了防止不必要的大小调整,请分配ByteBuffer如果您知道编码数据的大致数量(以字节为单位),则具有正确的大小或更多的容量。
在本文中,我们涵盖了与此相关的所有方法和最佳实践CharsetEncoder类。从语法、构造函数到错误处理和优化技术,我们探索了如何利用此类来执行 Java 应用程序中的字符编码任务。
相关用法
- Java java.nio.charset.Charset用法及代码示例
- Java java.nio.charset.CoderResult用法及代码示例
- Java java.nio.charset.CodingErrorAction用法及代码示例
- Java java.nio.channels.spi.SelectorProvider用法及代码示例
- Java java.nio.channels.spi.AsynchronousChannelProvider用法及代码示例
- Java java.nio.channels.Selector用法及代码示例
- Java java.nio.ByteBuffer用法及代码示例
- Java java.nio.IntBuffer用法及代码示例
- Java java.nio.file.FileStore用法及代码示例
- Java java.nio.FloatBuffer用法及代码示例
- Java java.nio.file.LinkPermission用法及代码示例
- Java java.nio.ShortBuffer用法及代码示例
- Java java.nio.DoubleBuffer用法及代码示例
- Java java.nio.file.attribute.AclEntry用法及代码示例
- Java java.nio.LongBuffer用法及代码示例
- Java java.nio.file.spi.FileTypeDetector用法及代码示例
- Java java.nio.ByteOrder用法及代码示例
- Java java.nio.file.attribute.FileTime用法及代码示例
- Java java.nio.file.SimpleFileVisitor用法及代码示例
- Java java.nio.file.FileSystems用法及代码示例
- Java java.nio.CharBuffer用法及代码示例
- Java java.nio.Buffer用法及代码示例
- Java java.nio.file.FileSystem用法及代码示例
- Java java.nio.file.Paths用法及代码示例
- Java java.net.SocketException用法及代码示例
注:本文由纯净天空筛选整理自abhinav_m22大神的英文原创作品 java.nio.charset.CharsetEncoder Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。