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.BufferReader
s 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.File
s 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's
readLine()
在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库,可以使用 FileUtils
s 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(); } } }