【问题标题】:kotlin reading from file into byte arraykotlin 从文件读取到字节数组
【发布时间】:2023-03-08 21:47:01
【问题描述】:

如何将字节读入字节数组?在java中,我曾经将字节数组初始化为byte[] b = new byte[100],然后将其传递给相应的方法。但是在 Kotlin 中,我无法用缓冲区应该有多少字节来初始化 ByteArray

换句话说,我该如何使用这个功能?: https://developer.android.com/reference/kotlin/java/io/RandomAccessFile#read(kotlin.ByteArray)

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    最简单的方法是使用

    File("aaa").readBytes()
    

    那个人会将整个文件读入ByteArray。但是你应该仔细知道堆中有足够的 RAM 来这样做

    ByteArray 可以通过ByteArray(100) 调用创建,其中100 是它的大小

    对于RandomAccessFile,最好在readFully 函数中使用,它会准确读取请求的字节数。

    经典方法可以按块读取文件,例如

        val buff = ByteArray(1230)
        File("aaa").inputStream().buffered().use { input ->
          while(true) {
            val sz = input.read(buff)
            if (sz <= 0) break
    
            ///at that point we have a sz bytes in the buff to process
            consumeArray(buff, 0, sz)
          }
        }
    

    【讨论】:

    • 我的意思是我可能没有足够的字节来容纳,所以我想声明一个固定大小的数组,然后逐个读取它..
    • 我已经尝试过了。如果我初始化为val buf: ByteArray(100),它会在( 处显示错误,说意外令牌...
    • 我已经更新了帖子以涵盖您的情况,另外,请参阅上面示例中我如何使用 ByteArray(替换:用 =)
    【解决方案2】:

    我发现这很好用:

    fun File.chunkedSequence(chunk: Int): Sequence<ByteArray> {
        val input = this.inputStream().buffered()
        val buffer = ByteArray(chunk)
        return generateSequence {
            val red = input.read(buffer)
            if (red >= 0) buffer.copyOf(red)
            else {
                input.close()
                null
            }
        }
    }
    

    像这样使用它。

        file.chunkedSequence(CHUNK_SIZE).forEach {
            // Do something with `it`
        }
    

    与您的问题不完全匹配,但这是我在寻找将文件分块为字节数组序列时出现的问题。

    【讨论】:

    • 干得漂亮!
    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多