2015-10-25 4 views
3

Я пытаюсь прочитать файл ascii и распознать позицию символа новой строки «\ n», чтобы узнать, сколько и сколько символов у меня есть в каждой строке. Размер файла - 538 МБ. Когда я запускаю код ниже, он никогда ничего не печатает. Я много искал, но я ничего не нашел для файлов ascii. Я использую netbeans и Java 8. Любые идеи?Чтение файла ascii по строкам - Java

Ниже приведен мой код.

String inputFile = "C:\myfile.txt"; 
FileInputStream in = new FileInputStream(inputFile); 
FileChannel ch = in.getChannel(); 
int BUFSIZE = 512; 
ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE); 
Charset cs = Charset.forName("ASCII"); 

while ((rd = ch.read(buf)) != -1) { 
     buf.rewind(); 
     CharBuffer chbuf = cs.decode(buf); 

     for (int i = 0; i < chbuf.length(); i++) { 
      if (chbuf.get() == '\n'){ 
       System.out.println("PRINT SOMETHING"); 
      } 
     } 
} 
+0

Вы просмотрели http://stackoverflow.com/questions/4716503/best-way-to-read-a-text-file-in-java? –

+0

Я уже видел этот пост, но с BufferReader он бросает мне ошибку Java Out of Memory, поэтому я не могу использовать функцию readline(). – lostromos

+0

Используйте 'RandomAccessFile' вместо' FileReaders' для больших файлов. – ccc

ответ

0

Количество символов в строке является длина строки для чтения с помощью readLine вызова:

try (BufferedReader br = new BufferedReader(new FileReader(file))) { 
    int iLine = 0; 
    String line; 
    while ((line = br.readLine()) != null) { 
     System.out.println("Line " + iLine + " has " + 
          line.length() + " characters."); 
     iLine++; 
    } 
} catch(IOException ioe){ 
    // ... 
} 

Обратите внимание, что (зависит от системы) конец линии маркера была лишена из строки с помощью readLine.

Если в очень большом файле нет новых строк, это действительно может привести к нехватке памяти. Чтение символа по персонажам позволит избежать этого.

 
    File file = new File("Z.java"); 
    Reader reader = new FileReader(file); 
    int len = 0; 
    int c; 
    int iLine = 0; 
    while((c = reader.read()) != -1) { 
     if(c == '\n'){ 
      iLine++; 
      System.out.println("line " + iLine + " contains " + 
           len + " characters"); 
      len = 0; 
     } else { 
      len++; 
     } 
    } 
    reader.close(); 
+0

С BufferedReader он бросает мне java.lang.OutOfMemoryError: куча Java-кучи. Вот почему я использую ByteBuffer. – lostromos

+0

@Iostromos Возможно ли, что весь файл не содержит строк? Является ли это «регулярным» текстовым файлом или какой-то странной связкой байтов? – laune

+0

@ Iostromos Добавлена ​​версия, не сохраняющая никаких файлов - все должно быть в порядке. (Если слишком медленно: его можно улучшить.) – laune

-1

Вы должны пользователь FileReader, который является удобный класс для чтения файлов символов.

FileInputStream javs docs clearly states

FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader.

Попробуйте ниже

try (BufferedReader br = new BufferedReader(new FileReader(file))) { 
    String line; 
    while ((line = br.readLine()) != null) { 
     for (int pos = line.indexOf("\n"); pos != -1; pos = line.indexOf("\n", pos + 1)) { 
     System.out.println("\\n at " + pos); 
     } 
    } 
} 
+0

Он перестает работать из-за ошибки компиляции. Как игнорировать это? – lostromos

+0

Было бы удивительно, если бы этот фрагмент напечатал что угодно. – laune

+0

@lostromos Я исправил одну незначительную ошибку. –

1

метод для хранения содержимого файла в строку:

static String readFile(String path, Charset encoding) throws IOException 
{ 
    byte[] encoded = Files.readAllBytes(Paths.get(path)); 
    return new String(encoded, encoding); 
} 

Вот способ найти вхождения символа во всей строке:

public static void main(String [] args) throws IOException 
{ 
    List<Integer> indexes = new ArrayList<Integer>(); 
    String content = readFile("filetest", StandardCharsets.UTF_8); 
    int index = content.indexOf('\n'); 
    while (index >= 0) 
    { 
     indexes.add(index); 
     index = content.indexOf('\n', index + 1); 
    } 
} 

Найдено here и here.

+0

Этот метод также выдает ошибку памяти. Я упомянул большой файл объемом до 538 МБ. – lostromos

Смежные вопросы