2013-05-28 88 views
1

我有一個文件在unix目錄中,我需要閱讀並顯示它的內容到頁面。我在我的java代碼中使用jcraft庫。我能夠連接到Unix服務器並找到該文件但無法讀取它。我發現示例代碼來讀取文件,但它不工作,它死於int c = in.read()行,可能卡在循環中...我發佈我的代碼可能是你可以發現一個問題。如果還有其他(更好的)方法可以做到這一點,我將不勝感激。希望我的問題和示例代碼足夠清楚。謝謝大家。如何使用Java在Unix目錄中讀取文件?

public String readFile(String path) throws Exception { 

    ChannelExec c = (ChannelExec)session.openChannel("exec"); 
    OutputStream os = c.getOutputStream(); 
    InputStream is = c.getInputStream(); 
    c.setCommand("scp -f " + path); //path is something like /home/username/sample.txt 
    c.connect(); 
    String header = readLine(is); 

    int length = Integer.parseInt(header.substring(6, header.indexOf(' ', 6))); 
    os.write(0); 
    os.flush(); 

    byte[] buffer = new byte[length]; 
    length = is.read(buffer, 0, buffer.length); 
    os.write(0); 
    os.flush(); 

    c.disconnect(); 

    return new String(buffer); 
} 

private String readLine(InputStream in) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    for (;;) { 
     int c = in.read(); // code stops working here 
     if (c == '\n') { 
      return baos.toString(); 
     } else if (c == -1) { 
      throw new IOException("End of stream"); 
     } else { 
      baos.write(c); 
     } 
    } 
} 
+0

無法讀取手段?發佈錯誤.. – MaheshVarma

+0

沒有錯誤,它只停在int c = in.read();行並沒有任何反應(沒有錯誤,沒有警告......),但代碼不會繼續 – JS11

回答

0

這看起來沒問題。我假設它只是在閱讀時掛起(就像你說的)。

[...]此方法一直阻塞輸入數據可用[...]

我想你有麻煩建立通道。 scp可能在等待您的密碼或什麼?


第二次以爲您的行檢測可能無法正常工作。這會導致超出你想要退出的地方。也許你也應該檢查'\r'


也有人做了類似的東西在這裏:你想看看使用ChannelSftp代替 How to read JSch command output?

1

ChannelSftp channelSftp = null; 
try { 
    channelSftp = (ChannelSftp) session.openChannel("sftp"); 
    channelSftp.connect(); 
    is = channelSftp.get(path); 
    // read the contents, etc... 
} finally { 
    if (channelSftp != null) { 
     channelSftp.exit(); 
    } 
}