sách gpt4 ăn đã đi

Tóm tắt các luồng IO trong Java (được khuyến nghị)

In lại Tác giả: qq735679552 Thời gian cập nhật: 29-09-2022 22:32:09 42 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết blog CFSDN Tóm tắt về IO Flow trong Java (Được khuyến nghị) này được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.

Giới thiệu vào/ra

I/O là tên viết tắt của Đầu vào/đầu ra. Trong Java, dữ liệu đầu vào và đầu ra được thực hiện theo cách truyền phát. Các lớp và giao diện "luồng" khác nhau được cung cấp trong gói java.io để thu được các loại dữ liệu và dữ liệu đầu vào hoặc đầu ra khác nhau thông qua các phương thức tiêu chuẩn. .

Đầu vào và đầu ra đều dựa trên bộ nhớ. Đầu vào: Đọc dữ liệu ngoài (dữ liệu từ các thiết bị lưu trữ như đĩa, đĩa quang) vào chương trình (bộ nhớ). Đầu ra: Đầu ra: Xuất dữ liệu chương trình (bộ nhớ) tới các thiết bị lưu trữ như đĩa, đĩa quang.

Phân loại dòng chảy.

Theo các đơn vị dữ liệu vận hành khác nhau, nó được chia thành: luồng byte (8 bit) và luồng ký tự (16 bit).

Theo các hướng luồng khác nhau của luồng dữ liệu, nó được chia thành: luồng đầu vào và luồng đầu ra.

Theo vai trò khác nhau của luồng, nó được chia thành: luồng nút và luồng xử lý.

Truyền phát nút: Đọc và ghi dữ liệu trực tiếp từ nguồn hoặc đích dữ liệu. .

Luồng xử lý: Nó không được kết nối trực tiếp với nguồn hoặc đích dữ liệu mà được "kết nối" với luồng hiện có (luồng nút hoặc luồng xử lý) để cung cấp cho chương trình các chức năng đọc và ghi mạnh mẽ hơn bằng cách xử lý dữ liệu. Nó tương đương với bao bì thứ cấp.

lớp cơ sở trừu tượng luồng byte luồng ký tự
luồng đầu vào Dòng đầu vào Người đọc
luồng đầu ra Dòng đầu ra Nhà văn

Luồng IO của Java bao gồm tổng cộng hơn 40 lớp, thực tế là rất đều đặn và bắt nguồn từ bốn lớp cơ sở trừu tượng này. Tên lớp con bắt nguồn từ bốn lớp này có tên lớp cha là hậu tố của tên lớp con.

Các API phổ biến cho luồng byte và luồng ký tự

Dòng đầu vào 。

  • int read(): Đọc byte dữ liệu tiếp theo từ luồng đầu vào. Trả về giá trị byte int trong phạm vi từ 0 đến 255. Nếu kết thúc luồng được đọc, -1 sẽ được trả về. cái nàyPhương thức này chỉ đọc một byte mỗi lần, điều này quá kém hiệu quả và thường không được sử dụng.
  • int read(byte[] b): Lưu tối đa b.length byte dữ liệu từ luồng đầu vào này vào một mảng byte. Trả về độ dài thực tế của byte đã đọc hoặc -1 nếu cuối luồng được đọc.
  • int read(byte[] b,int off,int len): Đọc tối đa len byte dữ liệu trong luồng đầu vào thành một mảng byte. nếmCố gắng đọc len byte, nhưng số byte đọc được có thể nhỏ hơn giá trị này., ví dụ: nếu nội dung có độ dài 23 byte được đọc mỗi lần 5 byte thì luồng được đọc lần thứ năm không ở cuối và độ dài còn lại là 3, do đó trả về 3. Nếu lần đọc thứ sáu được coi là kết thúc, -1 sẽ được trả về. Phương pháp này thường được sử dụng.
  • public void close() ném IOException: Đóng luồng đầu vào này và giải phóng tất cả tài nguyên hệ thống được liên kết với luồng,Phải đóng cửa.

Người đọc 。

  • Reader tương tự như inputStream, ngoại trừ mảng byte được thay thế bằng mảng ký tự.
  • int read(); Hiệu ứng phù hợp với luồng byte
  • int read(char[] cbuf); Hiệu ứng phù hợp với luồng byte
  • int read(char[] cbuf,int off,int len); Hiệu ứng phù hợp với luồng byte
  • public void close() ném IOException đóng luồng đầu vào này và giải phóng tất cả tài nguyên hệ thống được liên kết với luồng,Luồng ký tự phải được đóng lại, nếu không sẽ xảy ra sự cố

Luồng đầu ra 。

  • void write(int b): Ghi các byte được chỉ định vào luồng đầu ra này.
  • void write(byte[] b): Ghi các byte b.length từ mảng byte đã chỉ định vào luồng đầu ra này.
  • void write(byte[] b,int off,int len): Ghi các byte len bắt đầu từ offset off trong mảng byte đã chỉ định vào luồng đầu ra này.
  • public void tuôn ra () ném IOException: Xóa luồng đầu ra này và buộc tất cả các byte đầu ra được đệm được ghi ra. Việc gọi phương thức này cho biết rằng các byte này phải được ghi ngay vào đích dự định của chúng. Đó là ghi tất cả các byte được đệm vào một mảng byte hoặc ký tự.
  • public void close() ném IOException: Đóng luồng đầu vào này và giải phóng tất cả tài nguyên hệ thống được liên kết với luồng

Nhà văn 。

  • void write(int c): Viết một ký tự đơn.
  • void write(char[] cbuf): Viết mảng ký tự.
  • void write(char[] cbuf,int off,int len): Viết một phần nhất định của mảng ký tự. Bắt đầu từ tắt, viết ký tự len
  • void write(String str): Viết một chuỗi.
  • void write(String str,int off,int len): Viết một phần nào đó của chuỗi.
  • void tuôn ra(): Xóa bộ đệm của luồng và ghi chúng vào đích dự định ngay lập tức.
  • public void close() ném IOException: Đóng luồng đầu vào này và giải phóng tất cả tài nguyên hệ thống được liên kết với luồng

Các hoạt động liên quan đến luồng ký tự byte

Đọc nội dung văn bản từ luồng byte

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Đọc nội dung file văn bản, sử dụng luồng byte để đọc, có thể bị cắt xén
     công cộng vô hiệu test1() {
         Dòng đầu vào Dòng đầu vào = vô giá trị ;
         thử {
             luồng đầu vào = mới Dòng đầu vào tệp "xin chào.txt" ); // Đường dẫn tương đối nằm dưới đường dẫn dự án
             số nguyên chỉ;
             byte [] byte = mới byte [ 5 ]; //Xác định một mảng byte có độ dài 5 byte
             trong khi ((len = inputStream.read(byte)) != - 1 ) { //Đọc dữ liệu vào mảng byte
                 Hệ thống.out.println( mới Chuỗi(byte, 0 , chỉ một)); //In ra bàn điều khiển
             }
         } nắm lấy (Ngoại lệ e) {
             e.printStackTrace();
         } Cuối cùng {
             thử {
                 nếu như (luồng đầu vào != vô giá trị ) {
                     inputStream. đóng();
                 }
             } nắm lấy (IOException e) {
                 e.printStackTrace();
             }
         }
     }

Luồng ký tự đọc nội dung văn bản

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Đọc nội dung file văn bản, sử dụng dòng ký tự để đọc, không cắt xén ký tự, lặp lại tối đa   
     công cộng vô hiệu test2() {
         Người đọc người đọc = vô giá trị ;
         thử {
             người đọc = mới Trình đọc tập tin( "xin chào.txt" );
             số nguyên chỉ;
             char [] charBuff = mới char [ 5 ];
             trong khi ((len = reader.read(charBuff)) != - 1 ) {
// System.out.println(new String(charBuff)); // Lưu ý sự khác biệt giữa hai dòng mã này
                 Hệ thống.out.println( mới Chuỗi(charBuff, 0 , chỉ một));
             }
         } nắm lấy (Ngoại lệ e) {
             e.printStackTrace();
         } Cuối cùng {
             thử {
                 nếu như (người đọc != vô giá trị ) {
                     reader. đóng();
                 }
             } nắm lấy (IOException e) {
                 e.printStackTrace();
             }
         }
     }

Đọc luồng byte từ tệp và xuất nó đến vị trí đã chỉ định

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
công cộng vô hiệu test3() {
         Dòng đầu vào Dòng đầu vào = vô giá trị ;
         Dòng đầu ra Dòng đầu ra = vô giá trị ;
         thử {
             luồng đầu vào = mới Dòng đầu vào tệp "xin chào.txt" ); // đọc tập tin
             đầu raStream = mới Dòng đầu ra của tệp( "hello2.txt" ); // Đường dẫn tương đối, mặc định là đường dẫn dự án
             số nguyên chỉ;
             byte [] byte = mới byte [ 5 ];
             trong khi ((len = inputStream.read(byte)) != - 1 ) {
                 outputStream.write(byte, 0 , chỉ một);
             }
         } nắm lấy (Ngoại lệ e) {
             e.printStackTrace();
         } Cuối cùng {
             thử {
                 nếu như (luồng đầu vào != vô giá trị ) {
                     inputStream. đóng();
                 }
                 nếu như (luồng đầu ra != vô giá trị ){
                     outputStream. đóng();
                 }
             } nắm lấy (IOException e) {
                 e.printStackTrace();
             }
         }
     }

Luồng ký tự đọc tệp và xuất nó đến vị trí đã chỉ định.

Khi luồng ký tự đọc tệp và xuất ra vị trí đã chỉ định, nếu luồng không được đóng theo cách thủ công, nó sẽ không được xuất ra vị trí đã chỉ định và yêu cầu xóa thủ công. Nhưng nếu luồng bị đóng trong khối cuối cùng, nó sẽ tự động bị xóa. Trong thao tác close(), nó sẽ giúp chúng ta tuôn ra.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
công cộng vô hiệu test4() {
         Người đọc người đọc = vô giá trị ;
         Nhà văn nhà văn = vô giá trị ;
         thử {
             người đọc = mới Trình đọc tập tin( "hello2.txt" );
             nhà văn = mới Người ghi tập tin( "hello3.txt" );
             số nguyên chỉ;
             char [] charBuff = mới char [ 5 ];
             trong khi ((len = reader.read(charBuff)) != - 1 ) {
                 người viết.write(charBuff, 0 , chỉ một);
// writer. flush();
             }
         } nắm lấy (Ngoại lệ e) {
             e.printStackTrace();
         } Cuối cùng {
             thử {
                 nếu như (người đọc != vô giá trị ) {
                     reader. đóng();
                 }
                 nếu như (người viết != vô giá trị ) { // Đảm bảo đóng luồng ký tự, nếu không bạn cần xóa thủ công
                     writer. đóng();
                 }
             } nắm lấy (IOException e) {
                 e.printStackTrace();
             }
         }
     }

Lưu ý rằng các luồng ký tự rất thuận tiện cho việc xử lý chuỗi và chỉ có thể hoạt động trên các tệp văn bản thông thường, chẳng hạn như mã nguồn bằng .txt, .java, .c, .cpp và các ngôn ngữ khác. Đặc biệt chú ý đến thực tế rằng .doc, excel và ppt không phải là các tệp văn bản. Luồng byte có thể hoạt động cả tệp văn bản và tệp byte, chẳng hạn như .mp3, .avi, .rmvb, mp4, .jpg, .doc và .ppt. Nếu bạn sử dụng luồng ký tự để vận hành các tệp byte như hình ảnh, thì các tệp được tạo sẽ không thể mở được! .

luồng đệm

Để cải thiện tốc độ đọc và ghi dữ liệu, API Java cung cấp các lớp luồng có chức năng đệm. Khi sử dụng các lớp luồng này, một mảng bộ đệm bên trong sẽ được tạo và bộ đệm 8192 byte (8Kb) được sử dụng theo mặc định.

Luồng được đệm phải được "ổ cắm" trên luồng nút tương ứng Theo đơn vị vận hành dữ liệu, luồng được đệm có thể được chia thành BufferedInputStream và BufferedOutputStream cũng như BufferedReader và BufferedWriter. Tương ứng với luồng bộ đệm byte và luồng bộ đệm ký tự tương ứng. Nó tương đương với việc gói các luồng byte và ký tự.

BufferedInputStream và BufferedOutputStream

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
công cộng vô hiệu Bài kiểm tra() {
         Dòng đầu vào Dòng đầu vào ;
         Dòng đầu ra Dòng đầu ra;
         Dòng đầu vào đệm bis = vô giá trị ;
         BufferedOutputStream bos = vô giá trị ;
         thử {
             luồng đầu vào = mới Dòng đầu vào tệp "sửa đổi.txt" ); // Dưới 8KB
             đầu raStream = mới Dòng đầu ra của tệp( "sửa đổi2.txt" );
             đến = mới BufferedInputStream(Luồng đầu vào);
             chủ = mới BufferedOutputStream(Luồng đầu ra);
             số nguyên chỉ;
             byte [] byte = mới byte [ 5 ];
             trong khi ((len = bis.read(byte)) != - 1 ) {
                 bos.write(byte, 0 , chỉ một);
             }
         } nắm lấy (Ngoại lệ e) {
             e.printStackTrace();
         } Cuối cùng {
             thử {
                 nếu như (cho đến khi != vô giá trị ) {
                     bis. đóng();
                 }
                 nếu như (bố ơi != vô giá trị ){
                     bos. đóng();
                 }
             } nắm lấy (IOException e) {
                 e.printStackTrace();
             }
         }
     }

BufferedReader và BufferedWriter

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
công cộng vô hiệu test2() {
         Người đọc người đọc ;
         Nhà văn nhà văn ;
         Bộ đệm đọc br = vô giá trị ;
         BufferedWriter bw = vô giá trị ;
         thử {
             người đọc = mới Trình đọc tập tin( "sửa đổi.txt" );
             nhà văn = mới Người ghi tập tin( "sửa đổi2.txt" );
             br = mới BufferedReader(trình đọc);
             bw = mới BufferedWriter(người viết);
             số nguyên chỉ;
             char [] byte = mới char [ 5 ];
             trong khi ((len = br.read(byte)) != - 1 ) {
                 bw.write(byte, 0 , chỉ một);
             }
         } nắm lấy (Ngoại lệ e) {
             e.printStackTrace();
         } Cuối cùng {
             thử {
                 nếu như (br != vô giá trị ) {
                     br. đóng();
                 }
                 nếu như (w != vô giá trị ){
                     bw. đóng();
                 }
             } nắm lấy (IOException e) {
                 e.printStackTrace();
             }
         }
     }

**Nếu luồng được lưu vào bộ đệm không được đóng theo cách thủ công và tệp đã đọc nhỏ hơn kích thước bộ nhớ đệm cơ bản là 8KB, nó sẽ không được tự động ghi vào mục tiêu và cần phải được xóa theo cách thủ công. **Khi đóng một luồng, chỉ cần đóng luồng được lưu vào bộ đệm và nó sẽ tự động đóng luồng nút cơ bản mà nó bao bọc.

luồng dữ liệu

Để vận hành thuận tiện các kiểu dữ liệu cơ bản của ngôn ngữ Java và dữ liệu Chuỗi, bạn có thể sử dụng các luồng dữ liệu. Có hai lớp luồng dữ liệu: DataInputStream và DataOutputStream, không được "socket" trên luồng của các lớp con inputStream và OutputStream.

Sử dụng như sau

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
công cộng vô hiệu Bài kiểm tra() {
        DataOutputStream dos = vô giá trị ;
        thử {
            Dòng đầu ra Dòng đầu ra = mới Dòng đầu ra của tệp( "dữ liệu.txt" );
            làm = mới DataOutputStream(Luồng đầu ra);
            dos.writeUTF( "Nhiệt liệt kỷ niệm 100 năm thành lập Đảng Cộng sản Trung Quốc" );
            dos.writeInt( 100 );
            dos.writeBoolean( ĐÚNG VẬY );
            Hệ thống.out.println( "thành công!" );
        } nắm lấy (IOException e) {
            e.printStackTrace();
        } Cuối cùng {
            thử {
                nếu như (dos != vô giá trị ) {
                    dos. đóng();
                }
            } nắm lấy (IOException e) {
                e.printStackTrace();
            }
        }
    }
    công cộng vô hiệu test2(){
        Dòng dữ liệu đầu vào dis =  vô giá trị ;
        thử {
            Dòng đầu vào Dòng đầu vào = mới Dòng đầu vào tệp "dữ liệu.txt" );
            không = mới DataInputStream(inputStream);
            Hệ thống.out.println(dis.readUTF()); // Khi đọc thì đọc theo thứ tự viết
            System.out.println(dis.readInt());
            System.out.println(dis.readBoolean());
            Hệ thống.out.println( "thành công!" );
        } nắm lấy (IOException e) {
            e.printStackTrace();
        } Cuối cùng {
            thử {
                nếu như (không != vô giá trị ) {
                    dis. đóng();
                }
            } nắm lấy (IOException e) {
                e.printStackTrace();
            }
        }
    }

luồng đối tượng

Một luồng xử lý để lưu trữ và đọc dữ liệu hoặc các đối tượng thuộc loại dữ liệu cơ bản. Sức mạnh của nó là nó có thể ghi các đối tượng trong Java vào nguồn dữ liệu và khôi phục các đối tượng từ nguồn dữ liệu.

  • Tuần tự hóa: Cơ chế lưu trữ dữ liệu hoặc đối tượng kiểu cơ bản bằng cách sử dụng lớp ObjectOutputStream
  • Deserialization: Một cơ chế để đọc dữ liệu hoặc đối tượng kiểu cơ bản bằng cách sử dụng lớp ObjectInputStream
  • ObjectOutputStream và ObjectInputStream không thể tuần tự hóa các biến thành viên được sửa đổi tĩnh và tạm thời

Trình diễn tuần tự hóa và giải tuần tự hóa.

Trước tiên, hãy xác định một lớp Person, lớp này phải triển khai giao diện Serializable, nếu không, lỗi java.io.NotSerializableException sẽ được báo cáo trong quá trình tuần tự hóa.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bưu kiện ngày07;
nhập khẩu java.io.Serializable;
nhập khẩu java. util. Ngày;
công cộng lớp học Người thực hiện Có thể tuần tự hóa {
     riêng tư tĩnh cuối cùng dài serialVersionUID = -5858950242987134591L;
     riêng tư Tên chuỗi;
     riêng tư Tuổi nguyên;
     riêng tư Ngày tháng năm;
     công cộng Người(){}
     công cộng Person(Tên chuỗi, Tuổi nguyên, Ngày tháng) {
         cái này .name = tên;
         cái này .age = tuổi;
         cái này .date = ngày;
     }
   // getter, setter
     @Ghi đè
     công cộng Chuỗi toString() {
         trở lại "Người{" +
                 "tên='" + tên + '\ '' +
                 ", tuổi=" + tuổi +
                 ", ngày tháng=" + ngày +
                 '}' ;
     }
}

tuần tự hóa

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
công cộng vô hiệu Bài kiểm tra() {
     ObjectOutputStream oos = vô giá trị ;
     thử {
         Dòng đầu ra Dòng đầu ra = mới Dòng đầu ra của tệp( "person.txt" ); //Tạo đối tượng luồng đầu ra và chỉ định vị trí đầu ra
         đông = mới ObjectOutputStream(Luồng đầu ra); // bọc luồng đầu ra
         oos.writeObject( mới Người( "Trương San" , 22 , mới Ngày())); // tuần tự hóa đối tượng
         Hệ thống.out.println( "Xác định thành công!" );
     } nắm lấy (Ngoại lệ e) {
         e.printStackTrace();
     } Cuối cùng {
         nếu như (phía đông!= vô giá trị ){
             thử {
                 oos. đóng();
             } nắm lấy (IOException e) {
                 e.printStackTrace();
             }
         }
     }
}

Khử lưu huỳnh

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
công cộng vô hiệu test2() {
         ObjectInputStream ois = vô giá trị ;
         thử {
             Dòng đầu vào Dòng đầu vào = mới Dòng đầu vào tệp "person.txt" );
             ois = mới ObjectInputStream(luồng đầu vào);
             Người người = (Người) ois.readObject();
             Hệ thống.out.println( "Tên người đó là:" + person.getName());
             Hệ thống.out.println( "Tuổi của người đó là:" + person.getAge());
             Định dạng ngày tháng đơn giản sdf = mới Định dạng ngày tháng đơn giản "yyyy năm mm tháng dd ngày hh giờ mm phút ss giây" );
             Hệ thống.out.println( "Được tạo vào lúc:" + sdf.format(person.getDate()));
         } nắm lấy (IOException e) {
             e.printStackTrace();
         } nắm lấy (ClassNotFoundException e) {
             e.printStackTrace();
         } Cuối cùng {
             nếu như (ôi != vô giá trị ) {
                 thử {
                     ois.close();
                 } nắm lấy (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
     }

Tóm tắt các luồng IO trong Java (được khuyến nghị)

Cho dù bạn giải tuần tự hóa như thế nào thì thời gian vẫn không thay đổi.

Tóm tắt

Bài viết này kết thúc tại đây, tôi hy vọng nó có thể hữu ích cho bạn và tôi hy vọng bạn có thể chú ý hơn đến nội dung của tôi! .

Liên kết gốc: https://blog.csdn.net/weixin_44061521/article/details/118653939.

Cuối cùng, bài viết này về tóm tắt luồng IO (được khuyến nghị) trong Java kết thúc tại đây. Nếu bạn muốn biết thêm về tóm tắt luồng IO (được khuyến nghị) trong Java, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. ủng hộ blog của tôi trong tương lai! .

42 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress