Thứ Tư, 22 tháng 8, 2018

Java - Tệp và I / O

Gói lập trình 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 nguồn đầu vào và đí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

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.

lập trình java

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 luồng và I / O. Chúng ta sẽ thấy các ví dụ thường được sử dụng nhất từng cái một -

Byte Streams

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 các luồng byte nhưng các lớp được sử dụng thường xuyên nhất là FileInputStream và FileOutputStream. Sau đây là một ví dụ sử dụng hai lớp này để sao chép tệp đầu vào vào tệp đầu ra

Thí dụ
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 với cùng nội dung như chúng ta có trong tệp input.txt. Vì vậy, hãy đặt đoạn mã trên vào tệp CopyFile.java và làm như sau:

$javac CopyFile.java
$java CopyFile

Luồng ký tự

Các luồng Java Byte đượ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 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ù FileReader nội bộ sử dụng FileInputStream và FileWriter sử dụng FileOutputStream nhưng ở đây sự khác biệt lớn là FileReader đọc hai byte tại một thời điểm và FileWriter viết hai byte tại một thời điểm.

Chúng ta có thể viết lại ví dụ trên, làm cho việc 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

Thí dụ
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 với cùng nội dung như chúng ta có trong tệp input.txt. Vì vậy, hãy đặt đoạn mã trên vào tệp CopyFile.java và làm như sau:

$javac CopyFile.java
$java CopyFile

Luồng chuẩn

Tất cả các ngôn ngữ lập trình đều hỗ trợ 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 ra đầu ra trên màn hình máy tính. Nếu bạn biết các ngôn ngữ lập trình C hoặc C ++, thì bạn phải biết ba thiết bị chuẩn STDIN, STDOUT và STDERR. Tương tự, Java cung cấp ba luồng tiêu chuẩn sau đây -

Đầu vào chuẩn - Dữ liệu này được sử dụng để nạp dữ liệu vào chương trình của người dùng và thường bàn phím được sử dụng làm luồng đầu vào chuẩn và được biểu diễn 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 là 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 diễn dưới dạng System.out .

Standard Error - Lỗi 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 là màn hình máy tính được sử dụng cho luồng lỗi chuẩn và được biểu diễn dưới dạng System.err .

Sau đây là một chương trình đơn giản, tạo ra InputStreamReader để đọc luồng đầu vào tiêu chuẩn cho đến khi người dùng gõ "q"

Thí dụ Bản thử trực tiếp
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ữ mã trên trong tệp ReadConsole.java và cố gắng biên dịch và thực thi nó như được hiển thị trong chương trình sau đây. Chương trình này tiếp tục đọc và xuất ra 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ư đã 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.

Đây là một hệ thống phân cấp của các lớp để xử lý các luồng đầu vào và đầu ra.

lập trình java

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

FileInputStrea

Luồng này được sử dụng để đọc dữ liệu từ các tệp. 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 sẵn có.

Sau hàm tạo có tên tệp dưới dạng chuỗi để tạo đối tượng luồng đầu vào để đọc tệp

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

Sau constructor có một đối tượng tập tin để tạo ra một đối tượng dòng đầu vào để đọc các tập tin. Đầu tiên chúng ta tạo một đối tượng tập tin bằng phương thức File () như sau:

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

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

Sr.No.Phương thức & Mô tả
1public 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 nào được liên kết với tệp. Ném một IOException.
2bảo vệ void finalize () ném IOException {}

Phương pháp này dọn dẹp kết nối với tệp. Đả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.
3int công khai đọ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 nó là phần cuối của tệp.
4đọc int công cộng (byte [] r) ném IOException {}

Phương thức này đọc r.length byte từ luồng đầu vào vào một mảng. Trả về tổng số byte đã đọc. Nếu nó là kết thúc của tập tin, -1 sẽ được trả lại.
5public int available () ném IOException {}

Cung cấp số byte có thể đọc từ luồng đầu vào của tệp này. Trả về một int.
Có sẵn các luồng đầu vào quan trọng khác, để 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ó chưa tồn tại, trước khi mở nó cho đầu ra.

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

Sau hàm tạo có tên tệp dưới dạng chuỗi để tạo đối tượng luồng đầu vào để ghi tệp

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

Sau constructor có một đối tượng tập tin để tạo ra một đối tượng dòng đầu ra để ghi các tập tin. Đầ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);

Một khi bạn có đối tượng OutputStream trong tay, thì có một danh sách các phương thức 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.No.Phương thức & Mô tả
1public 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 nào được liên kết với tệp. Ném một IOException.
2bảo vệ void finalize () ném IOException {}

Phương pháp này dọn dẹp kết nối với tệp. Đả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.
3
công khai void write (int w) ném IOException {}

Phương thức này ghi byte được chỉ định cho luồng đầu ra.
4công khai void write (byte [] w)

Viết w.length byte từ mảng byte đã đề cập đến OutputStream.
Có sẵn các luồng đầu ra quan trọng khác, để 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ẽ viết các số đã cho ở định dạng nhị phân. Tương tự sẽ là đầu ra trên màn hình stdout.

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

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

Lớp tệp

Lớp FileReader

Lớp FileWriter

Các 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 File để tạo các 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ì có liên quan đến các thư mục.

Tạo thư mục

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

Phương thức mkdir () tạo một thư mục, trả về true thành công và sai về lỗ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 bậc cha mẹ của thư mục.

Ví dụ sau tạo thư mục "/ tmp / user / java / bin"

Thí dụ
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 đoạn mã trên để tạo "/ tmp / user / java / bin".

Lưu ý - Java tự động quản lý các dấu phân cá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 chuyển tiếp (/) trên phiên bản Java của Windows, đường dẫn sẽ vẫn giải quyết chính xác.

Thư mục danh sách

Bạn có thể sử dụng phương thức list () được cung cấp bởi đối tượng File để 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:

Thí dụ
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...