Я думаю, мне нужно читать и преобразовывать байты потока в блоки типа 8 КБ для обработки, но я не могу найти ни одного примера Kotlin. о том, как это сделать, поскольку я не могу просто преобразовать блоки в base64 и объединить их. Это не работает для base64 из-за кодировки.
Я думаю, мне нужен какой-то поточный кодировщик base64, и я не могу найти для этого никакого решения, которое у меня работает. Код JAVA, который я могу найти здесь, в StackOverflow, я не могу преобразовать в Kotlin, поскольку я новичок в Kotlin и Java в целом
Кроме того, я читаю двоичные файлы данные и не могу использовать ни одну функцию lineReader, которую я нахожу повсюду. Она должна работать с блоками заданного размера в байтах.
Это функция, которая используется в настоящее время. вылетает, если файл больше примерно 20 МБ:
Код: Выделить всё
private fun pushAttachmentToJS(uri: Uri) {
try {
val inputStream = contentResolver.openInputStream(uri)
inputStream.use { stream ->
// Next two lines need a replacement working in blocks
val fileBytes = stream?.readBytes()
val fB64 = Base64.encodeToString(fileBytes, Base64.NO_WRAP) //
val encoder = Base64.getEncoder().withoutPadding()
val buffer = ByteArray(12000) // bytes buffer (multiple of 3!)
val builder = StringBuilder()
var bytesRead: Int
var lastSize = 0
while (true) {
bytesRead = stream!!.read(buffer)
if (bytesRead == -1) break
lastSize = bytesRead // remember to later get the padding
val chunk = buffer.copyOfRange(0, bytesRead)
val encodedChunk = encoder.encodeToString(chunk)
// Append the encoded chunk to the StringBuilder
builder.append(encodedChunk)
}
// Add necessary padding to the final string
val remainder = lastSize % 4
if (remainder != 0) {
val paddingNeeded = 4 - remainder
repeat(paddingNeeded) {
builder.append('=')
}
}
val fB64 = builder.toString()
// (... further processing of the fB64 string)
}
} catch (e: IOException) {
e.printStackTrace()
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... s-buffered
Мобильная версия