2014-03-30 20 views
2

我需要在Windows上處理一些長時間運行命令的文本輸出。要儘早獲得此過程的結果,我正在使用Scala StreamProcessBuilder類。如何在scala中解碼系統進程輸出?

一切都運行完美,但我遇到了字符編碼問題

這裏是我的分條源代碼(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,我想聲明的charset(CP850)的InputStream,但我無法在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

退房這篇文章,希望你可以使用ISO-8859-1編碼器:HTTP://計算器.com/a/13625541/3248346 –

+0

@IK:它不起作用,Sascha的溪流以相反的方式被破壞。 –

回答

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)) 
+0

Thx,它的工作:D – Sascha