【IO流系列】编码和解码

1. 编码

1.1 概述

编码(Encoding)

  • 编码是将数据(如文本、图像、音频等)转换为特定格式的过程,以便计算机能够理解、处理或传输数据。

  • 文本编码常用于将字符转换为数字形式,如ASCII、Unicode、UTF-8等字符编码方式。

  • 图像、音频和视频等数据也可以经过不同的编码方式进行表示和存储,如JPEG、MP3、H.264等。

  • 编码的选择取决于数据类型、存储需求、传输方式和目标平台等因素。

1.2 方法

Java中编码的方法:

String类中的方法说明
public byte[] getBytes()使用默认方式进行编码
public byte[] getBytes(String charsetName)使用指定方式进行编码
  1. public byte[] getBytes():此方法将字符串按照默认的字符编码方式转换为字节数组。默认情况下,会使用系统的默认字符编码方式(通常是UTF-8)。
  • 示例代码如下:
    String str = "Hello, 你好!";
    byte[] bytes = str.getBytes(); // 使用默认方式进行编码
    System.out.println("默认方式编码:" + Arrays.toString(bytes));
    
  1. public byte[] getBytes(String charsetName):此方法允许指定字符编码方式来将字符串转换为字节数组。可以根据需求选择常见的字符编码方式,如UTF-8、UTF-16、ISO-8859-1等等。
  • 示例代码如下:
    String str = "Hello, 你好!";
    try {
        byte[] bytesUtf8 = str.getBytes("UTF-8"); // 使用UTF-8方式进行编码
        System.out.println("UTF-8方式编码:" + Arrays.toString(bytesUtf8));
    
        byte[] bytesGbk = str.getBytes("GBK"); // 使用GBK方式进行编码
        System.out.println("GBK方式编码:" + Arrays.toString(bytesGbk));
    } catch (UnsupportedEncodingException e) {
        System.err.println("不支持的字符编码方式:" + e.getMessage());
    }
    

2. 解码

2.1 概述

解码(Decoding)

  • 解码是将经过编码的数据转换回其原始格式的过程,以便进行显示、处理或存储。

  • 对于文本数据,解码是将数字编码转换为可读的字符形式,以便用户理解和操作。

  • 图像、音频等数据也需要在解码后才能显示或播放出原始内容。

  • 解码的过程通常是编码的逆过程,确保数据在转换过程中不丢失信息和精度。

2.2 方法

Java中解码的方法:

String类中的方法说明
String(byte[] bytes)使用默认方式进行解码
String(byte[] bytes, String charsetName)使用指定方式进行解码
  1. String(byte[] bytes):此构造方法将字节数组按照默认的字符编码方式转换为字符串。默认情况下,会使用系统的默认字符编码方式(通常是UTF-8)。
  • 示例代码如下:
    byte[] bytes = {72, 101, 108, 108, 111, 44, 32, -28, -67, -96, -27, -91, -96, 33};
    String strDefault = new String(bytes); // 使用默认方式进行解码
    System.out.println("默认方式解码:" + strDefault);
    
  1. String(byte[] bytes, String charsetName):此构造方法允许指定字符编码方式来将字节数组转换为字符串。可以根据需求选择常见的字符编码方式,如UTF-8、UTF-16、ISO-8859-1等等。
  • 示例代码如下:
    byte[] bytes = {72, 101, 108, 108, 111, 44, 32, -28, -67, -96, -27, -91, -96, 33};
    try {
        String strUtf8 = new String(bytes, "UTF-8"); // 使用UTF-8方式进行解码
        System.out.println("UTF-8方式解码:" + strUtf8);
    
        String strGbk = new String(bytes, "GBK"); // 使用GBK方式进行解码
        System.out.println("GBK方式解码:" + strGbk);
    } catch (UnsupportedEncodingException e) {
        System.err.println("不支持的字符编码方式:" + e.getMessage());
    }
    

3. 代码示例

  • 代码示例
    package text.IOStream.DecodeAneEncoding;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    
    /*编码和解码方法
    
    Java中编码的方法:
    | String类中的方法                           | 说明                 |
    | ------------------------------------------ | -------------------- |
    | public byte[]  getBytes()                  | 使用默认方式进行编码 |
    | public byte[] getBytes(String charsetName) | 使用指定方式进行编码 |
    
    Java中解码的方法:
    | String类中的方法                        | 说明                 |
    | --------------------------------------- | -------------------- |
    | String(byte[]bytes)                     | 使用默认方式进行解码 |
    | String(byte[] bytes,String charsetName) | 使用指定方式进行解码 |
    
    
     */
    public class DecodeAndEncoding {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String str = "ai爱你呦";
            //编码
            byte[] bytes1 = str.getBytes(); //使用idea默认的编码方式:UTF_8
            System.out.println("使用默认方式进行编码(UTF_8):" + Arrays.toString(bytes1));  //[97, 105, -25, -120, -79, -28, -67, -96, -27, -111, -90]
    
            byte[] bytes2 = str.getBytes("GBK"); //使用指定的编码方式:GBK
            System.out.println("使用指定的编码方式(GBK):" + Arrays.toString(bytes2));  //[97, 105, -80, -82, -60, -29, -33, -49]
    
    
            //解码
            String str1 = new String(bytes1); //使用idea默认方式进行解码:UTF_8
            System.out.println("使用idea默认方式进行解码(UTF_8):" + str1);//ai爱你呦
    
            String str2 = new String(bytes1, "GBK"); //使用指定方式进行解码:GBK
            System.out.println("使用指定方式进行解码(GBK):" + str2); //ai鐖变綘鍛�(出现乱码的原因:编码时采用的是UTF-8,解码时采用的是GBK,编码和解码不一致)
    
    
        }
    }
    
    
  • 输出结果
    在这里插入图片描述

4. 注意事项

  1. 字符集一致性:在编码和解码过程中,要确保使用相同的字符集,否则会导致乱码或数据不完整的情况。编码时选择的字符集和解码时选择的字符集要保持一致。

  2. 异常处理:在处理编码和解码过程中,应该注意捕获可能的异常,如不支持的字符集、不完整的数据等情况,避免程序崩溃或数据丢失。

  3. 字节顺序:在涉及到多字节字符集(如UTF-16)时,要考虑到字节顺序是否需要考虑,以避免字节顺序不正确导致数据解析错误的问题。

  4. 数据完整性:在进行编码时,要确保所有字符都能正确地被编码为字节序列,而在解码时,要确保能够完整地将字节序列转换回原始字符。

  5. 适当选择字符集:根据实际需求和环境,选择合适的字符集进行编码和解码操作。常见的字符集如UTF-8、ISO-8859-1、GBK等都有各自的特点和适用场景。

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!Java 9及以上版本已经移除了`com.sun.image.codec.jpeg`包,因此在新版本中需要使用其他方式实现JPEG编码解码。以下是一些可能的实现方式: 1. 使用Java Image I/O API Java Image I/O API是Java标准库提供的一套图像I/O工具,它可以读取和写入多种图像格式,包括JPEG。使用Java Image I/O API可以实现JPEG的编码解码。 以下是一个示例代码: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import javax.imageio.stream.ImageOutputStream; public class JPEGEncoderExample { public static void main(String[] args) throws IOException { // 读入原始图像 BufferedImage image = ImageIO.read(new File("input.jpg")); // 创建输出流 ImageOutputStream outputStream = ImageIO.createImageOutputStream(new File("output.jpg")); // 创建JPEG编码器 ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); // 设置编码参数 JPEGImageWriteParam param = new JPEGImageWriteParam(null); param.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(0.75f); // 编码并保存图像 writer.setOutput(outputStream); writer.write(null, new IIOImage(image, null, null), param); // 释放资源 outputStream.close(); writer.dispose(); } } ``` 在这个示例中,我们使用Java Image I/O API读入了一个名为“input.jpg”的JPEG格式图像文件,然后创建了一个JPEG编码器,并设置了编码参数。接着,我们将原始图像编码为JPEG格式,并保存到了一个名为“output.jpg”的文件中。 同样地,Java Image I/O API也可以用于JPEG图像的解码。 2. 使用第三方库 除了Java Image I/O API,还有一些第三方库可以用于JPEG编码解码。比如,ImageJ、Twelvemonkeys、Thumbnailator等库都提供了JPEG的编码解码功能。 以下是使用Twelvemonkeys实现JPEG编码的示例代码: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageWriter; public class JPEGEncoderExample { public static void main(String[] args) throws IOException { // 读入原始图像 BufferedImage image = ImageIO.read(new File("input.jpg")); // 创建JPEG编码器 JPEGImageWriter writer = new JPEGImageWriter(); // 设置编码参数 writer.setCompressionQuality(0.75f); // 编码并保存图像 writer.write(image, new File("output.jpg")); } } ``` 在这个示例中,我们使用Twelvemonkeys库创建了一个JPEG编码器,并设置了编码参数。接着,我们将原始图像编码为JPEG格式,并保存到了一个名为“output.jpg”的文件中。 希望这些信息对您有帮助,如果您还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷小洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值