Đọc ghi file trong java

Có 3 kiểu stream được sử dụng để đọc ghi file trong java này là byte stream, character stream & buffered stream. không dừng lại ở đó bạn còn tồn tại thể sử dụng Scanning (đọc) & Formatting (ghi).

1. Đọc nghi file trong java với byte stream

Các chương trình sử dụng Byte Stream để đọc ghi dữ liệu theo từng byte(8bit). Toàn bộ các class Byte Stream có nguồn gốc từ InputStream & OutputStream.

Sử dụng Byte Stream

Có rất là nhiều class Byte Stream, để hình dung Byte Stream hoạt động như vậy nào, tất cả chúng ta sẽ chăm chú vào FileInputStream & FileOutputStream, chẳng hạn:

public class CopyFileByte {
    public static void main(String [] args) throws IOException {
      FileInputStream inputStream = null;
      FileOutputStream outputStream = null;

      try {
         inputStream = new FileInputStream("inStream.txt");
         outputStream = new FileOutputStream("outStream.txt");
         
         int ͼ;
         while ((ͼ = inputStream.read()) != -1) {
            outputStream.write(ͼ);           
         }
      } finally {
         if (inputStream != null) {
            inputStream.close();
         }
         if (outputStream != null) {
            outputStream.close();
         }
      }         
    }
}

Việc đóng một Stream khi mà không có nhu cầu sử dụng nó nữa là một việc rất quan trong – tránh bị leak tài nguyên. Chẳng hạn trên sử dụng khối finally để bảo đảm cả 2 Streams (input, output) đều được đóng ngay cả khi có lỗi xảy ra.

2. Đọc ghi file trong java với character stream

Byte Stream trong Java được sử dụng để thực hiện input & output của các byte (8 bit), trong khi đó, Character Stream trong Java được sử dụng để thực hiện input & output cho Unicode 16 bit. Toàn bộ các class Character Stream có nguồn gốc từ Reader & Writer.

Sử dụng Character Stream

Mặc dầu có nhiều lớp liên quan tới Character Stream nhưng các lớp thường dùng đặc biệt là FileReader & FileWriter, chẳng hạn:

ublic class CopyFileCharacter {
    public static void main(String [] args) throws IOException {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader("input.txt");
         out = new FileWriter("output.txt");
         
         int ͼ;
         while ((ͼ = in.read()) != -1) {
            out.write(ͼ);           
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }         
    }    
}

3. Đọc ghi file trong java với buffered stream

Các chẳng hạn trên không sử dụng Buffered Streams, điều này có nghĩa là việc đọc & xuất dữ liệu được thực hiện trực tiếp dưới quyền điều khiển của HĐH, gây phí phạm thời gian & tài nguyên. Để giảm bớt những trên, Buffered Streams đã được chào đời. Buffered Streams được sử dụng để tăng vận tốc hoạt động Ι/Σ, bằng cách dễ dàng là tạo thành một khoảng nhớ đệm với kích cỡ rõ ràng và cụ thể nào đó. Chính vì vậy tất cả chúng ta không cần phải truy cập vào ổ đĩa cứng khi thực hiện Ι/Σ. Một chương trình có thể chuyển hóa từ không sử dụng buffered stream (Byte Stream & Chracter Stream sang sử dụng buffered stream bằng việc sử dụng sáng tạo “Wrapping”

Xem Thêm  Cách tìm độ dài mảng trong Java - lấy độ dài của mảng

Lớp wrapper cho byte stream

Lớp wrapper cho character stream

Sử dụng buffered stream để đọc ghi file

Chẳng hạn: Sử dụng Wrapper cho byte stream

public class CopyFileBuffer1 {
    public static void main(String [] args) throws IOException {
        BufferedInputStream bufferIn = null;
        BufferedOutputStream bufferOut = null;

        try {
            InputStream inputStream = new FileInputStream("input.txt");
            OutputStream outputStream = new FileOutputStream("output.txt");

            bufferIn = new BufferedInputStream(inputStream);
            bufferOut = new BufferedOutputStream(outputStream); 
   
            int ͼ;                    
            while ((ͼ = bufferIn.read()) != -1) {
                bufferOut.write(ͼ);
            }            
        } finally {
            if (bufferIn != null) {
                bufferIn.close();
            }
            if (bufferOut != null) {
                bufferOut.close();
            }            
        }         
    }    
}

Chẳng hạn: Sử dụng Wrapper cho character stream

public class CopyFileBuffer2 {
    public static void main(String [] args) throws IOException {
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;

        try {
            Reader reader = new FileReader("input.txt");
            Writer writer = new FileWriter("output.txt");

            bufferedReader = new BufferedReader(reader);
            bufferedWriter = new BufferedWriter(writer);
   
            int ͼ;                    
            while ((ͼ = bufferedReader.read()) != -1) {
                bufferedWriter.write(ͼ);
            }            
        } finally {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
            if (bufferedWriter != null) {
                bufferedWriter.close();
            }            
        }         
    }    
}

4. Đọc ghi file trong java với Scanning & Formatting

Scanning

Lớp Scanner có thể nghiên cứu được các kiểu dữ liệu nguyên thủy & kiểu String bằng việc sử dụng biểu thức chính quy (regular expressions). Mặc định các khoảng trắng được Scanner dùng để phân biệt các ký tự trong một chuỗi.

Sử dụng Scanner

Scanner có thể được sử dụng để import dữ liệu từ keyboard, nghiên cứu chuỗi ký tự, nhập dữ liêu từ file.

Chẳng hạn 1: Đoạn code này cho phép người dùng đọc ký tự số từ keyboard bằng cách khởi tạo Scanner sử dụng System.in:

Scanner sc = new Scanner(System.in);
int ι = sc.nextInt();

Chẳng hạn 2: Đoạn code này lấy toàn bộ các số có kiểu long từ file myNumbers.txt:

Scanner sc = new Scanner(new File("myNumbers.txt"));
while (sc.hasNextLong()) {
    long aLong = sc.nextLong();
}

Chẳng hạn 3: Scanner cũng có thể sử dụng dụng bộ phân cách (Delimiters) khác do người dùng tự khái niệm, đoạn code sau đọc & nghiên cứu thành các mục từ một chuỗi.

String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("s*fishs*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close(); 

Một số bí quyết của lớp Scanner

Bí quyết
Miêu tả

Xem Thêm  Mảng Python - làm việc với các mảng trong python

nextInt() trả về kiểu int

nextFloat() trả về kiểu float

nextBoolean() trả về kiểu boolean

nextByte() trả về kiểu byte

nextLine() trả về kiểu String

Formatting

Ngoài 2 bí quyết print & println. Java phân phối 2 bí quyết định dạng in cho tất cả chúng ta là printf & format & 2 bí quyết này có tính năng tương đương nhau. Bạn có thể gọi bí quyết này ở bất kỳ chỗ nào trong code của các bạn.

Chẳng hạn: định dạng in cho các biến số:

System.out.format("The value of " + "the float variable is " +
     "%f, while the value of the " + "integer variable is %d, " +
     "and the string is %s", floatVar, intVar, stringVar); 

Một điều nữa là ta có thể in theo hệ thống định dạng Pháp, ngăn cách phần nguyên & phần thập phân của số thực thập phân bằng định dạng Locale.FRANCE, chẳng hạn:

System.out.format(Locale.FRANCE,
    "The value of the float " + "variable is %f, while the " +
    "value of the integer variable " + "is %d, and the string is %s%n", 
    floatVar, intVar, stringVar); 

Chẳng hạn: một chương trình dễ dàng:

public class TestFormat {
    
    public static void main(String[] args) {
      long ɳ = 461012;
      System.out.format("%d%n", ɳ);      //  -->  "461012"
      System.out.format("%08d%n", ɳ);    //  -->  "00461012"
      System.out.format("%+8d%n", ɳ);    //  -->  " +461012"
      System.out.format("%,8d%n", ɳ);    // -->  " 461,012"
      System.out.format("%+,8d%n%n", ɳ); //  -->  "+461,012"
      
      double pi = Math.PI;

      System.out.format("%f%n", pi);       // -->  "3.141593"
      System.out.format("%.3f%n", pi);     // -->  "3.142"
      System.out.format("%10.3f%n", pi);   // -->  "     3.142"
      System.out.format("%-10.3f%n", pi);  // -->  "3.142"
      System.out.format(Locale.FRANCE,
                        "%-10.4f%n%n", pi); // -->  "3,1416"

      Calendar ͼ = Calendar.getInstance();
      System.out.format("%tB %te, %tY%n", ͼ, ͼ, ͼ); // -->  "May 29, 2006"

      System.out.format("%tl:%tM %tp%n", ͼ, ͼ, ͼ);  // -->  "2:34 am"

      System.out.format("%tD%n", ͼ);    // -->  "05/29/06"
    }
}

Bảng sau thông kê một vài “Converters” & “Flags” được sử dụng trong chẳng hạn trên:

Xem Thêm  Cách sử dụng các hàm Window trong SQL Server - chức năng cửa sổ trong sql w3schools

Converter
Flag
Giải thích

{d}
 
Một số nguyên thập phân.

ƒ
 
Một số float.

ɳ
 
Một ký tự dòng mới phù phù hợp với nền móng chạy áp dụng. Chúng ta nên luôn luôn sử dụng , hơn là ɳ.

tB
 
In ra tên tháng trong biến date & time, chẳng hạn: April.

td, te
 
In ra ngày trong biến date & time, 2 số của ngày trong tháng. td sẽ in ra cả số 0 ví dụ như ngày 07, te thì không.

ty, tY
 
In ra năm trong biến date & time, ty = 2-số cuối của năm, tY = 4-số của năm.

tl
 
In ra giờ trong biến date & time, theo định dạng 12-giờ.

tM
 
In ra phút trong biến date & time, bao gồm 2 số, cả số 0 nếu thiết yếu.

Tp
 
In ra date & time dưới dạng am/pm (chữ thường).

tm
 
In ra tháng của biến date & time, gồm 2 số, cả số 0 nếu thiết yếu.

tD
 
In ra ngày của biến date & time như định dạng %tmphần trămtdphần trămty

 
08
Chỉ định chiều rộng là 8 ký tự, bao gồm cả số 0 nếu thiết yếu.

 
+
In ra ký tự +.

 
,
Nhóm các số bằng dấu ‘,’ thay vì ‘.’, chẳng hạn 10,000,900 thay vì 10.000.900 .

 

Căn trái.

 
.3
Ba số sau dấu thập phân.

 
10.3
Rộng 10 ký tự, căn phải, với 3 số sau dấu thập phân.

Bài kế tiếp:

Serialization trong java

Viết một bình luận