Java 在Scala中通过套接字发送时,Jar文件会损坏
我知道Scala使用Java套接字,但我不太理解人们对同样问题的回答,但严格来说是Java 这是我的密码: 我试图通过套接字发送一个jar文件,但当我试图从另一端打开jar文件时,该文件似乎已损坏。我怎样才能解决这个问题 服务器:Java 在Scala中通过套接字发送时,Jar文件会损坏,java,scala,sockets,jar,Java,Scala,Sockets,Jar,我知道Scala使用Java套接字,但我不太理解人们对同样问题的回答,但严格来说是Java 这是我的密码: 我试图通过套接字发送一个jar文件,但当我试图从另一端打开jar文件时,该文件似乎已损坏。我怎样才能解决这个问题 服务器: object server extends App { import java.net._ import java.io._ import scala.io._ import scala.io.Source val server = new S
object server extends App {
import java.net._
import java.io._
import scala.io._
import scala.io.Source
val server = new ServerSocket(9999)
//Master should ping the slave actor to request for jar file
while (true) {
val s = server.accept()
val in = new BufferedSource(s.getInputStream()).getLines()
val out = new PrintStream(s.getOutputStream())
val filename = "mapReduce.jar"
for (line <- Source.fromFile(filename, "ISO-8859-1").getLines) {
out.println(line)
// println(line)
}
out.flush()
s.close()
}
}
Source
,PrintStream
等用于处理文本,而不是二进制数据。它们根据正在使用的字符集(在您的情况下为“iso-8859-1”)转换读写数据。
不要使用它们来读/写二进制数据
如果只需要发送字节,不必费心解释它们:
val f = new FileInputStream(filename)
val bos = new BufferedOutputStream(out)
Stream.continually(f.read).takeWhile(_ != -1).foreach(bos.write)
f.close
bos.close
Source
,PrintStream
等用于处理文本,而不是二进制数据。它们根据正在使用的字符集(在您的情况下为“iso-8859-1”)转换读写数据。
不要使用它们来读/写二进制数据
如果只需要发送字节,不必费心解释它们:
val f = new FileInputStream(filename)
val bos = new BufferedOutputStream(out)
Stream.continually(f.read).takeWhile(_ != -1).foreach(bos.write)
f.close
bos.close
jar文件实际上是一个“二进制”文件。您正在使用面向文本的方法(如println和getLines)来处理文件。使用println写入文件将在输出流中插入CR和/或LF字符。我怀疑你不想这样,这就是造成腐败问题的原因。尝试使用print而不是println。谢谢@mangotang,这很有意义。我尝试将println改为print,但问题仍然存在。我懂Java,但不懂Scala,所以我不熟悉这里使用的一些API。我想知道您使用getLines是否也会导致这个问题。如果在二进制文件上使用getLines,读卡器将读取任何看起来像CR的字节,丢弃CR,然后返回该行。因此,getLines/getLine有可能过滤掉任何CR(因为这是一个二进制文件,所以它不是真正的CR,而是数据中一个等于CR[decimal 13]的二进制值)。jar文件实际上是一个“二进制”文件。您正在使用面向文本的方法(如println和getLines)来处理文件。使用println写入文件将在输出流中插入CR和/或LF字符。我怀疑你不想这样,这就是造成腐败问题的原因。尝试使用print而不是println。谢谢@mangotang,这很有意义。我尝试将println改为print,但问题仍然存在。我懂Java,但不懂Scala,所以我不熟悉这里使用的一些API。我想知道您使用getLines是否也会导致这个问题。如果在二进制文件上使用getLines,读卡器将读取任何看起来像CR的字节,丢弃CR,然后返回该行。因此,getLines/getLine可能会过滤掉任何CR(因为这是一个二进制文件,所以它不是真正的CR,而是数据中一个等于CR[decimal 13]的二进制值)。谢谢你的回答。你能解释一下这条线是什么吗;Stream.continuously(r.read).takeWhile(!=-1).foreach(bos.write)正在做什么?r.read指的是什么?
r.read
是一个打字错误。应该是f.read
。至于它的其余部分,我认为,如果你只是从左到右阅读它所说的内容,这将是相当不言自明的:不断地从f
中读取内容,直到你得到-1,然后将其写入bos
。我尝试了这个方法,但我得到了一个java.nio.charset.MalformedInputException:Input length=1错误,我猜我需要指定一些编码。在哪里添加编码以及使用什么编码?不,不需要任何二进制数据编码。这就是重点。您从哪里获得异常?似乎您正在将某些内容截断为一个字节……似乎是客户端在while(in.hasNext)循环中崩溃。我没有正确处理流吗?我尝试在中从lazy val中删除.getLines,但没有帮助。谢谢您的回答。你能解释一下这条线是什么吗;Stream.continuously(r.read).takeWhile(!=-1).foreach(bos.write)正在做什么?r.read指的是什么?r.read
是一个打字错误。应该是f.read
。至于它的其余部分,我认为,如果你只是从左到右阅读它所说的内容,这将是相当不言自明的:不断地从f
中读取内容,直到你得到-1,然后将其写入bos
。我尝试了这个方法,但我得到了一个java.nio.charset.MalformedInputException:Input length=1错误,我猜我需要指定一些编码。在哪里添加编码以及使用什么编码?不,不需要任何二进制数据编码。这就是重点。您从哪里获得异常?似乎您正在将某些内容截断为一个字节……似乎是客户端在while(in.hasNext)循环中崩溃。我没有正确处理流吗?我尝试在中从lazy val中删除.getLines,但没有帮助