InputStream пропускает несколько байтов при чтении файла через FTPAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 InputStream пропускает несколько байтов при чтении файла через FTP

Сообщение Anonymous »

Я пытаюсь загрузить ZIP-файл на Android через FTP.

Проблема в том, что иногда в полученном файле отсутствуют некоторые байты в конце.
Этого не происходит при использовании InputStream/

Код: Выделить всё

OutputStream
в локальных файлах.

Это не проблема файла: я тестировал множество разных файлов с одинаковыми результатами.

Это не проблема сервера: Я тестировал на двух разных - одинаковые результаты.

Это даже не похоже на проблему с подключением: тестировал на двух разных соединениях, одна и та же проблема.

И более того, похоже, это не проблема. проблема конкретно с Apache FTPClient: я пробовал старый ftp4j и выдает одинаково недостающие байты ближе к концу файла.
Насколько я понимаю, это InputStream.read(), который не выполняет свою работу должным образом, пропуская один байт в конце файла. конец некоторых буферов.

Код: Выделить всё

import org.apache.commons.net.ftp.FTPClient

fun downloadFile(remotePath: String, outputFile: File) {
val client = FTPClient()
client.connect("ftp.example.com")
client.login("username", "password")
client.enterLocalPassiveMode()
println(client.getSize(remotePath)) // Say 100000 bytes
//client.setFileType(FTP.BINARY_FILE_TYPE) // Doesn't matter
client.retrieveFileStream(remotePath).use { inputStream ->
outputFile.outputStream().use { outputStream ->
val buffer = ByteArray(DEFAULT_BUFFER_SIZE) // 8 * 1024
var bytes: Int
while (inputStream.read(buffer).also { bytes = it } != -1) {
outputStream.write(buffer, 0, bytes)
}
}
}
client.completePendingCommand()
client.disconnect()
println(outputFile.length()) // Usually 100000, other times 99999 or less bytes
}

Код: Выделить всё

lifecycleScope.launch(Dispatchers.IO) {
downloadFile("/path/to/input.zip", File(cacheDir, "output.zip"))
}
Файлом, который будет использоваться для тестирования, может быть любой файл, превышающий размер буфера, а также простой файл ASCII.

Очевидно, что файл большего размера и с большей вероятностью будет поврежден.< /p>
Как правильно получить двоичный файл через FTP?

Подробнее здесь: https://stackoverflow.com/questions/792 ... le-via-ftp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»