FileInputStream, FileOutputStream – Đọc/Ghi file java

Tìm hiểu về FileInputStream trong java thông qua chương trình quản lý thông tin học sinh với các chức năng: nhập thông tin từ bàn phím, tìm kiếm và đọc lưu file từ danh sách.

Xem thêm:

1. FileInputStream trong java

FileInputStream là một lớp rất hữu ích trong Java để đọc dữ liệu từ một tập tin dưới dạng chuỗi byte. Nó được thiết kế đặc biệt để cho phép bạn đọc các chuỗi byte “thô” từ tệp (ví dụ: dữ liệu hình ảnh hoặc âm thanh). Tuy nhiên, nếu bạn chỉ cần đọc dữ liệu dưới dạng chuỗi ký tự, thì tốt nhất là sử dụng FileReader.

2. Các phương thức của lớp FileInputStream trong java

FileInputStream(String name): Khởi tạo từ tên tệp.

FileInputStream(File file): Khởi tạo từ một đối tượng File.

int read(): Đọc một byte dữ liệu từ luồng và trả về một số nguyên từ 0 đến 255. Nếu đọc đến cuối tập tin, nó trả về -1.

int read(byte[] b): Đọc một số byte từ luồng vào mảng byte được chỉ định và trả về số byte đã đọc. Nếu đọc đến cuối tập tin, nó trả về -1.

int read(byte[] b, int off, int len): Đọc tối đa len byte từ luồng vào mảng byte được chỉ định, bắt đầu từ vị trí off, và trả về số byte đã đọc. Nếu đọc đến cuối tập tin, nó trả về -1.

int available(): Nó được sử dụng để trả về số byte ước tính có thể đọc được từ file input stream.

void close(): Đóng luồng đầu vào. Bất kỳ tài nguyên nào được sử dụng bởi luồng cũng sẽ được giải phóng.

3. Ví dụ về FileInputStream

Bài 15: Viết chương trình quản lý danh sách học sinh với các chức năng như sau:

– Tạo lớp Nguoi.

Nguoi
– Hoten: String

– Namsinh: int

– Gioitinh: bool

+ getHoten():string

+getNamsinh(): int

+ getGioitinh(): bool

+Nguoi(in hoten: string, in namsinh: int, in gioitinh:bool)

– Tạo giao diện (interface) IHoatdong với phương thức string gioithieu().

– Tạo lớp Hocsinh thừa kể từ Nguoi và thi hành giao diện IHoatdong (cho biết học sinh học lớp nào).

Hocsinh
– tenlop: string
+ gioithieu(): string

+ getTenlop(): string

+ Hocsinh(in hoten:string, in namsinh: int, in gioitinh:bool, in tenlop:string)

Viết chương trình:

  • Nhập vào N học sinh.
  • Hiện N học sinh ra màn hình.
  • Nhập vào 1 năm sinh X, hiển thị ra màn hình tên từng năm đó và thông tin tự giới thiệu của từng học sinh.
  • Lưu danh sách học sinh vào file.
  • Đọc danh sách học sinh có từ file và in lên màn hình.

3.1 Interface IHoatDong

package bai15;

public interface IHoatDong {
    public String gioithieu();
}

3.2 Lớp Nguoi

package bai15;

import java.io.Serializable;
import java.util.Scanner;

public class Nguoi implements Serializable{
    String hoTen;
    int namSinh;
    boolean gioiTinh;
    
    public Nguoi(){
        
    }
    
    public Nguoi(String hoTen, boolean gioiTinh, int namSinh){
        this.hoTen= hoTen;
        this.gioiTinh= gioiTinh;
        this.namSinh= namSinh;
    }

    public String getHoTen() {
        return hoTen;
    }

    public void setHoTen(String hoTen) {
        this.hoTen = hoTen;
    }

    public boolean isGioiTinh() {
        return gioiTinh;
    }

    public void setGioiTinh(boolean gioiTinh) {
        this.gioiTinh = gioiTinh;
    }

    public int getNamSinh() {
        return namSinh;
    }

    public void setNamSinh(int namSinh) {
        this.namSinh = namSinh;
    }
    
    public void nhap(){
        Scanner sc= new Scanner(System.in);
        byte i;
        while(true){
            try {
                System.out.println("Nhap ho va ten: ");
                hoTen= sc.nextLine();;
                System.out.println("Nhap nam sinh: ");
                namSinh= sc.nextInt();
                System.out.println("Gioi tinh(1:Nam - 0:Nu): ");
                i=sc.nextByte();
                if(namSinh<=0) throw new Exception(); break;
            } catch (Exception e) {
                System.out.print("Nhap sai gia tri, nhap lai!\n");
  sc.nextLine();
            }
        }
        sc.nextLine();
        if(i==1) gioiTinh=true; else gioiTinh=false;
    }
    
    public String hien(){
        String gt= null;
        if(gioiTinh) {
            gt="Nam";
        }else{
            gt="Nu";
        }
        String output = String.format("%-30s|%-8d|%-9s|",hoTen,namSinh,gt);
 return output;
    }
}

3.3 Lớp HocSinh thừa kế từ lớp Nguoi

package bai15;

import java.io.Serializable;
import java.util.Scanner;

public class HocSinh extends Nguoi implements Serializable, IHoatDong{
    String lop;
    
    public HocSinh(){
        
    }
    
    public HocSinh(String hoTen, boolean gioiTinh, int namSinh, String lop){
        super(hoTen, gioiTinh, namSinh);
        this.lop= lop;
    }
    
    public void nhap(){
        Scanner sc= new Scanner(System.in);
        super.nhap();
        System.out.println("Nhap lop: ");
        lop= sc.nextLine();
    }

    @Override
    public String gioithieu() {
        String output = String.format(super.hien()+"%-7s",lop);
 return output;
    }
}

3.4 Đọc lưu file với FileInputStream

package bai15;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class DanhSach {
    ArrayList<HocSinh> ds= new ArrayList<>();
    int n;
    Scanner sc = new Scanner(System.in);
    
    public void nhapDS(){
        System.out.println("Nhap so hoc sinh: ");
        n= sc.nextInt();
        for(int i=0;i<n;i++){
            System.out.println("\nHoc sinh thu "+(i+1));
            HocSinh hs= new HocSinh();
            hs.nhap();
            ds.add(hs);
        }
    }
    
    public void xuatDS() {
  System.out.println("\nDanh sach hoc sinh: ");
  System.out.printf("%-30s|%-8s|%-9s|%-7s\n","Ho ten","Nam sinh","Gioi tinh","Lop");
  for(HocSinh hs:ds) {
                    System.out.println(hs.gioithieu());
  }
 }
    
    public void timKiem(){
        int nam = 0, dem=0;
        while(true){
            try {
                System.out.println("Nhap nam sinh can tim: ");
                nam= sc.nextInt();
                if(nam<=0) throw new Exception();
                break;
            } catch (Exception e) {
                System.out.print("Nhap gia tri sai, nhap lai!\n");
  sc.nextLine();
            }
        }
        System.out.println("\nDanh sach học sinh: ");
 System.out.printf("%-30s|%-8s|%-9s|%-7s\n","Ho ten","Nam sinh","Gioi tinh","Lop");
            for(HocSinh hs:ds){
                if(hs.getNamSinh()==nam){
                    dem++;
                    System.out.println(hs.gioithieu());
                }
            }
            if(dem==0){
                System.out.println("Nam sinh khong ton tai");
            }
    }
    
    public void ghiFile() throws Exception{
        try {
            FileOutputStream fout = new FileOutputStream("bai15b.txt");
            ObjectOutputStream out = new ObjectOutputStream(fout);
            out.writeObject(ds);
            out.close();
            fout.close();

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Ghi file khong thanh cong!");
        }
        System.out.println("Ghi file thanh cong");
        
    }
    
    public void docFile() throws Exception{
        try {
            FileInputStream fin = new FileInputStream("bai15b.txt");
            ObjectInputStream in = new ObjectInputStream(fin);
            ds = (ArrayList) in.readObject();
            in.close();
            fin.close();
            xuatDS();
        }catch(FileNotFoundException e){
            System.out.println("Khong tim thay file");
        } 
        catch (Exception e) {
            e.printStackTrace();
            System.out.println("Ghi file khong thanh cong");
        }
    }
}

3.5 Lớp main

package bai15;

import java.util.Scanner;

public class Bai15 {
    
    static void menu(){
        System.out.println("1. Nhap danh sach hoc sinh");
        System.out.println("2. Xuat danh sach hoc sinh");
        System.out.println("3. Loc danh sach theo nam sinh");
        System.out.println("4. Ghi file");
        System.out.println("5. Doc File");
        System.out.println("0. Thoat");
    }
    public static void main(String[] args) throws Exception {
        DanhSach d = new DanhSach();
        int chon;
        Scanner sc = new Scanner(System.in);
        
        do {            
            menu();
            System.out.println("Lua chon: ");
            chon = sc.nextInt();
            switch(chon){
                case 1: d.nhapDS();break;
                case 2: d.xuatDS();break;
                case 3: d.timKiem();break;
                case 4: d.ghiFile();break;
                case 5: d.docFile();break;
                case 0: System.exit(0); break;
                default: break;
            }
        } while (chon!=0);
    }
    
}

3.6 Kết quả

File tải full code:

Trên đây là chương trình đọc lưu file danh sách học sinh với FileInputStream. Cảm ơn các bạn đã tham khảo trên ttnguyen.net.

Bài viết liên quan:

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em