Java 逐行读取文本文件

时间:2020-02-23 14:35:09  来源:igfitidea点击:

在本教程中,我们将看到不同的方法来读取java中的文件。

有时,我们需要按行读取文件,并处理它。

以下是Java中读取文件行的不同方式。

Java 8 Streams.

Java 8介绍了一种名为的新方法 lines()Files类可以用来按行读取文件行。

使用这种方法的优势在于它将返回 Stream将懒惰地填充作为流的字符串。
如果我们需要阅读大文件并只需要读取的前1000行,那么这是最好的方法,因为它不会在内存中的文件剩下,这将导致更好的吞吐量。

另一个优点是我们可以使用不同的优点 Stream在滤波器,映射等中执行流操作操作的方法

让我们在一个例子的帮助下看到这个。

package org.igi.theitroad;
 
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
 
public class ReadFileLineByLineMain {
 
	public static String fileName="/users/apple/";
	public static void main(String[] args) {
		Path filePath = Paths.get("/users/apple/Desktop/employees.txt");
		 
		try (Stream<String> lines = Files.lines( filePath )) 
		{
		    lines.forEach(System.out::println);
		} 
		catch (IOException e) 
		{
		    e.printStackTrace();
		}
	}
}

让我们说你想要打印所有男性员工。
你可以使用过滤方法来过滤所有男性员工。

package org.igi.theitroad;
 
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class ReadFileLineByLineMain {
 
	public static String fileName="/users/apple/";
	public static void main(String[] args) {
		Path filePath = Paths.get("/users/apple/Desktop/employees.txt");
		 
		try (Stream<String> lines = Files.lines( filePath )) 
		{
			List<String> maleEmp = lines.filter(emp -> emp.contains("Male"))
                                     .collect(Collectors.toList());
			maleEmp.forEach(System.out::println);
		} 
		catch (IOException e) 
		{
		    e.printStackTrace();
		}
	}
}

使用缓冲器

我们可以使用 java.io.BufferReaders readLine()按行读取文件到字符串行的方法.Oonce我们到达文件的结尾,它将返回null。

package org.igi.theitroad;
 
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
 
public class ReadFileLineByLineMain {
 
	public static void main(String[] args) {
		String fileName = "/users/apple/Desktop/employees.txt";
 
		try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
 
			String line;
                        //br.readLine() will return null when end of file is reached
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
 
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

使用Scanner

我们可以使用 java.util.Scanner程序按行读取文件行。
我们可以使用 hasNextLine()检查是否有更多读取的行和 nextLine()检索当前行并将读取位置移动到下一行。

package org.igi.theitroad;
 
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
 
public class ReadFileLineByLineMain {
 
	public static void main(String[] args) {
		String fileName = "/users/apple/Desktop/employees.txt";
 
		try (Scanner scanner = new Scanner(new File(fileName))) {
 
			while (scanner.hasNext()){
				System.out.println(scanner.nextLine());
			}
 
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Scanner类使用分隔符将其输入划分为令牌,它是线路馈线("\ n")或者回车返回("\ r"。
)在我们的情况下。

使用文件

我们可以使用 java.nio.file.Files readAllLines读取文件列表的方法。

如果我们有大文件,它可能无法表现良好。

package org.igi.theitroad;
 
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
 
public class ReadFileLineByLineMain {
 
	public static void main(String[] args) {
		
		ReadFileLineByLineMain rfllm=new ReadFileLineByLineMain();
		String fileName = "/users/apple/Desktop/employees.txt";
		List<String> lines = rfllm.readFileLineByLine(fileName);
		 for (String line : lines) {
	            System.out.println(line);
	        }
        
	}
	
	public List<String> readFileLineByLine(String fileName)
	{
		List<String> lines=null;
		try {
			lines = Files.readAllLines(Paths.get(fileName),
			            Charset.defaultCharset());
		}  catch (IOException e) {
			e.printStackTrace();
		}
        return lines;
	}
}

使用quaryAccessfile.

你也可以使用 RandomAccessFile'sreadLine()在Java中按行读取文件行的方法。
我们需要在读取模式下打开文件,然后调用 readLine()按行读取文件行的方法。

package org.igi.theitroad;
 
import java.io.IOException;
import java.io.RandomAccessFile;
 
public class ReadFileLineByLineMain {
 
	public static String fileName="/users/apple/Desktop/employees.txt";
	public static void main(String[] args) {
		try {
			RandomAccessFile file = new RandomAccessFile(fileName, "r");
			String str;
			while ((str = file.readLine()) != null) {
				System.out.println(str);
			}
			file.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

使用Apache Commons.

如果我们更喜欢使用Apache Commons库,可以使用 FileUtilss readLines将文件读入列表的方法。

我们需要在pom.xml中包含以下依赖项。

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
package org.igi.theitroad;
 
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
 
import org.apache.commons.io.FileUtils;
 
public class ReadFileLineByLineMain {
 
	public static String fileName="/users/apple/Desktop/employees.txt";
	public static void main(String[] args) {
		List<String> lines;
		try {
			lines = FileUtils.readLines(new File(fileName), StandardCharsets.UTF_8);
			lines.forEach(System.out::println);
		} catch (IOException e) {
			//TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}