Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Scala中通过套接字发送时,Jar文件会损坏_Java_Scala_Sockets_Jar - Fatal编程技术网

Java 在Scala中通过套接字发送时,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

我知道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 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,但没有帮助