2011-12-23 29 views
2

我有一個Ruby代碼,它逐行讀取文件,並檢查是否需要讀取某個塊的下一行,或者它應該處理該塊並繼續讀取文件解析每行。Java - 用readLine讀取文件爲

這是它:

File.open(ARGV[0], 'rb') do |f| 
    fl = false 
    text = '' 

    f.readlines.each do |line| 
     if (line =~ /^end_block/) 
      fl = false 

      # parse text variable 
     end 

     text += line if fl == true 

     if (line =~ /^start_block/) 
      fl = true 
     end 
    end 
end 

例如我需要打開文件作爲二進制閱讀,但我仍然需要一個readLine方法。

所以,問題是:我該怎麼辦一模一樣使用Groovy/Java的?

+0

這個「二進制」怎麼樣? – fge 2011-12-23 10:32:05

+0

@fge抱歉,不明白你的問題... – shybovycha 2011-12-23 10:32:38

+0

@不好意思,什麼? – shybovycha 2011-12-23 10:34:42

回答

2

您可以使用java.io.DataInputStream它同時提供一個readLine()方法和readFully(byte[])read(byte[])方法。

警告:JavaDoc for readLine表示,它被棄用,並且編碼可能不合適(閱讀JavaDoc中的詳細信息)。

因此,請仔細考慮您的真實需求,如果這是您的案例中的適當折衷。

1

如果你有行格式的文本,這不是二進制的恕我直言。這是因爲真正的二進制可以有任何字節,即使在代碼中會產生假中斷,即使是new linecarriage return也是如此。

你可能意味着你有文本在哪裏你想讀取每個字節沒有編碼或可能改變他們。這與使用ISO-8859-1相同。

您可以嘗試

BufferedReader br = new BufferedReader(new InputStreamReader(
         new FileInputStream(filename), "ISO-8859-1")); 
StringBuilder sb = new StringBuilder(); 
String line; 
boolean include = false; 
while((line = br.readLine()) != null) { 
    if (line.startsWith("end_block")) 
     include = false; 
    else if (line.startsWith("start_block")) 
     include = true; 
    else if (include) 
     sb.append(line).append('\n'); // new lines back in. 
} 
br.close(); 
String text = sb.toString(); 
+0

好吧,我正試圖在這些文本塊上調用Inflate。所以,我需要他們是二元的。無所謂我如何做到這一點(像這裏:http://stackoverflow.com/questions/8322615/read-file-content-line-by-line-from-byte-in-groovy)我得到'java.util .zip.DataFormatException:未知的壓縮方法異常。所以,我認爲這可能是由錯誤的文件閱讀格式造成的...... – shybovycha 2011-12-23 10:39:34

+0

當您讀取ZIP壓縮文件時,首先必須對其進行解壓縮。您可以先在Java中或在命令行上執行此操作。它不僅僅知道將壓縮文件讀取爲未壓縮的數據。 (如果Ruby自動爲你做這件事,我會感到驚訝) – 2011-12-23 10:44:58

+0

鑑於你的錯誤信息,你確定它是用ZIP壓縮的嗎? – 2011-12-23 10:46:38

0

也許是這樣的:

public final class Read 
{ 
    private static final Pattern START_BLOCK = Pattern.compile("whatever"); 
    private static final Pattern END_BLOCK = Pattern.compile("whatever"); 

    public static void main(final String... args) 
     throws IOException 
    { 
     if (args.length < 1) { 
      System.err.println("Not enough arguments"); 
      System.exit(1); 
     } 

     final FileReader r = new FileReader(args[0]); 
     final BufferedReader reader = new BufferedReader(r); 
     final StringBuilder sb = new StringBuilder(); 

     boolean inBlock = false; 

     String line; 

     while ((line = reader.readLine()) != null) { 
      if (END_BLOCK.matcher(line).matches()) { 
       inBlock = false; 
       continue; 
      } 

      if (inBlock) 
       sb.append(line); 

      if (START_BLOCK.matcher(line).matches()) 
       inBlock = true; 
     } 

     System.out.println(sb.toString()); 
     System.exit(0); 
    } 
}