繁体   English   中英

在Scala中,如何从二进制文件中读取由字符分隔的字节?

In Scala, how to read bytes from binary file delimited by characters?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

在Scala中,给定一个二进制文件,我对检索Array [Byte]项列表感兴趣。

例如,二进制文件包含由字符/字节“ my-delimiter”定界的项目。

如何获取每个项目的Array [Byte]列表?

1 个回复

功能解决方案,借助java.nio

import java.nio.file.{Files, Paths}

object Main {

  private val delimiter = '\n'.toByte

  def main(args: Array[String]): Unit = {
    val byteArray = Files.readAllBytes(Paths.get(args(0)))

    case class Accumulator(result: List[List[Byte]], current: List[Byte])

    val items: List[Array[Byte]] = byteArray.foldLeft(Accumulator(Nil, Nil)) {
      case (Accumulator(result, current), nextByte) =>
        if (nextByte == delimiter)
          Accumulator(current :: result, Nil)
        else
          Accumulator(result, nextByte :: current)
    } match {
      case Accumulator(result, current) => (current :: result).reverse.map(_.reverse.toArray)
    }
    items.foreach(item => println(new String(item)))
  }

}

但是,预计该解决方案的性能较差。 这对您有多重要? 您将读取多少个文件,大小和读取频率? 如果性能很重要,则应该使用输入流和可变集合:

import java.io.{BufferedInputStream, FileInputStream}

import scala.collection.mutable.ArrayBuffer

object Main {

  private val delimiter = '\n'.toByte

  def main(args: Array[String]): Unit = {
    val items = ArrayBuffer.empty[Array[Byte]]
    val item = ArrayBuffer.empty[Byte]
    val bis = new BufferedInputStream(new FileInputStream(args(0)))
    var nextByte: Int = -1
    while ( { nextByte = bis.read(); nextByte } != -1) {
      if (nextByte == delimiter) {
        items.append(item.toArray)
        item.clear()
      } else {
        item.append(nextByte.toByte)
      }
    }
    items.append(item.toArray)
    items.foreach(item => println(new String(item)))
    bis.close()
  }

}
1 从二进制文件Scala中读取

如何在scala中以块的形式读取二进制文件。 这就是我想要做的 打印的值是一个巨大的数字。 而它应该返回1作为第一个输出 ...

2 在Scala中读取二进制文件[重复]

这个问题在这里已有答案: 使用scala 5答案 解析二进制数据 我有一些二进制文件,它们由Java应用程序以下列方式编写: 现在,我想在Scala框架中阅读此类文件,但我真的对如何做到这一点没有任何想法。 你可以帮帮我吗? ...

3 从二进制文件中读取 double(字节顺序?)

我有一个二进制文件,我想从中读取一个double。 在十六进制表示中,我在一个文件中有这 8 个字节(然后还有更多): 40 28 25 c8 9b 77 27 c9 40 28 98 8a 8b 80 2b d5 40 ... 这应该对应于大约 10 的双精度值(基于该条目的含义)。 我 ...

2014-09-19 07:56:08 2 1703   c/ io/ double
4 从二进制文件中读取特定字节

我试图弄清楚如何使用java获取二进制文件中的特定字节。 我已经对字节级操作进行了大量阅读,并让自己彻底搞砸了。 现在我可以遍历文件,如下面的代码所示,并告诉它停在我想要的字节。 但是我知道这是吝啬的,并且有一种'正确'的方式来做到这一点。 所以例如,如果我有一个文件,我需要从off ...

5 在Ruby中逐字节读取二进制文件

我目前正在尝试以块的形式读取二进制文件,到目前为止我的解决方案是: 第一个数字是要读取的字节数,第二个是偏移量。 我知道这很糟糕,因为File.binread每次返回后都会关闭文件。 我怎样才能打开文件一次,与我一起做的是,然后在我完成时关闭它(但仍然使用binread)。 ...

6 C : 从二进制文件中读取字节

我目前正在尝试从二进制文件中读取 256 个字节,并且在运行我的程序时没有得到任何输出(或错误)。 我有点困惑我哪里出错了。 尝试将每个byte读取为char并存储为长度为 256 的字符数组。我已经查看了关于 SO 的类似问题,到目前为止还没有任何运气。 我的代码的简化版本如下: ...

7 从二进制文件中仅读取x字节量

所以我正在使用上面的代码来读取文件的前50位并返回它们。 但是,这只是将整个文件返回给用户。 理想情况下,我想将开始和结束参数发送到此函数,然后仅在这两点之间读取并发送该数据。 我怎样才能做到这一点? ...

9 从二进制文件中读取

我试图从二进制文件中计算零和一的数量。 问题是,我得到了正确的答案。 零但是出现等于否。 零。 我正在做的是通过char读取char文件。 由于最多可以存在256个字符,因此我将结果存储在一个临时数组中,用于零和一个,并在此处检索是否再次出现字符。 ...

2013-09-16 15:22:39 2 449   c++
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM