我需要编写执行以下操作的代码:
- 连接到 TCP 套接字
- 读取以“\r\n”结尾且包含数字N的行
- 读取N个字节
- 使用这 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/