2011-12-23 4 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

+0

@ fge извините, не понял ваш вопрос ... – shybovycha

+0

@Don извините, что ??? – shybovycha

ответ

2

Вы можете использовать java.io.DataInputStream, который обеспечивает как метод readLine() и readFully(byte[]) и read(byte[]) методы.

Предупреждение: JavaDoc для readLine говорит, что осуждается и что кодирование может быть неуместным (читайте подробности в JavaDoc).

Так что подумайте дважды о своих реальных требованиях, и если это подходящий компромисс в вашем случае.

1

Если у вас есть текст с отформатированной строкой, это не бинарный IMHO. Это связано с тем, что истинный двоичный файл может иметь любой байт, даже new line и carriage 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

+0

Когда вы читаете ZIP-файл, вам сначала нужно его распаковать. Вы можете сделать это на Java или в командной строке. Он не просто знает, как считать сжатый файл как несжатые данные. (Я был бы удивлен, если Ruby сделает это автоматически для вас) –

+0

Учитывая ваше сообщение об ошибке, вы уверены, что его сжали ZIP? –

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); 
    } 
}