hasBytesAvailable
также может возвращать true
, если необходимо выполнить чтение для определения доступности байтов. Вот что происходит в вашем случае: конечное чтение возвращает ноль для «конца файла».
hasBytesAvailable
может быть полезно с входными потоками, такими как сокеты TCP, чтобы избежать блокировки read()
, но на самом деле это не так необходимо для чтения из файлов. В любом случае вы должны проверить возвращаемое значение read()
, которое может быть нулем (конец файла) или -1
(ошибка чтения), или фактическим количеством байтов, считанных в буфер (которое может быть меньше, чем число запрошено байтов).
Обратите также внимание, что вы всегда добавляете чанк с 1024 байтами в массив chunks
, даже если буфер только частично заполнен байтами из входного потока.
if let stream = InputStream(fileAtPath: audioFilePath) {
var buf = [UInt8](repeating: 0, count: 1024)
stream.open()
while case let amount = stream.read(&buf, maxLength: 1024), amount > 0 {
// print(amount)
chunks.append(Array(buf[..<amount]))
}
stream.close()
}