Чтение данных из текстового файла с помощью Java

Мне нужно прочитать текстовый файл построчно, используя Java. Я использую available() метод FileInputStream для проверки и перебора файла. Но при чтении цикл завершается после строки, предшествующей последней. т.е., если в файле 10 строк, цикл читает только первые 9 строк. Используемый фрагмент:

while(fis.available() > 0)
{
    char c = (char)fis.read();
    .....
    .....
}

person Saran    schedule 19.05.2010    source источник
comment
Для чтения следует использовать BufferedReader файл построчно.   -  person kgiannakakis    schedule 19.05.2010


Ответы (13)


Вы не должны использовать available(). Никаких гарантий это не дает. Из документов API available():

Возвращает оценку количества байтов, которые могут быть прочитаны (или пропущены) из этого входного потока без блокировки при следующем вызове метода для этого входного потока.

Вы, вероятно, захотите использовать что-то вроде

try {
    BufferedReader in = new BufferedReader(new FileReader("infilename"));
    String str;
    while ((str = in.readLine()) != null)
        process(str);
    in.close();
} catch (IOException e) {
}

(взято из http://www.exampledepot.com/egs/java.io/ReadLinesFromFile.html)

person aioobe    schedule 19.05.2010
comment
+1 к этому. Это мой предпочтительный подход. Однако in.close (), вероятно, должен находиться в блоке finally. - person Chris Henry; 19.05.2010
comment
Я знаю. Однако для этого требуется другой try...catch, поскольку close() может пройти через IOException. Становится некрасивым для минимального примера. - person aioobe; 19.05.2010
comment
Ага. Я сам набирал ответ на полпути, когда решил очистить try / catch (хотя вы опередили меня с ответом). - person Chris Henry; 19.05.2010

Как насчет использования сканера? Я думаю, что пользоваться сканером проще

     private static void readFile(String fileName) {
       try {
         File file = new File(fileName);
         Scanner scanner = new Scanner(file);
         while (scanner.hasNextLine()) {
           System.out.println(scanner.nextLine());
         }
         scanner.close();
       } catch (FileNotFoundException e) {
         e.printStackTrace();
       }
     }

Читать подробнее о Java IO здесь

person vodkhang    schedule 19.05.2010

Если вы хотите читать построчно, используйте _ 1_. У него есть метод readLine(), который возвращает строку в виде String или null, если был достигнут конец файла. Итак, вы можете сделать что-то вроде:

BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
String line;
while ((line = reader.readLine()) != null) {
 // Do something with line
}

(Обратите внимание, что этот код не обрабатывает исключения, не закрывает поток и т. Д.)

person Chris    schedule 19.05.2010

Вы можете попробовать FileUtils из org.apache.commons.io.FileUtils, попробуйте скачать jar отсюда

и вы можете использовать следующий метод: FileUtils.readFileToString ("yourFileName");

Надеюсь, это поможет вам ..

person Kallathiyan    schedule 11.05.2011

Причина, по которой ваш код пропустил последнюю строку, заключалась в том, что вы поместили fis.available() > 0 вместо fis.available() >= 0

person JimmyBob23    schedule 24.11.2014

В Java 8 вы можете легко превратить свой текстовый файл в список строк с потоками, используя Files.lines и collect:

private List<String> loadFile() {
    URI uri = null;
    try {
        uri = ClassLoader.getSystemResource("example.txt").toURI();
    } catch (URISyntaxException e) {
        LOGGER.error("Failed to load file.", e);
    }
    List<String> list = null;
    try (Stream<String> lines = Files.lines(Paths.get(uri))) {
        list = lines.collect(Collectors.toList());
    } catch (IOException e) {
        LOGGER.error("Failed to load file.", e);
    }
    return list;
}
person Kris    schedule 04.05.2015

Попробуйте это просто поискать в Google

import java.io.*;
class FileRead 
{
   public static void main(String args[])
  {
      try{
    // Open the file that is the first 
    // command line parameter
    FileInputStream fstream = new FileInputStream("textfile.txt");
    // Get the object of DataInputStream
    DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String strLine;
    //Read File Line By Line
    while ((strLine = br.readLine()) != null)   {
      // Print the content on the console
      System.out.println (strLine);
    }
    //Close the input stream
    in.close();
    }catch (Exception e){//Catch exception if any
      System.err.println("Error: " + e.getMessage());
    }
  }
}
person Incognito    schedule 19.05.2010
comment
Пожалуйста, не используйте DataInputStream для чтения текста. К сожалению, подобные примеры копируются снова и снова, поэтому вы можете удалить их из своего примера. vanillajava.blogspot.co.uk/ 2012/08 / - person Peter Lawrey; 31.01.2013

Попробуйте использовать java.io.BufferedReader вот так.

java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(fileName)));
String line = null;
while ((line = br.readLine()) != null){
//Process the line
}
br.close();
person Ravindra Gullapalli    schedule 19.05.2010

Да, для повышения производительности следует использовать буферизацию. Используйте BufferedReader OR byte [] для хранения временных данных.

благодаря.

person Parth    schedule 19.05.2010

пользовательский сканер он должен работать

         Scanner scanner = new Scanner(file);
         while (scanner.hasNextLine()) {
           System.out.println(scanner.nextLine());
         }
         scanner.close(); 
person Gautam    schedule 30.07.2013

    File file = new File("Path");

    FileReader reader = new FileReader(file);  

    while((ch=reader.read())!=-1)
    {
        System.out.print((char)ch);
    }

Это сработало для меня

person MIG007    schedule 02.10.2018

Простой код для чтения файла в JAVA:

import java.io.*;

class ReadData
{
    public static void main(String args[])
    {
        FileReader fr = new FileReader(new File("<put your file path here>"));
        while(true)
        {
            int n=fr.read();
            if(n>-1)
            {
                char ch=(char)fr.read();
                System.out.print(ch);
            }
        }
    }
}
person Community    schedule 09.02.2014

person    schedule
comment
Не могли бы вы уточнить? Ответ содержит код, пожалуйста, добавьте пояснения. Спасибо. - person galath; 05.08.2015