Chào các bạn, hẳn thì trong quá trình học tập các bạn cũng đã gặp vấn đề đọc ghi dữ liệu từ file rồi phải không ạ! Chính vì thế hôm nay mình quyết định viết một bài để hướng dẫn các bạn cách đọc ghi file trong Java.
Bài viết mình được chia làm hai phần chính đó là:
- Đọc dữ liệu đầu vào từ file.
- Ghi dữ liệu từ chương trình ra file.
Đọc dữ liệu đầu vào từ file trong Java.
Ở đây mình đã chuẩn bị một file dữ liệu đầu vào như dưới:
Lưu ý: Các bạn phải lưu file dưới định dạng unicode nhé!
Oke, bây giờ chúng ta sẽ viết một chương trình dùng để đọc dữ liệu từ file có tên data.txt như trên.
Chương trình như bên dưới:
package com.company; import java.io.*; public class Main { private final static String FILE_URL = "/home/tamvo/IdeaProjects/Hackerrank/src/com/company/data.txt"; public static void main(String[] args) throws IOException { File file = new File(FILE_URL); InputStream inputStream = new FileInputStream(file); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(inputStreamReader); String line = ""; while((line = reader.readLine()) != null){ System.out.println(line); } } }
Sau khi chạy chương trình thì ta sẽ có kết quả sau:
Giờ mình sẽ giải thích từng chi tiết cho các bạn nha:
- FILE_URL: Chính là đường dẫn đến tệp, ở đây mình dùng đường dẫn tuyệt đối nên nó hơi dài xí.
- File: Lớp này sẽ lấy file dữ liệu từ đường dẫn ở trên, nếu đường dẫn không hợp lệ thì nó sẽ trả ra ngoại lệ đó nha!
- InputStream: Khởi tạo một inputStream từ file ở trên chuẩn bị cho việc đọc file.
- InputStreamReader: Từ inputStream ở trên tạo ra một đối tượng có thể đọc được. Ở đây là chỉ đọc được từng kí tự mà thôi nhé !
- BufferedReader: Từ inputStreamRead cũng tạo ra một đối tượng có thể đọc được.
Để thấy khác nhau thì các bạn có thể xem đoạn code dưới đây:
package com.company; import java.io.*; public class Main { private final static String FILE_URL = "/home/tamvo/IdeaProjects/Hackerrank/src/com/company/data.txt"; public static void main(String[] args) throws IOException { File file = new File(FILE_URL); InputStream inputStream = new FileInputStream(file); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); int c; while ((c = inputStreamReader.read()) != -1){ System.out.print((char) c); } /*BufferedReader reader = new BufferedReader(inputStreamReader); String line = ""; while((line = reader.readLine()) != null){ System.out.println(line); } */ } }
Và kết quả khi chạy chương trình:
Chà rườm rà nhỉ ? Vậy sự khác nhau giữa chúng là gì ? Lớp BufferedReader trong java được sử dụng để đọc văn bản từ một input stream dựa trên các ký tự. Nó có thể được sử dụng để đọc dữ liệu theo dòng bằng phương thức readLine(). Nó giúp hiệu suất nhanh. Vậy nên mình khuyên các bạn nên sử dụng lớp BufferedReader để đọc file.
Ghi dữ liệu từ chương trình ra file trong Java.
Dưới đây là chương trình mình ghi dữ liệu ra file data.txt:
package com.company; import java.io.*; public class Main { private final static String FILE_URL = "/home/tamvo/IdeaProjects/Hackerrank/src/com/company/data.txt"; public static void main(String[] args) throws IOException { String[] data = { "Hello Java!", "Good bye!" }; File file = new File(FILE_URL); OutputStream outputStream = new FileOutputStream(file); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); for (String item: data){ outputStreamWriter.write(item); // Dùng để xuống hàng outputStreamWriter.write("n"); } // Đây là phương thức quan trọng! // Nó sẽ bắt chương trình chờ ghi dữ liệu xong thì mới kết thúc chương trình. outputStreamWriter.flush(); } }
Sau khi chạy chương trình xong thì kết quả sẽ như sau:
Để mình nói rõ phương thức flush() cho các bạn một chút. Trong một số trường hợp chương trình quá nhanh, đến nỗi nó chưa ghi dữ liệu vào file kịp thì chương trình đã kết thúc. Để tránh điều này thì các bạn phải sử dụng phương thức flush().
Bây giờ bạn thử chạy lại chương trình một lần nữa, bạn sẽ thấy dữ liệu trong file vẫn không đổi. Trong trường hợp bạn muốn ghi tiếp dữ liệu vào cuối file thì phải làm sao ?
OutputStream outputStream = new FileOutputStream(file, true);
Đây là kết quả khi chạy chương trình thêm một lần nữa:
Oke, bài viết của mình đến đây là kết thúc. Cám ơn các bạn đã chú ý theo dõi !
Để lại một bình luận