BufferedReader 和 getInputStream() 返回汉字
BufferedReader and getInputStream() returning Chinese characters
我正在 运行使用 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
作为第一批结果之一。
为什么我的程序找不到它?
编辑:
我试过这个(来源 - ):
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();
}
但我的结果是ഊ䡋䕙彌佃䅌彍䅃䡉久屓但呗䅒䕜偯汩捩敳屁摯扥ഊ䡋䕙彌佃䅌彍䅃䡉久屓但呗䅒䕜偯汩捩敳屍楣牯獯晴
而不是实际的命令输出。
我终于明白了。我需要为 BufferedReader InputStreamReader 指定字符集:
try (BufferedReader output
= new BufferedReader(new InputStreamReader(reg.getInputStream(), "UTF-8"))) {
我正在 运行使用 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
作为第一批结果之一。
为什么我的程序找不到它?
编辑:
我试过这个(来源 - ):
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();
}
但我的结果是ഊ䡋䕙彌佃䅌彍䅃䡉久屓但呗䅒䕜偯汩捩敳屁摯扥ഊ䡋䕙彌佃䅌彍䅃䡉久屓但呗䅒䕜偯汩捩敳屍楣牯獯晴
而不是实际的命令输出。
我终于明白了。我需要为 BufferedReader InputStreamReader 指定字符集:
try (BufferedReader output
= new BufferedReader(new InputStreamReader(reg.getInputStream(), "UTF-8"))) {