Java InputStream在末尾不返回-1

时间:2018-08-03 10:21:14

标签: java encryption inputstream

我在这个问题上陷入了无限循环。 最初,我从服务器接收加密的文件,然后使用cipherInputStream对其解密,并且运行良好。但是后来我有点恼火,因为为此,我总是需要创建从服务器接收到的加密文件。

然后我认为CipherInputStream只是接受一个I​​nputStream,无论它是fileInputStream还是其他。所以我决定直接给我从服务器(带有套接字)获取的DataInputStream

现在,它仍然可以正常工作。我收到数据,将其解密,但是我的解密方法中的while循环永远不会结束,因为我永远不会为-1,而是始终为8。此外,我得到的解密文件还不是很完整(可能错过一两行)最后的数据。

这是我的解密方法:

public static void decrypt(DataInputStream dis, SecretKeySpec aesKey, String filename) throws NoSuchAlgorithmException, NoSuchPaddingException{
    Cipher c = Cipher.getInstance("AES");
    try {
        c.init(Cipher.DECRYPT_MODE, aesKey);            

        FileOutputStream fos;
        CipherInputStream cis;

        cis = new CipherInputStream(dis, c);
        fos = new FileOutputStream(filename);

        byte[] b = new byte[8];
        int i = cis.read(b);
        while (i != -1) {
            fos.write(b, 0, i);
            i = cis.read(b);
            System.out.println(i);
        }
        fos.close();
        cis.close();
        new File(filename);

    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        System.out.println("clé incorrecte.");
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我的dis是:

DataInputStream dis = new DataInputStream(socket.getInputStream());

这里是从服务器上的数据库发送文件的代码:

public void sendFile(String fileID, String owner, Socket clientSocket)  {
    String sql = "SELECT file FROM files WHERE owner LIKE '" + owner + "' AND filename LIKE '"+ fileID + "'";
    try (Connection conn = DriverManager.getConnection(url);
             Statement stmt  = conn.createStatement();
             ResultSet rs    = stmt.executeQuery(sql)){
        DataOutputStream dOut = new DataOutputStream(clientSocket.getOutputStream());
        if(rs.next()) {
            InputStream input = rs.getBinaryStream("file");
            int count;
            byte[] buffer = new byte[4096];
            while ((count = input.read(buffer)) > 0)
            {
              dOut.write(buffer, 0, count);
            }
        }

        else
            System.err.println("File not found in DB!");

    } catch (SQLException | IOException e) {
        System.out.println(e.getMessage());
    }
}

我已经尝试在密码中使用4096个缓冲区;那么除了最后一个,我将始终为512。因此,输入确实有结尾,但是-1并没有按预期发生(如Javadoc中所述: 如果由于已到达流的末尾而没有字节可用,则返回值-1)

有人有主意吗?

0 个答案:

没有答案