Thứ Hai, 24 tháng 12, 2018

lập trình Java - Tệp và I / O

Gói java.io chứa gần như mọi lớp bạn có thể cần để thực hiện đầu vào và đầu ra (I / O) trong Java. Tất cả các luồng này đại diện cho một nguồn đầu vào và một đích đầu ra. 

Luồng trong gói java.io hỗ trợ nhiều dữ liệu như nguyên thủy, đối tượng, ký tự được bản địa hóa, v.v.

Suối

Khóa học lập trình Java
Khóa học lập trình Java

Một luồng có thể được định nghĩa là một chuỗi dữ liệu. Có hai loại Luồng

InPutStream - InputStream được sử dụng để đọc dữ liệu từ một nguồn.

OutPutStream - OutputStream được sử dụng để ghi dữ liệu đến đích.

Khóa học lập trình Java cung cấp hỗ trợ mạnh mẽ nhưng linh hoạt cho I / O liên quan đến các tệp và mạng nhưng hướng dẫn này bao gồm các chức năng rất cơ bản liên quan đến các luồng và I / O. Chúng ta sẽ thấy các ví dụ được sử dụng phổ biến nhất từng cái một

Luồng Byte


Các luồng byte Java được sử dụng để thực hiện đầu vào và đầu ra của các byte 8 bit. Mặc dù có nhiều lớp liên quan đến luồng byte nhưng các lớp được sử dụng thường xuyên nhất là FileInputStream và FileOutputStream . Dưới đây là một ví dụ sử dụng hai lớp này để sao chép tệp đầu vào thành tệp đầu ra
import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {  
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream("input.txt");
         out = new FileOutputStream("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}
Bây giờ chúng ta hãy có một tệp input.txt với nội dung sau

This is test for copy file.

Bước tiếp theo, biên dịch chương trình trên và thực hiện nó, điều này sẽ dẫn đến việc tạo tệp output.txt có cùng nội dung như chúng ta có trong input.txt. Vì vậy, hãy đặt mã trên vào tệp CopyFile.java và làm như sau

$javac CopyFile.java
$java CopyFile

Luồng nhân vật

Các luồng Byte Java được sử dụng để thực hiện đầu vào và đầu ra của các byte 8 bit, trong khi các luồng Ký tự Java được sử dụng để thực hiện đầu vào và đầu ra cho unicode 16 bit. 

Mặc dù có nhiều lớp liên quan đến các luồng ký tự nhưng các lớp được sử dụng thường xuyên nhất là FileReader và FileWriter . 

Mặc dù bên trong FileReader sử dụng FileInputStream và FileWriter sử dụng FileOutputStream nhưng ở đây, điểm khác biệt chính là FileReader đọc hai byte cùng một lúc và FileWriter ghi hai byte mỗi lần.

Chúng ta có thể viết lại ví dụ trên, điều này sử dụng hai lớp này để sao chép một tệp đầu vào (có các ký tự unicode) vào một tệp đầu ra
import java.io.*;
public class CopyFile {

   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 c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}
Bây giờ chúng ta hãy có một tệp input.txt với nội dung sau

This is test for copy file.

Bước tiếp theo, biên dịch chương trình trên và thực hiện nó, điều này sẽ dẫn đến việc tạo tệp output.txt có cùng nội dung như chúng ta có trong input.txt. Vì vậy, hãy đặt mã trên vào tệp CopyFile.java và làm như sau

$javac CopyFile.java
$java CopyFile

Luồng tiêu chuẩn

Tất cả các ngôn ngữ Khóa học lập trình Java  cung cấp hỗ trợ cho I / O tiêu chuẩn nơi chương trình của người dùng có thể lấy đầu vào từ bàn phím và sau đó tạo đầu ra trên màn hình máy tính. Nếu bạn biết về ngôn ngữ lập trình C hoặc C ++, thì bạn phải biết về ba thiết bị tiêu chuẩn STDIN, STDOUT và STDERR. Tương tự, Java cung cấp ba luồng tiêu chuẩn sau

Đầu vào tiêu chuẩn - Điều này được sử dụng để cung cấp dữ liệu cho chương trình của người dùng và thông thường bàn phím được sử dụng làm luồng đầu vào tiêu chuẩn và được biểu thị dưới dạng System.in .

Đầu ra tiêu chuẩn - Điều này được sử dụng để xuất dữ liệu do chương trình của người dùng tạo ra và thông thường màn hình máy tính được sử dụng cho luồng đầu ra tiêu chuẩn và được biểu thị là System.out .

Lỗi tiêu chuẩn - Điều này được sử dụng để xuất dữ liệu lỗi do chương trình của người dùng tạo ra và thông thường màn hình máy tính được sử dụng cho luồng lỗi tiêu chuẩn và được biểu thị là System.err .

Sau đây là một chương trình đơn giản, tạo InputStreamReader để đọc luồng đầu vào tiêu chuẩn cho đến khi người dùng nhập "q"
import java.io.*;
public class ReadConsole {

   public static void main(String args[]) throws IOException {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println("Enter characters, 'q' to quit.");
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}
Hãy giữ đoạn mã trên trong tệp ReadConsole.java và thử biên dịch và thực thi nó như trong chương trình sau. Chương trình này tiếp tục đọc và xuất cùng một ký tự cho đến khi chúng ta nhấn 'q'

$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q

Đọc và viết tập tin


Như được mô tả trước đó, một luồng có thể được định nghĩa là một chuỗi dữ liệu. Các InputStream được sử dụng để đọc dữ liệu từ một nguồn và OutputStream được sử dụng để viết dữ liệu đến một đích.

Dưới đây là hệ thống phân cấp các lớp để xử lý các luồng Đầu vào và Đầu ra.

Hai luồng quan trọng là FileInputStream và FileOutputStream , sẽ được thảo luận trong hướng dẫn này.

FileInputStream

Luồng này được sử dụng để đọc dữ liệu từ các tập tin. Các đối tượng có thể được tạo bằng cách sử dụng từ khóa mới và có một số loại hàm tạo có sẵn.

Trình xây dựng sau lấy tên tệp làm chuỗi để tạo đối tượng luồng đầu vào để đọc tệp

InputStream f = new FileInputStream("C:/java/hello");

Trình xây dựng sau lấy một đối tượng tệp để tạo một đối tượng luồng đầu vào để đọc tệp. Đầu tiên chúng ta tạo một đối tượng tệp bằng phương thức File () như sau

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

Khi bạn có đối tượng InputStream trong tay, sau đó có một danh sách các phương thức trợ giúp có thể được sử dụng để đọc để truyền phát hoặc thực hiện các hoạt động khác trên luồng.

Sr.Không.Phương pháp & Mô tả
1công khai void close () ném IOException {}

Phương pháp này đóng luồng đầu ra của tệp. Phát hành bất kỳ tài nguyên hệ thống liên quan đến các tập tin. Ném một IOException.
2được bảo vệ void Finalize () ném IOException {}
Phương pháp này làm sạch kết nối đến tập tin. Đảm bảo rằng phương thức đóng của luồng đầu ra tệp này được gọi khi không có thêm tham chiếu đến luồng này. Ném một IOException.
3công khai int đọc (int r) ném IOException {}

Phương thức này đọc byte dữ liệu được chỉ định từ InputStream. Trả về một int. Trả về byte dữ liệu tiếp theo và -1 sẽ được trả về nếu đó là phần cuối của tệp.
4public int read (byte [] r) ném IOException {}

Phương thức này đọc các byte r.length từ luồng đầu vào thành một mảng. Trả về tổng số byte đã đọc. Nếu nó là phần cuối của tệp, -1 sẽ được trả về.
5công khai int có sẵn () ném IOException {}
Cung cấp số lượng byte có thể được đọc từ luồng đầu vào tệp này. Trả về một int.
Khóa học lập trình Java Có các luồng đầu vào quan trọng khác có sẵn, để biết thêm chi tiết, bạn có thể tham khảo các liên kết sau

ByteArrayInputStream

DataInputStream

FileOutputStream

FileOutputStream được sử dụng để tạo một tệp và ghi dữ liệu vào đó. Luồng sẽ tạo một tệp, nếu nó không tồn tại, trước khi mở nó cho đầu ra.

Đây là hai hàm tạo có thể được sử dụng để tạo đối tượng FileOutputStream.

Trình xây dựng sau lấy tên tệp làm chuỗi để tạo đối tượng luồng đầu vào để ghi tệp

OutputStream f = new FileOutputStream("C:/java/hello") 

Trình xây dựng sau lấy một đối tượng tệp để tạo một đối tượng luồng đầu ra để ghi tệp. Đầu tiên, chúng ta tạo một đối tượng tệp bằng phương thức File () như sau

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

Khi bạn có trong tay đối tượng OutputStream , sau đó có một danh sách các phương thức của trình trợ giúp, có thể được sử dụng để ghi vào luồng hoặc thực hiện các hoạt động khác trên luồng.

Sr.Không.Phương pháp & Mô tả
1công khai void close () ném IOException {}

Phương pháp này đóng luồng đầu ra của tệp. Phát hành bất kỳ tài nguyên hệ thống liên quan đến các tập tin. Ném một IOException.
2được bảo vệ void Finalize () ném IOException {}

Phương pháp này làm sạch kết nối đến tập tin. Đảm bảo rằng phương thức đóng của luồng đầu ra tệp này được gọi khi không có thêm tham chiếu đến luồng này. Ném một IOException.
3công khai void write (int w) ném IOException {}
Phương thức này ghi byte được chỉ định vào luồng đầu ra.
4công khai void write (byte [] w)

Viết các byte w.length từ mảng byte được đề cập đến OutputStream.
Có các luồng đầu ra quan trọng khác có sẵn, để biết thêm chi tiết, bạn có thể tham khảo các liên kết sau

ByteArrayOutputStream

DataOutputStream

Thí dụ

Sau đây là ví dụ để chứng minh InputStream và OutputStream
import java.io.*;
public class fileStreamTest {

   public static void main(String args[]) {
   
      try {
         byte bWrite [] = {11,21,3,40,5};
         OutputStream os = new FileOutputStream("test.txt");
         for(int x = 0; x < bWrite.length ; x++) {
            os.write( bWrite[x] );   // writes the bytes
         }
         os.close();
     
         InputStream is = new FileInputStream("test.txt");
         int size = is.available();

         for(int i = 0; i < size; i++) {
            System.out.print((char)is.read() + "  ");
         }
         is.close();
      } catch (IOException e) {
         System.out.print("Exception");
      } 
   }
}
Đoạn mã trên sẽ tạo tệp test.txt và sẽ ghi các số đã cho ở định dạng nhị phân. Tương tự sẽ là đầu ra trên màn hình xuất chuẩn.

Điều hướng tệp và I / O


Có một số lớp khác mà chúng ta sẽ trải qua để tìm hiểu những điều cơ bản về Điều hướng tệp và I / O.

Lớp tập tin

Lớp FileReader

Lớp FileWriter

Thư mục trong Java


Thư mục là một Tệp có thể chứa danh sách các tệp và thư mục khác. Bạn sử dụng đối tượng Tệp để tạo thư mục, để liệt kê các tệp có sẵn trong một thư mục. Để biết chi tiết đầy đủ, hãy kiểm tra danh sách tất cả các phương thức mà bạn có thể gọi trên đối tượng Tệp và những gì liên quan đến thư mục.

Tạo thư mục

Có hai phương thức tiện ích Tệp hữu ích, có thể được sử dụng để tạo thư mục

Phương thức mkdir () tạo một thư mục, trả về true khi thành công và false khi thất bại. Thất bại chỉ ra rằng đường dẫn được chỉ định trong đối tượng Tệp đã tồn tại hoặc thư mục không thể được tạo vì toàn bộ đường dẫn chưa tồn tại.

Phương thức mkdirs () tạo cả thư mục và tất cả các cha mẹ của thư mục.

Ví dụ sau đây tạo thư mục "/ tmp / user / java / bin"
import java.io.File;
public class CreateDir {

   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);
      
      // Create directory now.
      d.mkdirs();
   }
}
Biên dịch và thực thi mã trên để tạo "/ tmp / user / java / bin".

Lưu ý - Khóa học lập trình Java tự động chăm sóc các trình phân tách đường dẫn trên UNIX và Windows theo các quy ước. Nếu bạn sử dụng dấu gạch chéo (/) trên phiên bản Java của Windows, đường dẫn vẫn sẽ giải quyết chính xác.

Danh sách thư mục


Bạn có thể sử dụng phương thức list () do đối tượng File cung cấp để liệt kê tất cả các tệp và thư mục có sẵn trong một thư mục như sau
import java.io.File;
public class ReadDir {

   public static void main(String[] args) {
      File file = null;
      String[] paths;
  
      try {      
         // create new file object
         file = new File("/tmp");

         // array of files and directory
         paths = file.list();

         // for each name in the path array
         for(String path:paths) {
            // prints filename and directory name
            System.out.println(path);
         }
      } catch (Exception e) {
         // if any error occurs
         e.printStackTrace();
      }
   }
}
Điều này sẽ tạo ra kết quả sau dựa trên các thư mục và tệp có sẵn trong thư mục / tmp của bạn

Đầu ra

test1.txt
test2.txt
ReadDir.java
ReadDir.class

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...