Đọc file trong Java là một kỹ thuật quan trọng cần phải nắm nếu muốn làm việc sâu hơn với Java. Và bài viết này mình sẽ hướng dẫn bạn một số cách đọc file phổ biến.
Trước kia, có thể bạn đã quen thuộc với việc đọc dữ liệu từ console.
Tuy nhiên đối với những file dữ liệu lớn, dài hàng nghìn – hàng triệu dòng thì bạn sẽ xử lý ra sao?
Rất may cho bạn, Java là một ngôn ngữ mạnh mẽ, cung cấp cho bạn rất nhiều tùy chọn cho từng trường hợp cụ thể bạn cần.
1. Hướng dẫn một số cách đọc file trong Java
Đọc file trong Java
Các phương thức hỗ trợ đọc file không chỉ trong Java mà hầu hết các ngôn ngữ lập trình khác đều có.
Tuy nhiên, mỗi ngôn ngữ lại có cách thức xử lý khác nhau.
Muốn biết chúng khác nhau như thế nào thì trước hết bạn phải biết Java đọc file như thế nào cái đã.
Đọc file trong Java có thể nói là khá đa dạng ở phương thức hỗ trợ.
Để tìm hiểu kỹ hơn, trước tiên chúng ta hãy tạo một file text.txt có nội dung như bên dưới (ở đây mình lưu ở thư mục F:\content-niit
) để hỗ trợ cho phần code ví dụ.
Farewell! thou art too dear for my possessing,
And like enough thou know'st thy estimate,
The charter of thy worth gives thee releasing:
My bonds in thee are all determinate.
For how do I hold thee but by thy granting,
And for that riches where is my deserving?
The cause of this fair gift in me is wanting,
And so my patent back again is swerving.
Thy self thou gav'st, thy own worth then not knowing,
Or me to whom thou gav'st it, else mistaking,
So thy great gift upon misprision growing,
Comes home again, on better judgement making.
Thus have I had thee as a dream doth flatter,
In sleep a king, but waking no such matter.
Ok, bây giờ thì chúng ta bắt đầu viết chương trình để đọc file trên nào.
Cách #1: Đọc file trong Java sử dụng Scanner
Cách sử dụng Scanner chắc là bạn đã quá quen đối với việc nhập xuất trên màn hình console trước đó rồi nhỉ.
Khi làm việc với File, Scanner cung cấp hai phương thức là hasNextLine() và nextLine() hỗ trợ đọc file khá đơn giản và gần gũi, dễ sử dụng.
Đây là ví dụ cách mình đọc file với Scanner:
package file;
// Import package cần thiết
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ReadFileWithScanner {
public static void main(String args[]) throws FileNotFoundException {
String url = "F:\\content-niit\\file-content.txt";
// Đọc dữ liệu từ File với Scanner
FileInputStream fileInputStream = new FileInputStream(url);
Scanner scanner = new Scanner(fileInputStream);
try {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} finally {
try {
scanner.close();
fileInputStream.close();
} catch (IOException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName())
.log(Level.SEVERE, null, ex);
}
}
}
}
Cách #2: Đọc file trong Java sử dụng BufferedReader
Cách sử dụng BufferedReader trong Java để đọc file có thể xem là phương pháp dễ sử dụng nhất.
BufferedReader cung cấp sẵn hàm readLine() để đọc dữ liệu của file theo dòng.
Phương pháp này cần dùng thêm một InputStream thì mới có thể mở và đọc file được.
package file;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ReadFileWithBufferedReader {
public static void main(String args[]) throws IOException {
String url = "F:\\content-niit\\file-content.txt";
// Đọc dữ liệu từ File với BufferedReader
FileInputStream fileInputStream = null;
BufferedReader bufferedReader = null;
try {
fileInputStream = new FileInputStream(url);
bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String line = bufferedReader.readLine();
while (line != null) {
System.out.println(line);
line = bufferedReader.readLine();
}
} catch (FileNotFoundException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName()
.log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName())
.log(Level.SEVERE, null, ex);
} finally {
try {
bufferedReader.close();
fileInputStream.close();
} catch (IOException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName()
.log(Level.SEVERE, null, ex);
}
}
}
}
Cách #3: Sử dụng File và FileReader để đọc file
Phương pháp này tương tự như BufferedReader nhưng có phần nào đơn giản hơn một chút.
package file;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ReadFileWithFileAndFileReader {
public static void main(String args[]) throws IOException {
String url = "F:\\content-niit\\file-content.txt";
// Đọc dữ liệu từ File với File và FileReader
File file = new File(url);
BufferedReader reader = new BufferedReader(new FileReader(file));
try {
String line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
} catch (FileNotFoundException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName())
.log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName())
.log(Level.SEVERE, null, ex);
} finally {
try {
reader.close();
// file.close();
} catch (IOException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName())
.log(Level.SEVERE, null, ex);
}
}
}
}
Java hỗ trợ khá nhiều phương pháp làm việc với File khác nhau, nhưng mình chỉ chia sẻ để các bạn hiểu và có thể áp dụng 3 phương pháp phổ biến như trên là quá đủ để code khoẻ rồi.
Còn một vài cách khác khó hơn, phức tạp hơn và cũng ít được sử dụng hơn nên thôi, cái gì khó quá thì ta bỏ qua. =))
Mai này có thời gian, bạn có thể tự tìm hiểu để đa dạng hoá code của mình.
2. Cách đọc file XML trong Java
File theo định nghĩa trong lập trình có rất nhiều định dạng khác nhau. Mỗi loại định dạng lại có một hoặc mốt số cách xử lí khác nhau.
Trong phạm vi một bài viết khó mà chia sẻ hết được. Nên trong phần này, mình giới thiệu thêm với các bạn một loại File phổ biến nữa là File XML.
Mục đích chính của File XML là đơn giản hóa việc chia sẻ dữ liệu giữa các platform và các hệ thống được kết nối với mạng Internet.
Chính vì vậy, XML có tác dụng rất lớn trong việc chia sẻ, trao đổi dữ liệu giữa các hệ thống.
Dĩ nhiên là, việc đọc / ghi với File XML tất yếu cũng trở nên quan trọng.
Để tìm hiểu xem cách đọc file XML trong Java như thế nào. Bạn cần chuẩn bị trước một File XML và thêm vài nội dung vào đó.
Như phần ví dụ trước, mình tạo một File family.xml
(tại thư mục ở F:\content-niit
) với nội dung mẫu như sau:
<?xml version="1.0"?>
<family>
<member id="4">
<firstname>Michael</firstname>
<lastname>Corleone</lastname>
<age>22</age>
<earnings>$1.000.000</earnings>
</member>
<member id="3">
<firstname>Tom</firstname>
<lastname>Hagen</lastname>
<age>26</age>
<earnings>$300.000</earnings>
</member>
</family>
Để đọc được File XML ở trên, mình sẽ dùng DOM XML - phân tích toàn bộ file XML và lưu nó vào bộ nhớ, sau đó mô hình hoá nó dưới dạng cấu trúc TREE.
Việc này Java tự động làm, việc của bạn là duyệt qua để đọc dữ liệu.
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
public class ReadFileXML {
public static void main(String argv[]) {
String url = "F:\\content-niit\\family.xml";
try {
File fXmlFile = new File(url);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("member");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Con thứ: "
+ eElement.getAttribute("id"));
System.out.println("Tên: "
+ eElement.getElementsByTagName("firstname")
.item(0).getTextContent());
System.out.println("Họ: "
+ eElement.getElementsByTagName("lastname")
.item(0).getTextContent());
System.out.println("Tuổi: "
+ eElement.getElementsByTagName("age")
.item(0).getTextContent());
System.out.println("Thu nhập: "
+ eElement.getElementsByTagName("earnings")
.item(0).getTextContent());
System.out.println(" ");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Làm việc với XML khá là phức tạp, bạn cần có kiến thức chuẩn về các phương thức được hỗ trợ sẵn và một chút hiểu biết sâu hơn về các loại cấu trúc dữ liệu nữa.
Nhưng không sao cả, học nhiều, đọc nhiều, luyện tập nhiều rồi sẽ quen mà thôi.
> Tham khảo ngay KHÓA HỌC JAVA (Khóa huấn luyện 6 tháng với chuyên gia về Java) để thực sự làm chủ Java và đi làm sớm hơn.
Tóm lại, cách đọc file trong Java thì khá đa dạng. Tuy nhiên, Java hỗ trợ tận răng mọi nhu cầu thao tác với file của bạn.
Và tuỳ từng loại File khác nhau mà ta sẽ lựa chọn cách xử lý khác nhau để mang lại hiệu quả tốt nhất.
Mỗi phương pháp cũng có những ưu nhược điểm riêng, nên trong quá trình luyện tập bạn nhớ chú ý, NOTE lại để có những chỉnh sửa hợp lý cho những lần sau.
Ví dụ mình đưa ra ở trên chỉ mang tính chất tham khảo, các bạn đọc hiểu và tự làm lại theo cách hiểu riêng để nâng cao tính sáng tạo và tự học Java tốt hơn nhé.
> Đọc thêm: Phương thức printf trong Java
---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python