Thứ Năm, 28 tháng 3, 2019

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 của chương trình bị gián đoạn và chương trình / Ứng dụng chấm dứt bất thường, do đó không được khuyến nghị, do đó, các ngoại lệ này sẽ được xử lý.

Một ngoại lệ có thể xảy ra vì nhiều lý do khác nhau. Sau đây là một số tình huống trong đó một ngoại lệ xảy ra.

Học lập trình Java chuyên nghiệp
Học lập trình Java chuyên nghiệp

Một người dùng đã nhập dữ liệu không hợp lệ.

Một tập tin cần phải được mở không thể được tìm thấy.

Một kết nối mạng đã bị mất ở giữa các liên lạc hoặc JVM đã hết bộ nhớ.

Một số ngoại lệ này là do lỗi người dùng, một số khác là do lỗi lập trình viên và một số khác là do tài nguyên vật lý đã bị lỗi theo một cách nào đó.

>> Dựa trên những điều này, chúng tôi có ba loại Ngoại lệ. Bạn cần hiểu chúng để biết cách xử lý ngoại lệ hoạt động trong lập trình Java <<

Các ngoại lệ được kiểm tra - Một ngoại lệ được kiểm tra là một ngoại lệ được kiểm tra (thông báo) bởi trình biên dịch tại thời gian biên dịch, chúng cũng được gọi là ngoại lệ thời gian biên dịch. Những ngoại lệ này không thể đơn giản bỏ qua, lập trình viên nên quan tâm (xử lý) những ngoại lệ này.

C:\>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
      FileReader fr = new FileReader(file);
                      ^
1 error

Các ngoại lệ không được kiểm tra - Một ngoại lệ không được kiểm tra là một ngoại lệ xảy ra tại thời điểm thực hiện. Chúng cũng được gọi là Ngoại lệ Thời gian chạy .

Chúng bao gồm các lỗi lập trình, chẳng hạn như lỗi logic hoặc sử dụng API không đúng cách. Ngoại lệ thời gian chạy được bỏ qua tại thời điểm biên dịch.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
 at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)

Lỗi - Đây hoàn toàn không phải là ngoại lệ, mà là những vấn đề phát sinh ngoài tầm kiểm soát của người dùng hoặc lập trình viên.

Lỗi thường bị bỏ qua trong mã của bạn vì bạn hiếm khi có thể làm bất cứ điều gì về lỗi. Ví dụ: nếu xảy ra tràn ngăn xếp, sẽ xảy ra lỗi. Chúng cũng bị bỏ qua tại thời điểm biên dịch.

Phân cấp ngoại lệ


Tất cả các lớp ngoại lệ là các kiểu con của lớp java.lang.Exception. Lớp ngoại lệ là một lớp con của lớp Ném được. Khác với lớp ngoại lệ, còn có một lớp con khác gọi là Lỗi xuất phát từ lớp Ném được.

Lỗi là các điều kiện bất thường xảy ra trong trường hợp thất bại nghiêm trọng, chúng không được xử lý bởi các chương trình Java. Lỗi được tạo để chỉ ra lỗi được tạo bởi môi trường thời gian chạy. Ví dụ: JVM hết bộ nhớ. Thông thường, các chương trình không thể phục hồi từ các lỗi.

Lớp Exception có hai lớp con chính: lớp IOException và lớp RuntimeException.

Sau đây là danh sách các Ngoại lệ tích hợp sẵn được kiểm tra và không được kiểm tra phổ biến nhất của Java .

Phương pháp ngoại lệ


Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp Ném được.
Sr.Không.Phương pháp & Mô tả
1chuỗi công khai getMessage ()

Trả về một thông điệp chi tiết về ngoại lệ đã xảy ra. Thông báo này được khởi tạo trong hàm tạo có thể ném được.
2công khai Có thể ném được Nguyên nhân ()

Trả về nguyên nhân của ngoại lệ như được đại diện bởi một đối tượng Ném được.
3chuỗi công khai toString ()
Trả về tên của lớp được nối với kết quả của getMessage ().
4công khai void printStackTrace ()

In kết quả của toString () cùng với dấu vết ngăn xếp sang System.err, luồng đầu ra lỗi.
5công khai StackTraceEuity [] getStackTrace ()

Trả về một mảng chứa mỗi phần tử trên dấu vết ngăn xếp. Phần tử tại chỉ mục 0 đại diện cho đỉnh của ngăn xếp cuộc gọi và phần tử cuối cùng trong mảng biểu thị phương thức ở dưới cùng của ngăn xếp cuộc gọi.
6công khai FillableStInTrackTrace ()

Điền vào dấu vết ngăn xếp của đối tượng Có thể ném này bằng dấu vết ngăn xếp hiện tại, thêm vào bất kỳ thông tin nào trước đó trong theo dõi ngăn xếp.

Bắt ngoại lệ

Một phương thức bắt một ngoại lệ bằng cách sử dụng kết hợp các từ khóa thửvà bắt . Một khối thử / bắt được đặt xung quanh mã có thể tạo ra ngoại lệ.

Mã trong khối try / Catch được gọi là mã được bảo vệ và cú pháp sử dụng try / Catch trông giống như sau


try {
   // Protected code
} catch (ExceptionName e1) {
   // Catch block
}

Mã có xu hướng ngoại lệ được đặt trong khối thử. Khi một ngoại lệ xảy ra, ngoại lệ đó xảy ra được xử lý bởi khối bắt liên kết với nó. Mỗi khối thử phải được theo dõi ngay lập tức bằng khối bắt hoặc khối cuối cùng.

Một tuyên bố bắt liên quan đến việc khai báo loại ngoại lệ bạn đang cố gắng nắm bắt. Nếu một ngoại lệ xảy ra trong mã được bảo vệ, khối bắt (hoặc khối) theo sau thử được kiểm tra. 

Nếu loại ngoại lệ xảy ra được liệt kê trong khối bắt, ngoại lệ được truyền cho khối bắt nhiều vì một đối số được truyền vào tham số phương thức.
Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

Nhiều khối bắt

Một khối thử có thể được theo sau bởi nhiều khối bắt. Cú pháp cho nhiều khối bắt giống như sau

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}

Các báo cáo trước đây cho thấy ba khối bắt, nhưng bạn có thể có bất kỳ số nào trong số chúng sau một lần thử. 

Nếu một ngoại lệ xảy ra trong mã được bảo vệ, ngoại lệ được ném vào khối bắt đầu tiên trong danh sách. Nếu kiểu dữ liệu của ngoại lệ được ném khớp với ExceptionType1, nó sẽ bị bắt ở đó. Nếu không, ngoại lệ chuyển xuống câu lệnh bắt thứ hai.

Điều này tiếp tục cho đến khi ngoại lệ bị bắt hoặc rơi qua tất cả các lần bắt, trong trường hợp đó phương thức hiện tại dừng thực thi và ngoại lệ được ném xuống phương thức trước đó trong ngăn xếp cuộc gọi.

Bắt nhiều loại ngoại lệ


Kể từ Java 7, bạn có thể xử lý nhiều hơn một ngoại lệ bằng một khối bắt đơn, tính năng này giúp đơn giản hóa mã. Đây là cách bạn sẽ làm điều đó

catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;

Từ khóa ném / ném

Nếu một phương thức không xử lý một ngoại lệ được kiểm tra, phương thức đó phải khai báo nó bằng cách sử dụng từ khóa ném . Từ khóa ném xuất hiện ở cuối chữ ký của phương thức.

Bạn có thể ném một ngoại lệ, một ngoại lệ mới được khởi tạo hoặc một ngoại lệ mà bạn vừa bắt được, bằng cách sử dụng từ khóa throw .

Cố gắng hiểu sự khác biệt giữa ném và ném từ khóa, ném được sử dụng để trì hoãn việc xử lý một ngoại lệ được kiểm tra và ném được sử dụng để gọi một ngoại lệ một cách rõ ràng.

Phương thức sau đây tuyên bố rằng nó ném RemoteException
import java.io.*;
public class className {

   public void deposit(double amount) throws RemoteException {
      // Method implementation
      throw new RemoteException();
   }
   // Remainder of class definition
}
Một phương thức có thể tuyên bố rằng nó ném nhiều hơn một ngoại lệ, trong trường hợp đó, các ngoại lệ được khai báo trong một danh sách được phân tách bằng dấu phẩy.

Ví dụ: phương thức sau đây tuyên bố rằng nó ném RemoteException và Insu enoughFundsException
import java.io.*;
public class className {

   public void withdraw(double amount) throws RemoteException, 
      InsufficientFundsException {
      // Method implementation
   }
   // Remainder of class definition
}

Khối cuối cùng

Khối cuối cùng theo sau một khối thử hoặc một khối bắt. Một khối mã cuối cùng luôn luôn thực thi, bất kể sự xuất hiện của Ngoại lệ.

Sử dụng một khối cuối cùng cho phép bạn chạy bất kỳ câu lệnh loại dọn dẹp nào mà bạn muốn thực thi, bất kể điều gì xảy ra trong mã được bảo vệ.

Một khối cuối cùng xuất hiện ở cuối các khối bắt và có cú pháp sau

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

Lưu ý những điều sau

Một mệnh đề bắt không thể tồn tại mà không có câu lệnh try.

Không bắt buộc phải có các mệnh đề cuối cùng bất cứ khi nào có khối thử / bắt.

Khối thử không thể có mặt mà không có mệnh đề bắt hoặc mệnh đề cuối cùng.

Bất kỳ mã nào cũng không thể xuất hiện ở giữa các khối thử, bắt, cuối cùng.

Các tài nguyên thử


Nói chung, khi chúng tôi sử dụng bất kỳ tài nguyên nào như luồng, kết nối, v.v., chúng tôi phải đóng chúng một cách rõ ràng bằng cách sử dụng khối cuối cùng. Trong chương trình sau, chúng tôi đang đọc dữ liệu từ một tệp bằng FileReader và chúng tôi sẽ đóng nó bằng cách sử dụng khối cuối cùng.

try-with-resource , còn được gọi là quản lý tài nguyên tự động , là một cơ chế xử lý ngoại lệ mới được giới thiệu trong Java 7, tự động đóng các tài nguyên được sử dụng trong khối thử bắt.

Để sử dụng câu lệnh này, bạn chỉ cần khai báo các tài nguyên cần thiết trong ngoặc đơn và tài nguyên đã tạo sẽ được đóng tự động ở cuối khối. Sau đây là cú pháp của câu lệnh try-with-resource.
import java.io.FileReader;
import java.io.IOException;

public class Try_withDemo {

   public static void main(String args[]) {
      try(FileReader fr = new FileReader("E://file.txt")) {
         char [] a = new char[50];
         fr.read(a);   // reads the contentto the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
Những điểm sau đây cần được ghi nhớ trong khi làm việc với tuyên bố thử tài nguyên.

Để sử dụng một lớp với câu lệnh try-with-resource, nó nên triển khai giao diện AutoClosizable và phương thức close () của nó được gọi tự động khi chạy.

Bạn có thể khai báo nhiều hơn một lớp trong câu lệnh try-with-resource.

Trong khi bạn khai báo nhiều lớp trong khối thử của câu lệnh try-with-resource, các lớp này được đóng theo thứ tự ngược lại.

Ngoại trừ việc khai báo tài nguyên trong ngoặc đơn, mọi thứ đều giống như khối thử / bắt thông thường của khối thử.

Tài nguyên được khai báo trong try được khởi tạo ngay trước khi bắt đầu khối thử.

Tài nguyên được khai báo tại khối thử được khai báo ngầm là cuối cùng.

Ngoại lệ do người dùng xác định

Bạn có thể tạo các ngoại lệ của riêng bạn trong Java. Hãy ghi nhớ các điểm sau đây khi viết các lớp ngoại lệ của riêng bạn

Tất cả các ngoại lệ phải là một đứa trẻ của Ném.

Nếu bạn muốn viết một ngoại lệ được kiểm tra được thực thi tự động bởi Quy tắc Xử lý hoặc Khai báo, bạn cần mở rộng lớp Ngoại lệ.

Nếu bạn muốn viết một ngoại lệ thời gian chạy, bạn cần mở rộng lớp RuntimeException.

Chúng ta có thể định nghĩa lớp Exception của riêng mình như dưới đây

class MyException extends Exception {
}

Bạn chỉ cần mở rộng lớp Exception được xác định trước để tạo Exception của riêng bạn. Đây được coi là ngoại lệ được kiểm tra.

Lớp Insu enoughFundsException sau đây là một ngoại lệ do người dùng định nghĩa mở rộng lớp Exception, làm cho nó trở thành một ngoại lệ được kiểm tra.

Một lớp ngoại lệ giống như bất kỳ lớp nào khác, chứa các trường và phương thức hữu ích.

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
         at CheckingAccount.withdraw(CheckingAccount.java:25)
         at BankDemo.main(BankDemo.java:13)

Trường hợp ngoại lệ phổ biến

Trong Java, có thể định nghĩa hai nguồn cung cấp Ngoại lệ và Lỗi.

Các ngoại lệ JVM - Đây là các ngoại lệ / lỗi được JVM độc quyền hoặc logic. Ví dụ: NullPulumException, ArrayIndexOutOfBoundException, ClassCastException.

Các ngoại lệ lập trình - Các ngoại lệ này được các ứng dụng hoặc lập trình viên API ném ra một cách rõ ràng. Ví dụ: IllegalArgumentException, IllegalStateException.

Thứ Ba, 19 tháng 3, 2019

Học lập trình Java - 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


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

Học lập trình Java chuyên nghiệp
Học lập trình Java chuyên nghiệp

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.

>> 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ữ lập trình 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 int (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.
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ó đối tượng OutputStream trong tay, 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.
3
cô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

Một thư mục là một Tệp có thể chứa một 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 ý - 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 () đượ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
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

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

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...