我需要在Windows上处理长时间运行命令的一些文本输出。为了尽早获得此过程的结果,我使用的是Scala Stream和ProcessBuilder类。
一切都运行完美,但我遇到字符编码问题。
这是我的条带化源代码(powershell命令只是真正可执行文件的替代品)。
import scala.sys.process._
object CP850TEST extends Application{
val cmd = Seq("powershell", "-command", "echo 1a; Start-Sleep -s 1; echo 2äüîß; Start-Sleep -s 1 ; echo 3end")
val lines:Stream[String] = cmd.lines
lines.foreach(println)
}
输出schould看起来像:
1a
2äüîß
3end
但仅显示:
1a
2����
3end
要解决 Java 中的这个问题,我会声明InputStream的charset(Cp850),但我无法在Scala中找到任何解决方案:
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("powershell", "-command", "echo 1a; Start-Sleep -s 1; echo 2äüîß; Start-Sleep -s 1 ; echo 3end");
Process process = pb.start();
Scanner scanner = new Scanner(process.getInputStream(), "Cp850");
while ( scanner.hasNextLine() ) {
String s = scanner.nextLine();
System.out.println( s );
}
scanner.close();
}
答案 0 :(得分:3)
我认为唯一的方法是使用ProcessIO。
所以而不是:
cmd.lines
你必须这样做:
cmd.run(new ProcessIO(
i => i.close,
o =>
Source.fromInputStream(o, "Cp850").getLines.foreach { line =>
// your callback here
},
e => e.close))