Java 逐行读取文本文件
在本教程中,我们将看到不同的方法来读取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();
}
}
}

