如何使用java.util.prefs.Preferences从Windows注册表中读取DWORD值数据。 我可以读取REG_SZ类型数据,但在读取REG_DWORD类型时,返回null。
Preferences userRoot = Preferences.userRoot();
Class clz = userRoot.getClass();
openKey = clz.getDeclaredMethod("openKey", byte[].class, int.class, int.class);
openKey.setAccessible(true);
final Method closeKey = clz.getDeclaredMethod("closeKey", int.class);
closeKey.setAccessible(true);
byte[] valb = null;
String key = null;
Integer handle = -1;
final Method winRegQueryValue = clz.getDeclaredMethod("WindowsRegQueryValueEx", int.class, byte[].class);
winRegQueryValue.setAccessible(true);
key = "Software\\SimonTatham\\PuTTY\\Sessions\\myMachine";
handle = (Integer) openKey.invoke(userRoot, toCstr(key), KEY_READ, KEY_READ);
//this line returns byte[] correctly
valb = (byte[]) winRegQueryValue.invoke(userRoot, handle.intValue(), toCstr("HostName"));
//but this line returns null instead of byte[] even though there is a value of type REG_DWORD
valb = (byte[]) winRegQueryValue.invoke(userRoot, handle.intValue(), toCstr("PortNumber"));
closeKey.invoke(Preferences.userRoot(), handle);
有什么想法吗?
答案 0 :(得分:2)
我有同样的问题。 您似乎无法使用Java-Preferences方法读取dwords。 (你只能阅读字符串,我认为这不会改变)
我找到了一个通过调用Runtime.exec()处理该问题的项目,并且regedit.exe女巫非常脏,但可能对其他有相同问题的人提供帮助。 此项目使用与Strings相同的方法。 http://sourceforge.net/projects/java-registry/
你也可以使用jRegistryKey.jar和dll(我想摆脱它) 或其他原生界面,如http://www.trustice.com/java/jnireg/(我还没试过)
答案 1 :(得分:0)
我发现使用以下代码读取REG_DWORD(Dword)和REG_SZ(String)注册表的最简单方法
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
public class ReadRegistry
{
public static final String readRegistry(String location, String key){
try {
// Run reg query, then read output with StreamReader (internal class)
Process process = Runtime.getRuntime().exec("reg query " +
'"'+ location + "\" /v " + key);
StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
// Parse out the value
// String[] parsed = reader.getResult().split("\\s+");
String s1[];
try{
s1=reader.getResult().split("REG_SZ|REG_DWORD");
}
catch(Exception e)
{
return " ";
}
//MK System.out.println(s1[1].trim());
return s1[1].trim();
} catch (Exception e) {
}
return null;
}
static class StreamReader extends Thread {
private InputStream is;
private StringWriter sw= new StringWriter();
public StreamReader(InputStream is) {
this.is = is;
}
public void run() {
try {
int c;
while ((c = is.read()) != -1)
//System.out.println(c);
sw.write(c);
} catch (IOException e) {
}
}
public String getResult() {
return sw.toString();
}
}
}
您可以使用trim仅使用值并删除其他空格字符
如何使用此课程
代码在
之下 String outputValue = ReadRegistry.readRegistry(REGISTRY_PATH, REGISTRY_KEY);
注意:REGISTRY_PATH和REGISTRY_KEY是常量。其值取决于您的查询路径和查询键。