scala - 从 Scala 中的同一源读取行和原始字节

标签 scala io

我需要编写执行以下操作的代码:

  1. 连接到 TCP 套接字
  2. 读取以“\r\n”结尾且包含数字N的行
  3. 读取N个字节
  4. 使用这 N 个字节

我目前正在使用以下代码:

val socket = new Socket(InetAddress.getByName(host), port)
val in = socket.getInputStream;
val out = new PrintStream(socket.getOutputStream)

val reader = new DataInputStream(in)
val baos = new ByteArrayOutputStream
val buffer = new Array[Byte](1024)

out.print(cmd + "\r\n")
out.flush

val firstLine = reader.readLine.split("\\s")

if(firstLine(0) == "OK") {
  def read(written: Int, max: Int, baos: ByteArrayOutputStream): Array[Byte] = {
    if(written >= max) baos.toByteArray
    else {
      val count = reader.read(buffer, 0, buffer.length)
      baos.write(buffer, 0, count)
      read(written + count, max, baos)
    }
  }

  read(0, firstLine(1).toInt, baos)
} else {
  // RAISE something
}

baos.toByteArray()

此代码的问题在于使用 DataInputStream#readLine引发弃用警告,但我找不到同时实现 read(...) 的类和 readLine(...) . BufferedReader例如,实现 read但它读取的是字符而不是字节。我可以将这些字符转换为字节,但我认为这不安全。

还有其他方法可以在 Scala 中编写类似的东西吗?

谢谢

最佳答案

请注意,在 JVM 上,一个字符有 2 个字节,因此“\r\n”是 4 个字节。对于存储在 JVM 外部的字符串,这通常不是真的。

我认为最安全的方法是以原始字节读取文件,直到达到“\r\n”的二进制表示,现在您可以在第一个字节上创建一个读取器(将字节转换为 JVM 兼容的字符),您可以确定只有文本,解析它,然后安全地继续处理其余的二进制数据。

关于scala - 从 Scala 中的同一源读取行和原始字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16415181/

相关文章:

scala - 如何将 groupBy().count() 添加到源 DataFrame?

scala - 使用共享可变状态向 RDD 添加索引

Java 更改文件工作目录

java - 扫描程序在使用next()或nextFoo()之后跳过nextLine()吗?

haskell - 在 Haskell 中从文件读取到数组

haskell - 如何在haskell中输入整数? (在控制台输入)

scala - 如何在连接中将 Column.isin 与数组列一起使用?

Scala lazy val解释

android - 使用 NetBeans 进行 Android 的 Scala 开发

java - 如何将两个字符串和一个 List<byte[]> 聚合为一个 byte[],然后提取它们