Hướng dẫn đọc File trong Java
Sau một thời gian dài làm việc với Java, có bao giờ bạn thắc mắc rằng khi làm việc với dữ liệu có sẵn, Java làm sao có thể đọc và hiểu nội dung dữ liệu đã được lưu trong file đó hay không? Có bao giờ bạn tự hỏi rằng, chẳng lẽ mình nhập dữ liệu bằng tay với những dòng console mãi thế sao? Đố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?
Bạn vốn biết rằng Java là ngôn ngữ mạnh mẽ, vậy Java xử lí việc đọc file này như thế nào?
1. Hướng dẫn một số cách đọc file trong Java
Đọc file không chỉ trong Java mà hầu hết các ngôn ngữ lập trình khác đều hỗ trợ. 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 file-content.txt
có nội dung như bên dưới (ở đây mình lưu ở thư mục F:\content-demo
) để hỗ trợ cho phần code ví dụ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.
Sử dụng Scanner: này thì quá quen đối với việc nhập xuất trên màn hình console trước đó. Nhưng 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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-demo\\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);
}
}
}
}
Sử dụng BufferedReader: đây 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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-dmeo\\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);
}
}
}
}
Sử dụng File và FileReader: 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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-demo\\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ì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.
Để thìm hiểu xem code Java như thế nào để đọc được File XML. Bạn cần tạo 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-demo) với nội dung mẫu như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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-demo\\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 về Cấu trúc dữ liệu nữa. Nhưng không sao cả, nhìn chung nó cũng có thế thôi, luyện tập nhiều rồi sẽ quen và sẽ thấy dễ, thậm chí sẽ mê mẫn cho mà xem.
Lời kết
Java hỗ trợ tường tận mọi phương pháp để làm đọc/ghi File. Tuỳ từng loại File khác nhau mà ta lựa chọn cách xử lý khác nhau. 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.
Code mình chỉ mang tính chất tham khảo, các bạn nên hiểu và làm theo cách của mình để nâng cao tính sáng tạo và tự học nhé.
Bài viết mang tính chất “ghi chú, lưu trữ, chia sẻ và phi lợi nhuận”.
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!
Happy coding! 😎 👍🏻 🚀 🔥