当前位置:网站首页 > R语言数据分析 > 正文

zipentry类 读取乱码(randomaccessfile读取文件乱码)



使用Java 的Runtime调用操作系统的命令,出现异常时使用getErrorStream()获取错误信息的字节流,转换该字节流为字符串显示时,出现乱码。

这里以Windows 操作系统为例, 调用cd 命令切换路径。

使用Java调用操作系统本身的命令使用Runtime 的exec() 方法,执行的命令以 开头,后面接上需要执行的语句, 代码如下:

如何获取执行的结果呢? 甚至如果执行失败, 获取执行的错误信息。

  • Process 的 waitFor() 方法用于等待进程完成,然后获取返回码
  • 错误信息也可以通过Process 的getErrorStream()方法获取错误的字节流,通过Java的字节流和字符串的转换可以错误信息的字符串, 完整的代码如下所示:

上面的代码为了演示错误的场景直接切换到一个不存在的目录,在某些环境下(操作系统、JVM)是正常的, 但是在笔者的机器上,在Eclipse中执行的时候,错误信息的显示确是乱码, 界面如下:

cmd运行java打印的是乱码_Java

cmd运行java打印的是乱码_JVM_02

可以看到这里的操作系统使用的是中文的字符。

查看Windows 操作系统的默认字符集,可以通过如下步骤:

  1. 打开控制面板
  2. 点击区域和语言选项(在某些Windows版本中可能叫做区域或者时钟,语言和区域)。
  3. 查看系统的区域设置
    如下图:

cmd运行java打印的是乱码_Java_03

这个命令看到的结果和上面使用控制面板看到的基本一样, 可以查看当前系统的区域语言设置。但并不是直接的字符集。系统字符集通常从区域语言设置和其他系统配置片断中获取,但这些信息并不直接等于字符集。也就是说在Windows命令行中(CMD),不能直接获取当前的字符编码,但可以查看当前的区域语言设置,它影响了系统非Unicode程序使用的字符集。

如果系统区域设置(system locale)是 zh_CN,那么表示系统使用的是简体中文(中国)。在这种设置下,Windows系统通常使用GBK作为默认的字符编码, 注意是“通常”,并不是一定。如何能坐实操作系统使用的字符集呢?

cmd运行java打印的是乱码_JVM_04

以上可以看到操作系统的语言区域和字符集分别是 zh_CN和GBK

Windows操作系统支持多种不同的字符集,每个应用程序可能使用不同的设置。如果你在Java中创建一个新的进程,那么该进程的默认字符集设置将会继承自Java应用的设置。可以通过Charset.defaultCharset()查询到Java使用的默认字符集。

  1. 通过System获取文件编码的系统属性
  2. 通过Charset获取
    具体的代码方式如下:

这里的输出是:

注意: 这两种方式返回的字符编码可能不一样,也可能一样,但是书写并不一致, 可能一个是UTF8,另一个是UTF-8, 但这都不是最主要的, 最主要的是这里的场景下, 为什么不是上面的 GBK? 直接说结论吧:

不管是在Eclipse还是在其他任何环境下运行Java程序,编码配置可能会受到多种因素的影响,包括JVM配置和操作系统设定等。

在Java中,系统默认的字符编码由JVM本身决定,通常与宿主操作系统的区域设置和字符编码设置相同。

  • 在 Eclipse 中,这可以在 “Run Configurations” -> “Arguments” -> “VM arguments” 中设置。例如添加 -Dfile.encoding=GBK。
  • 也可以通过设置 JVM 的启动参数来实现

在 Java 中,StandardCharsets 是一个预定义字符集的工具类,它定义了一些常用的字符集实例。但是,GBK 并没有被包含在 StandardCharsets 里。StandardCharsets 只定义了以下这些常用字符集:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、 UTF-16LE 和 UTF-16。

如果需要使用 GBK 编码,那么就不能从 StandardCharsets 查找到,而需要直接使用字符串 “GBK” 来代替。例如,如果需要将一个 InputStream 根据 GBK 编码转换为 Reader ,可以使用如下方式:

这段代码将会根据 GBK 编码创建一个新的 InputStreamReader。

需要注意的是,字符编码字符串 “GBK” 是大小写不敏感的,你也可以写为 “gbk”。然而,因为大写字符通常更容易阅读和理解,所以 “GBK” 通常是更常用的写法。

字节流转换成GBK 之后, 就正常的输出中文错误信息了, 乱码问题解决了。

在执行操作系统命令, 获取返回信息或是错误信息的场景中, 为了解决乱码的问题,终极的解法就是定义一个获取字符集的方法,因为无法直接获取操作系统的字符集, 就先获取区域语言,如果是 ,就使用 GBK编码, 否则就使用UTF-8的编码。相关的其他场景也可以据此思路扩展此方法, 方法的定义如下:



到此这篇zipentry类 读取乱码(randomaccessfile读取文件乱码)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 电脑剪辑(电脑剪辑视频的软件pr)2025-07-20 22:09:08
  • Xavier Serrano(xavier serrano生日)2025-07-20 22:09:08
  • cruise软件仿真动力性经济性(cruise动力性仿真实例)2025-07-20 22:09:08
  • vmware2015密钥(vmwareworkstation15密钥)2025-07-20 22:09:08
  • vconsole什么意思中文(vcorn什么意思)2025-07-20 22:09:08
  • webflux和webmvc区别(webflux和vertx)2025-07-20 22:09:08
  • broadcom linux驱动(linux 驱动probe)2025-07-20 22:09:08
  • aurocean是什么牌子(aurora什么牌子,价格)2025-07-20 22:09:08
  • cruisin下载(cruise2019破解版安装教程)2025-07-20 22:09:08
  • druid连接池配置建议值(druid连接池github)2025-07-20 22:09:08
  • 全屏图片