无论出于何种原因,我有时需要在Java程序中在Windows上找到当前用户的My Documents文件夹来读取一些文件.但据我所知,没有办法做到没有严重缺陷.
第一个错误的方法:System.getProperty("user.home");
为什么它不起作用:
第二种错误的方法:使用注册表读取程序获取用户的个人文件夹,这是我的文档(但是i18n'd).
为什么它不起作用:
虽然它修复了仅限英语的问题,但它仍然使用相同的已弃用的注册表区域,因此错误仍然适用于它.
不推荐使用的注册表项表示使用本机调用(SHGetKnownFolderPath),这显然是我无法用Java完成的.
第三种错误方式:
JFileChooser fr = new JFileChooser();
FileSystemView fw = fr.getFileSystemView();
File documents = fw.getDefaultDirectory();
Run Code Online (Sandbox Code Playgroud)
为什么它不起作用:它很棒!
除非它没有.虽然我有一个程序在后台使用这个开放和运行,我打开了一个DirectX游戏(辐射:新维加斯).Java程序立即终止,没有堆栈跟踪.总是可以重现的(对我来说,那个游戏,谁知道还有什么).找不到太阳虫#.
那么有什么方法可以在Windows上从Java中找到没有已知问题的用户的Documents文件夹?
(这是一个很好的大问题.)
*(关键是"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
我正在尝试解密使用RijndaelManaged of .NET/C#加密的东西,使用Java进行解密.
C#程序不是我的; 我无法将其更改为更具互操作性.但我知道它是如何加密的:
byte[] bytes = new UnicodeEncoding().GetBytes(password); // edit: built-in is 8chars
FileStream fileStream = new FileStream(outputFile, FileMode.Create);
RijndaelManaged rijndaelManaged = new RijndaelManaged();
CryptoStream cryptoStream = new CryptoStream((Stream) fileStream,
rijndaelManaged.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);
Run Code Online (Sandbox Code Playgroud)
我不知道如何在Java端解密这个.我发现最接近有用的是这篇博客文章,但它对实际细节很清楚,我无法实现解密器.
编辑:我是个白痴,现在有了它的工作.
UnicodeEncoding是UTF-16LE,而我使用的是UTF-8.在插入密码时切换到正确的编码已修复程序.
我还需要得到BouncyCastle并且做到 Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
finaledit:这是用Java 解密来自.NET 的默认 RijndaelManaged流的代码,假设它是使用原始密码作为密钥创建的:
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
String password = "kallisti"; // only 8, 12, or 16 chars will work as a key
byte[] key = password.getBytes(Charset.forName("UTF-16LE"));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), …Run Code Online (Sandbox Code Playgroud)