Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试解密文件时,CipherInputStream为空_Java_Inputstream_Bufferedreader - Fatal编程技术网

Java 尝试解密文件时,CipherInputStream为空

Java 尝试解密文件时,CipherInputStream为空,java,inputstream,bufferedreader,Java,Inputstream,Bufferedreader,我正在尝试编写一些助手方法来处理读取和写入加密文件的问题。我有两种方法可以成功地实现这一点,并返回一个InputStream或一个OutputStream(实际上是密码版本),我可以使用它们读取或写入文件。我已经证实,当使用对象流包装并用于将加密对象读写到文件时,这些方法非常有效 然而,当我试图从加密的文本文件中读取时,问题就出现了。我可以验证输入它的字符串是否被加密并写入正确的文件,但当我尝试从该文件读回时,BufferedReader报告EOF(null)。InputStream.avail

我正在尝试编写一些助手方法来处理读取和写入加密文件的问题。我有两种方法可以成功地实现这一点,并返回一个InputStream或一个OutputStream(实际上是密码版本),我可以使用它们读取或写入文件。我已经证实,当使用对象流包装并用于将加密对象读写到文件时,这些方法非常有效

然而,当我试图从加密的文本文件中读取时,问题就出现了。我可以验证输入它的字符串是否被加密并写入正确的文件,但当我尝试从该文件读回时,BufferedReader报告EOF(null)。InputStream.available()方法返回0。我可以保证文件在那里,正在被找到,并且InputStream本身不是空的。有谁能告诉我是什么原因引起的吗

读/写加密对象的工作非常出色(这里的CorruptedStreamException很好):

输出:

original
>Asymmetril: WE CAME, WE SAW, WE CONQUERED.; 12543; 21.4; false
[RM] > Trying to load resource: derp.derp
java.io.StreamCorruptedException
[RM] > Trying to load resource: derp.derp
decrypted
>Asymmetril: WE CAME, WE SAW, WE CONQUERED.; 12543; 21.4; false
original
>WE CAME, WE SAW, WE CONQUERED.
encrypted
>¤ƒ]£¬Vß4E?´?ùûe
[RM] > Trying to load resource: EncryptedOut.txt
bytes in stream? 0
decrypted
>null
尝试解密文本文件不会(请注意,加密的文本是可读的):

输出:

original
>Asymmetril: WE CAME, WE SAW, WE CONQUERED.; 12543; 21.4; false
[RM] > Trying to load resource: derp.derp
java.io.StreamCorruptedException
[RM] > Trying to load resource: derp.derp
decrypted
>Asymmetril: WE CAME, WE SAW, WE CONQUERED.; 12543; 21.4; false
original
>WE CAME, WE SAW, WE CONQUERED.
encrypted
>¤ƒ]£¬Vß4E?´?ùûe
[RM] > Trying to load resource: EncryptedOut.txt
bytes in stream? 0
decrypted
>null
用于创建CipherInputStream的代码:

    public static InputStream getEncryptedInputStream(String key, String path) {
    try {
        InputStream is = ResourceManager.getResourceStatic(path);
        SecretKeySpec keyspec = new SecretKeySpec(getHash(key),"AES");
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.DECRYPT_MODE, keyspec);
        return new CipherInputStream(is,c);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    }
    return null;
    }
当我尝试使用CIPHERINPUTSTREAM解密文件并检索原始字符串时,就会出现问题

然而,当我试图从加密的文本文件中读取时,问题就出现了

没有“加密文本文件”这样的东西。加密的结果是二进制的,而不是文本

我可以验证输入它的字符串是否被加密并写入正确的文件,但当我尝试从该文件读回时,BufferedReader报告EOF(null)


您不应该使用BufferedReader。它不是文本,而是二进制文件。使用
BufferedInputStream。

无论我是通过PrintWriter还是BufferedOutputStream进行写入,也不管我是否使用阅读器进行读取。结果,我忘记关闭创建文件的OutputStream。我一加上那一行,一切都开始工作了。感谢Antoniosss建议我重做我的方法中损坏的部分。我想知道为什么Eclipse没有提到关于它的资源泄漏…

注意,我可以很好地读取加密文本。它看起来像垃圾,因为你是对的。我强迫二进制文件作为文本读取,它会产生大量的乱码。问题是,当我从文件中创建CipherInputStream时,我无法从中提取任何内容,无论是否缓冲,是否二进制。不过,感谢您的尝试。您的问题是“有人能告诉我这可能是什么原因吗?”指的是
BufferedReader,
,它也是您标题的第一个突出单词。我已经回答了。您是否有另一个?您的文件由于使用了
PrintWriter
,已损坏-它威胁以文本(字符代码)形式输出数据,而不是原始数据,并根据您的平台编码应用一些筛选器。使用严格的输入/输出(不是编写器、读取器),一切都会很好。我已将标题更改为更合适的标题,现在将尝试替换printwriter。我已将printwriter替换为BufferedOutputStream,并改为写入消息的字节。我已经更新了上面的代码来反映这一点。但问题依然存在。无论我是通过PrintWriter还是BufferedOutputStream填充文件,该文件的CipherInputStream仍然为空。我误解你的意思了吗?这很重要。在二进制数据上使用读写器是不正确的。您是正确的,先生。然而,如果你真的读过我的问题,你会注意到我使用writer向流中写入字符串。加密随后进行。后来,在解密已经发生之后,我使用阅读器从流中读取字符串。我并不是说你错了,但你解决了一个错误的问题,我不喜欢仅仅因为沟通失误而被否决。变量消息是一个字符串,请注意,它在你显然忽略的输出中打印得多么漂亮。