Khóa học free Bài 26: Giới thiệu luồng và tập tin (Streams & Files) trong Java

Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 22/7/13.

  1. Tiasangmoi92

    Tiasangmoi92 Super Moderator

    Lượt xem: 13,119
    /* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
    trên diễn đàn Android.Vn, bạn có thể vào đây đọc

    để hiểu hơn về khóa học và tham gia ngay cùng mọi người;) */

    0
    - Với những kiến thức ở các bài trước, sau khi chương trình kết thúc, dữ liệu sẽ biến mất, vì nó chỉ được lưu tạm trong RAM. Tắt chương trình hoặc máy tắt đột ngột cũng đồng nghĩa với việc mất sạch dữ liệu trong chương trình. Điều đó thực sự sẽ không thể đáp ứng được nhu cầu, vì thực tế hầu như các chương trình đều cần lưu được lại dữ liệu để chúng ta có thể mở lại xem, hoặc tiếp tục chương trình, nạp thêm dữ liệu ...
    - Ở bài này, chúng ta sẽ cùng nhau làm quen với khái niệm luồng (streams) và file. Công việc này nó thuộc 1 phần của xử lý các luồng.
    Từ đó chúng ta biết các làm cho chương trình có thể đọc, ghi dữ liệu trong bộ nhớ lưu trữ, sau này còn có thể liên quan tới cách xử lý, trao đổi dữ liệu thông qua các kết nối mạng!

    1, Luồng (Streams)

    a, Khái niệm luồng
    - Việc nhập xuất dữ liệu trong thực tế rất đa dạng. Nhập dữ liệu có thể là từ bàn phím, từ trên mạng, máy scan, camera, .v.v..v. Xuất dữ liệu có thể là ghi ra bộ nhớ, in ra màn hình, máy in, ..v..v.. Những hoạt động đó được gọi chung lại 1 khái niệm gọi là luồng (stream). Luồng là nơi có thể “sản xuất” và “tiêu thụ” thông tin.
    - Trong lập trình Java, luồng thường được hệ thống xuất nhập gắn kết với một thiết bị vật lý. Thực tế có rất nhiều các thiết bị vật lý khác nhau, nhưng các luồng lại có cùng 1 nguyên tắc giống nhau để chúng ta dễ dàng xử lý. Vì vậy cùng một lớp, phương thức xuất nhập có thể dùng chung cho các thiết bị vật lý khác nhau. Ví dụ cùng là một phương thức có thể dùng để
    ghi dữ liệu ra console, đồng thời cũng có thể dùng để ghi dữ liệu xuống một file trên đĩa. Java hiện thực luồng bằng tập hợp các lớp phân cấp trong gói java.io.
    - Java định nghĩa 2 kiểu luồng: byte và ký tự (phiên bản gốc chỉ định nghĩa kiểu luồng byte, và sau đó luồng ký tự được thêm vào trong các phiên bản về sau).
    - Luồng ký tự được thiết kế hỗ trợ việc nhập xuất dữ liệu kiểu ký tự (Unicode). Trong một vài trường hợp luồng ký tự sử dụng hiệu quả hơn luồng byte, nhưng ở mức hệ thống thì tất cả những xuất nhập đều phải qui về byte. Luồng ký tự hỗ trợ hiệu quả chỉ đối với việc quản lý, xử lý các ký tự.

    b, Luồng byte (Byte Streams)
    - Các luồng byte được định nghĩa dùng hai lớp phân cấp. Mức trên cùng là hai lớp trừu tượng InputStream và OutputStream. InputStream định nghĩa những đặc điểm chung cho những luồng nhập byte. OutputStream mô tả cách xử lý của các luồng xuất byte.
    - Các lớp con dẫn xuất từ hai lớp InputStream và OutputStream sẽ hỗ trợ chi tiết tương ứng với việc đọc ghi dữ liệu trên những thiết bị khác nhau. Có rất nhiều các lớp khác nhau, nhưng khi bạn đã nắm vững, sử dụng thành thạo một luồng byte nào đó thì bạn sẽ dễ dàng làm việc với những luồng còn lại nhanh thôi! :D

    1

    c, Luồng ký tự (Character Streams)
    - Các luồng ký tự được định nghĩa dùng hai lớp phân cấp. Mức trên cùng là hai lớp trừu tượng Reader và Writer.
    - Lớp Reader dùng cho việc nhập dữ liệu của luồng, lớp Writer dùng cho việc xuất dữ liệu cua luồng. Những lớp dẫn xuất từ Reader và Writer thao tác trên các luồng ký tự Unicode.

    2

    d, Những luồng được định nghĩa trước (The Predefined Streams)
    - Tất cả các chương trình viết bằng java luôn tự động import gói java.lang. Gói này có định nghĩa lớp System, bao gồm một số đặc điểm của môi trường run-time, nó có ba biến luồng được định nghĩa trước là in, out và err, các biến này là các fields được khai báo static trong lớp System.

    - System.out: luồng xuất chuẩn, mặc định là console.
    System.out là một đối tượng kiểu PrintStream.
    - System.in: luồng nhập chuẩn, mặc định là bàn phím.
    System.in là một đối tượng kiểu InputStream.
    - System.err: luồng lỗi chuẩn, mặc định cũng là console.
    System.out cũng là một đối tượng kiểu PrintStream
    giống System.out.

    2, Sử dụng luồng Byte

    - Như chúng ta đã biết hai lớp InputStream và OutputStream là các lớp cha đối với tất cả những lớp luồng xuất nhập kiểu byte. Những phương thức trong hai lớp cha này ném ra các lỗi kiểu IOException. Những phương thức định nghĩa trong 2 lớp cha này là có thể dùng trong các lớp con của chúng. Vì vậy tập các phương thức đó là tập tối tiểu các chức năng nhập xuất mà những luồng nhập xuất kiểu byte có thể sử dụng.
    - Những phương thức định nghĩa trong lớp InputStream và OutputStream:

    3

    a, Đọc dữ liệu từ Console
    Trước đây, khi Java mới ra đời để thực hiện việc nhập dữ liệu từ Console người ta chỉ dùng luồng nhập byte. Về sau thì chúng ta có thể dùng cả luồng byte và luồng ký tự, nhưng trong một số trường hợp thực tế để đọc dữ liệu từ Console người ta thích dùng luồng kiểu ký tự hơn, vì lý do đơn giản và dễ bảo trì chương trình. Ở đây với mục đích minh họa chúng ta dùng luồng byte thực hiện việc nhập xuất Console.
    Ví dụ: Chương trình minh họa việc đọc một mảng bytes từ System.in
    PHP:
    package javaandroidvn;
     
    import java.io.IOException;
     
    public class 
    JavaAndroidVn {
     
        public static 
    void main(String[] argsthrows IOException {
            
    byte duLieu[] = new byte[100];
            
    System.out.print("Nhập dòng ký tự vào: ");
            
    System.in.read(duLieu);
            
    System.out.print("Dòng ký tự vừa nhập: ");
            for (
    int i 0duLieu.lengthi++) {
                
    System.out.print((charduLieu[i]);
            }
     
        }
    }
    b, Xuất dữ liệu ra Console
    - Tương tự như nhập dữ liệu từ Console, với phiên bản đầu tiên của java để xuất dữ liệu ra Console tả chỉ có thể sử dụng luồng byte. Kể từ phiên bản 1.1 (có thêm luồng ký tự), để xuất dữ liệu ra Console có thể sử dụng cả luồng ký tự và luồng byte. Tuy nhiên, cho đến nay để xuất dữ liệu ra Console thường người ta vẫn dùng luồng byte.
    - Chúng ta đã khá quen thuộc với phương thức print() và println(), dùng để xuất dữ liệu ra Console. Bên cạnh đó chúng ta cũng có thể dùng phương thức write().
    Ví dụ: Sử dụng phương thức System.out.write() để xuất ký tự ’x’ và mảng ký tự ch[] ra Console
    PHP:
    package javaandroidvn;
     
    public class 
    JavaAndroidVn {
     
        public static 
    void main(String[] args) {
            
    char ch[] = {'a''c''d''e'};
            
    int b;
            
    'x';
            
    System.out.write(b);
            
    System.out.write('\n');
            for (
    int i 0ch.lengthi++) {
                
    System.out.write(ch[i]);
            }
     
            
    System.out.write('\n');
     
        }
    }
    [​IMG]

    Bài tập về nhà::D
    Các bạn đọc kỹ lý thuyết trên và thử làm, chạy lại các ví dụ trên!
    Bài này chỉ mang tính giới thiệu, tổng quát, chúng ta sẽ đi vào 1 số phần cụ thể ở bài sau!

    (Chú ý: Các bạn nên tự giác làm bài tập, hoàn thiện rồi đăng lên, các bài bạn đã làm, nên để code trong thẻ code - chọn thẻ PHP cho rõ ràng và để ẩn code trong thẻ ẩn spoiler, để khi click vào mới hiện code lên , trước khi thử sức tự làm, bạn không nên nhìn code của các bạn khác đã đăng nhé;))

    [​IMG]

    My Facebook: https://www.facebook.com/tiasangmoi

    Bài viết đăng lên diễn đàn khác vui lòng ghi rõ nguồn: Android.Vn
    luồng trong java, streams in java, file trong java, đọc ghi file trong java, char read, luồng byte, khóa học java, khóa học lập trình java, khóa học java giá rẻ, nhập xuất console
    nguyenthanhTuyen, 13T2_DTle, HaiHack3 others thích bài này.
  2. colen123

    colen123 New Member

    Mã:
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    package docfile;
     
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Scanner;
     
    /**
    *
    * @author quanglm
    */
    public class Docfile {
     
        /**
        * @param args the command line arguments
        */
        public static void main(String[] args) throws IOException {
     
            class nhapvaobandau {
     
                private String duongdan;
                private String giatrichuoi;
                private String noiluu;
     
                public void setnoiluu(String noiluu) {
                    this.noiluu = noiluu;
                }
     
                public void setgt(String giatrichuoi) {
                    this.giatrichuoi = giatrichuoi;
                }
     
                public String getduongdan() {
                    return duongdan;
                }
     
                public void setduongdan(String duongdan) {
                    this.duongdan = duongdan;
                }
     
                public void show() {
                    System.out.println(" Ban da chon : " + duongdan);
                    System.out.println(" Duong dan ban chon : " + giatrichuoi);
                }
            }
            // TODO code application logic here
            System.out.println("Ban muon Open hay copy");
            Scanner nhap = new Scanner(System.in);
            nhapvaobandau usb = new nhapvaobandau();
            usb.setduongdan(nhap.nextLine());
            String duongdan2 = "open";
            // sau khi truyen vao tu ban phim xet no co phai open ko
            if (usb.getduongdan().equals(duongdan2)) {
                System.out.println("dia chi file can open");
                usb.setgt(nhap.nextLine());
                usb.show();
                // tao mot inputstream co ten la F lay data tu duong dan minh nhap
                FileInputStream f;
                try {
                    f = new FileInputStream(usb.giatrichuoi);
                } catch (Exception exc) {
                    System.out.println("File Not Found");
                    return;
                }
     
                {
                    int i;
                    do {
                        i = f.read();
                        if (i != -1) {
                            System.out.print((char) i);
                        }
                    } while (i != -1);
                    f.close();
     
                }
     
     
     
            } else {
                System.out.println("ban chon copy ");
                System.out.println("dia chi file can open");
                usb.setgt(nhap.nextLine());
                System.out.println("Ban hay chon noi luu");
                usb.setnoiluu(nhap.nextLine());
             
                // tao mot inputstream co ten la F lay data tu duong dan minh nhap
                FileInputStream f;
                FileOutputStream fout;
                try {
                    f = new FileInputStream(usb.giatrichuoi);
                } catch (Exception exc) {
                    System.out.println("File Not Found");
                    return;
                }
     
                try {
                    fout = new FileOutputStream(usb.noiluu);
                } catch (FileNotFoundException exc) {
     
     
                    System.out.println("Error Opening OutputFile ");
                    return;
                }
                int i;
            do {
                i = f.read();
                if (i != -1) {
                    fout.write(i);
                }
            } while (i != -1);
            f.close();
            fout.close();
            }
           
     
     
        }
    }
    
  3. HaiHack

    HaiHack Member

    ở cái ví dụ đọc dữ liệu từ console nếu mình nhập vào viet nam thi khi in ra lai chỉ co chữ v. Tại sao vậy?
  4. YansubTye

    YansubTye New Member

    PHP:
    System.out.println(a);

Chia sẻ trang này