【发布时间】:2020-04-12 19:13:43
【问题描述】:
我想在不下载文件的情况下获取远程文件的输入流并加密其字节数据,但只需使用以下方法返回的 InputStream 对象。
- sftpChannel.get("...");
下面是我正在尝试做的代码示例。这是我的代码:
InputStream is = null;
OutputStream os = null;
try {
is = sftpChannel.get("/.../decrypted.txt");
os = sftpChannel.put("/.../ftp_encrypted.txt", ChannelSftp.OVERWRITE);
int byteRead = is.read();
while (byteRead != -1) {
os.write(((byte) byteRead) << 2); //encrypt the byte in some way
os.flush();
byteRead = is.read();
}
is.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
我认为应该已经足够了,但我收到了 IOException:
java.io.IOException: 1: 文件结束于 com.jcraft.jsch.ChannelSftp$1.flush(ChannelSftp.java:858)
问题似乎与 OutputStream 对象的刷新有关。删除 .flush() 方法调用没有帮助。
有什么建议吗? 谢谢。
【问题讨论】:
-
频道是否设计用于处理这种情况?您可能需要打开两个频道,一个用于阅读,一个用于写作
-
这很好,所以问题可能是由于服务器配置,我无法在双方(输入/输出)“流式传输”,所以最好的方法是打开两个连接,一个用于输入一个用于输出。这可能是一项昂贵的任务吗?
-
不知道。阅读文档。试试看。
-
你试过只写一个字节吗?
os.write(1); os.flush(); os.close();这行得通还是你得到同样的例外? -
@lainatnavi 是的,我可以读取字节但不能写入。我认为安徒生的建议是唯一的方法......
标签: java sftp inputstream jsch outputstream