gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:38:23 24 4
gpt4 key购买 nike

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

  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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com