Я должен считать текстовый файл линию за линией с помощью Java. Я использую available()
метод FileInputStream
проверять и циклично выполняться по файлу. Но при чтении, цикл завершается после строки перед последней. т.е. если файл имеет 10 строк, цикл читает только первые 9 строк. Snippet использовал:
while(fis.available() > 0)
{
char c = (char)fis.read();
.....
.....
}
Попробуйте использовать 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();
String file = "/path/to/your/file.txt";
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line;
// Uncomment the line below if you want to skip the fist line (e.g if headers)
// line = br.readLine();
while ((line = br.readLine()) != null) {
// do something with line
}
br.close();
} catch (IOException e) {
System.out.println("ERROR: unable to read file " + file);
e.printStackTrace();
}
Как насчет использования сканера? Я думаю, что использовать Scanner проще
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();
}
}
Да, для повышения производительности следует использовать буферизацию. Используйте BufferedReader OR byte [] для хранения временных данных.
спасибо.
Попробуйте поискать в 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());
}
}
}
Вы не должны использовать 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 )
Если вы хотите читать построчно, используйте BufferedReader
. Он имеет метод readLine ()
, который возвращает строку в виде String или null, если достигнут конец файла. Таким образом, вы можете сделать что-то вроде:
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
String line;
while ((line = reader.readLine()) != null) {
// Do something with line
}
(Обратите внимание, что этот код не обрабатывает исключения, не закрывает поток и т. Д.)