BufferedReader和getInputStream()返回中文字符

问题描述 投票:-1回答:1

我正在使用Java运行注册表查询,并读取结果以查看当前计算机上是否安装了Adobe。当我在命令提示符中手动执行注册表查询时,Adobe是结果之一,但我的Java方法找不到它。 我为Adobe运行注册表查询检查的方法:

public static void checkAdobe() throws IOException, InterruptedException {
    ProcessBuilder builder = new ProcessBuilder("reg", "query",
            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies");
    Process reg = builder.start();
    try (BufferedReader output 
            = new BufferedReader(new InputStreamReader(reg.getInputStream()))) {

        Stream<String> keys = output.lines().filter(l -> !l.isEmpty());
        Stream<String> matches = keys.filter(l -> l.contains("\\Adobe"));
        Optional<String> key = matches.findFirst();

        if (key.isPresent()) {
            System.out.println("Found "+key.get());
        } else {
            System.out.println("Can't find");
        }
    }
    reg.waitFor();
}

当我键入时,无论是使用本地命令还是管理命令提示符:

> reg query HKEY_LOCAL_MACHINE\SOFTWARE\Policies

我得到HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Adobe作为第一个结果之一。 为什么我的程序找不到它?

编辑: 我试过这个(来源 - https://stackoverflow.com/a/30915191/9120489):

public static void main(String[] args) throws IOException, InterruptedException {
    System.out.println(getProcessOutput());
}

public static String getProcessOutput() throws IOException, InterruptedException
{
    ProcessBuilder processBuilder = new ProcessBuilder("reg", "query",
            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies");

    processBuilder.redirectErrorStream(true);

    Process process = processBuilder.start();
    StringBuilder processOutput = new StringBuilder();

    try (BufferedReader processOutputReader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));)
    {
        String readLine;

        while ((readLine = processOutputReader.readLine()) != null)
        {
            processOutput.append(readLine + System.lineSeparator());
        }
        process.waitFor();
    }
    return processOutput.toString().trim();
}

但我的结果是ഊ䡋䕙彌佃䅌彍䅃䡉久屓但呗䅒䕜偯汩捩敳屁摯扥ഊ䡋䕙彌佃䅌彍䅃䡉久屓但呗䅒䕜偯汩捩敳屍楣牯獯晴而不是实际的命令输出。

java inputstream bufferedreader optional processbuilder
1个回答
0
投票

最后,我弄清楚了。我需要为BufferedReader InputStreamReader指定charset:

try (BufferedReader output 
            = new BufferedReader(new InputStreamReader(reg.getInputStream(), "UTF-8"))) {
© www.soinside.com 2019 - 2024. All rights reserved.