我从FTP服务器下载的文件长度与服务器上的文件长度不相同
我正在使用Java中的FTPClient从服务器下载文件。当文件被下载时,我想检查它的完整性,然后删除它。 我这样做是通过比较下载的文件(以字节为单位)和服务器上的文件(以字节为单位)的大小来实现的,但结果与预期不符。我从FTP服务器下载的文件长度与服务器上的文件长度不相同
下面是从我的传输目录的摘录:
for (int i = 0; i <= insideDirectory.length - 1; i++) {
FTPFile transferFile = insideDirectory[i];
LOGGER.info("Passing file" + folder.getName() + "/" + transferFile.getName());
File downloadFile = new File("https://stackoverflow.com/users/home/example" + i + ".mp4");
OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(downloadFile));
System.out.println(transferFile.getSize());
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
InputStream inputStream = ftpClient
.retrieveFileStream(folder.getName() + "/" + transferFile.getName());
byte[] bytesArray = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(bytesArray)) != -1) {
outputStream2.write(bytesArray, 0, bytesRead);
}
Boolean success = ftpClient.completePendingCommand();
if (success) {
System.out.println("File #" + i + " has been downloaded successfully.");
checkIfExists(downloadFile, transferFile);
}
下面是我checkIfExists
方法
public void checkIfExists(File downloadedFile, FTPFile remoteFileToDelete) {
Long downloadedLength = downloadedFile.length();
Long remoteLength = remoteFileToDelete.getSize();
if (downloadedFile.length() == remoteFileToDelete.getSize()) {
LOGGER.info(downloadedLength + "exists and is the same length as " + remoteLength + ". Let's delete");
} else {
LOGGER.info(downloadedLength + "is not the same length as " + remoteLength + ". Let's not delete");
}
}
这里是输出运行循环两次之后,你可以看到,大小下载的文件可能有所不同:
File #0 has been downloaded successfully.
INFO: 7596008is not the same length as 7600840. Let's not delete
File #1 has been downloaded successfully.
INFO: 6873664is not the same length as 6878544. Let's not delete
File #2 has been downloaded successfully.
INFO: 7558112is not the same length as 7564744. Let's not delete
File #3 has been downloaded successfully.
INFO: 8662336is not the same length as 8665108. Let's not delete
File #0 has been downloaded successfully.
INFO: 7594312is not the same length as 7600840. Let's not delete
File #1 has been downloaded successfully.
INFO: 6870392is not the same length as 6878544. Let's not delete
File #2 has been downloaded successfully.
INFO: 7559184is not the same length as 7564744. Let's not delete
File #3 has been downloaded successfully.
INFO: 8660888is not the same length as 8665108. Let's not delete
.close()
您的BufferedOutputStream
,然后再尝试测量写入文件的大小。
如果没有.close()
,则无法保证(实际上恰恰相反)您写入流中的所有数据实际上都将写入通过File
对象访问的基础文件。
好的,你在哪里推荐我关闭outputStream2? – steam1234322
在测量文件的大小之前。在您修改文件的过程中,检查文件的大小有什么好处? –
更确切地说,就在你的'while'循环之后。 –
我该如何检查? – steam1234322
底部的输出是否不够?它比较两个文件的字节大小 – steam1234322
啊,我明白了。然后Alnitak发现了它。 –