使用Java 的Runtime调用操作系统的命令,出现异常时使用getErrorStream()获取错误信息的字节流,转换该字节流为字符串显示时,出现乱码。
这里以Windows 操作系统为例, 调用cd 命令切换路径。
使用Java调用操作系统本身的命令使用Runtime 的exec() 方法,执行的命令以 开头,后面接上需要执行的语句, 代码如下:
如何获取执行的结果呢? 甚至如果执行失败, 获取执行的错误信息。
- Process 的 waitFor() 方法用于等待进程完成,然后获取返回码
- 错误信息也可以通过Process 的getErrorStream()方法获取错误的字节流,通过Java的字节流和字符串的转换可以错误信息的字符串, 完整的代码如下所示:
上面的代码为了演示错误的场景直接切换到一个不存在的目录,在某些环境下(操作系统、JVM)是正常的, 但是在笔者的机器上,在Eclipse中执行的时候,错误信息的显示确是乱码, 界面如下:
可以看到这里的操作系统使用的是中文的字符。
查看Windows 操作系统的默认字符集,可以通过如下步骤:
- 打开控制面板
- 点击区域和语言选项(在某些Windows版本中可能叫做区域或者时钟,语言和区域)。
- 查看系统的区域设置
如下图:
这个命令看到的结果和上面使用控制面板看到的基本一样, 可以查看当前系统的区域语言设置。但并不是直接的字符集。系统字符集通常从区域语言设置和其他系统配置片断中获取,但这些信息并不直接等于字符集。也就是说在Windows命令行中(CMD),不能直接获取当前的字符编码,但可以查看当前的区域语言设置,它影响了系统非Unicode程序使用的字符集。
如果系统区域设置(system locale)是 zh_CN,那么表示系统使用的是简体中文(中国)。在这种设置下,Windows系统通常使用GBK作为默认的字符编码, 注意是“通常”,并不是一定。如何能坐实操作系统使用的字符集呢?
以上可以看到操作系统的语言区域和字符集分别是 zh_CN和GBK
Windows操作系统支持多种不同的字符集,每个应用程序可能使用不同的设置。如果你在Java中创建一个新的进程,那么该进程的默认字符集设置将会继承自Java应用的设置。可以通过Charset.defaultCharset()查询到Java使用的默认字符集。
- 通过System获取文件编码的系统属性
- 通过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读取文件乱码)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/72074.html