Khóa học free Bài 29: File truy cập ngẫu nhiên (Random Access Files) trong Java

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

  1. Tiasangmoi92

    Tiasangmoi92 Super Moderator

    Lượt xem: 9,466
    /* 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;) */

    RandomAccessFile-Hierarchy
    - Bên cạnh việc xử lý xuất nhập trên file theo kiểu tuần tự thông qua các luồng, java cũng hỗ trợ truy cập ngẫu nhiên nội dung của một file nào đó dùng RandomAccessFile.
    - RandomAccessFile không dẫn xuất từ InputStream hay OutputStream mà nó hiện thực các interface DataInput, DataOutput (có định nghĩa các phương thức I/O cơ bản).
    - RandomAccessFile hỗ trợ vấn đề định vị con trỏ file bên trong một file dùng phương thức seek(long newPos).

    2, Ví dụ:

    Bài này lý thuyết ngắn, nhưng ví dụ hơi dài, chủ yếu là đọc code để hiểu! :D
    Chương trình sau sẽ ghi 9 số kiểu double xuống file, rồi đọc lên theo thứ tự ngẫu nhiên. Các bạn xem code có chỗ nào không hiểu cứ bình luận phía dưới, mọi người cùng nhau giải quyết! ^^
    PHP:
    package javaandroidvn;
     
    import java.io.*;
     
    class 
    JavaAndroidVn {
     
        public static 
    void main(String args[]) throws IOException {
            
    double data[] = {11.213.6255.6117.922007.968.99.910.0100.6};
            
    double d;
            
    RandomAccessFile raf;
     
            try {
                
    raf = new RandomAccessFile("E:\\random.dat""rw");
            } catch (
    FileNotFoundException exc) {
                
    System.out.println("Cannot open file.");
                return;
            }
     
            
    // Write values to the file.
            
    for (int i 0data.lengthi++) {
                try {
                    
    raf.writeDouble(data[i]);
     
                } catch (
    IOException exc) {
                    
    System.out.println("Error writing to file.");
                    return;
                }
            }
     
            try {
    // Now, read back specific values
                
    raf.seek(8); // seek to first double
                
    raf.readDouble();
                
    System.out.println("First value is " d);
                
    raf.seek(1); // seek to second double
                
    raf.readDouble();
                
    System.out.println("Second value is " d);
                
    raf.seek(3); // seek to fourth double
                
    raf.readDouble();
                
    System.out.println("Fourth value is " d);
                
    System.out.println();
     
    //Read All data  
                
    System.out.println("Read all: ");
                for (
    int i 0data.lengthi++) {
                    
    raf.seek(i); // seek to ith double
                    
    raf.readDouble();
                    
    System.out.print(" ");
                }
                
    System.out.println("");
     
    // Now, read every other value.
                
    System.out.println("Here is every other value: ");
                for (
    int i 0data.length+= 2) {
                    
    raf.seek(i); // seek to ith double
                    
    raf.readDouble();
                    
    System.out.print(" ");
                }
     
     
                
    System.out.println("\n");
            } catch (
    IOException exc) {
                
    System.out.println("Error seeking or reading.");
            }
     
            
    raf.close();
        }
    }

    [​IMG]

    Bài tập về nhà::D
    - Tạo chương trình khi chạy lên nếu như không tồn tại file thì tạo file mới như sau:
    - Tạo 1 mảng , các phần tử là các số thực. Các số được ghi vào file theo kiểu ghi ngẫu nhiên.
    - Nếu file đã tồn tại, hoặc là ở những lần chạy sau, sau khi đã khởi tạo giá trị, chương trình bỏ qua bước khởi tạo và dựa vào file in ra những số có chỉ số lẻ trong mảng đã nhập trên bằng cách lấy trực tiếp chỉ số khi đọc file theo cách đọc ngẫu nhiên! (Không dùng cách nạp lại cả file vào mảng)

    (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
    Random Access Files, đọc file ngẫu nhiên, ghi file ngẫu nhiên, read file Random in java, write file radom in java, read file in java byte, read file java, write java file, khóa học java, khóa học lập trình java
    hiuhiu314Sky6596 thích bài này.
  2. Show Spoiler

    Mã:
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.Scanner;
     
    public class VDBai29B {
        public static void main(String[]args) throws IOException{
            VDBai29B vd=new VDBai29B();
            Scanner in=new Scanner(System.in);
            double []aa={1,4,6.8,9.1,33,56};
            System.out.println("Nhap ten file:");
            String s1=in.nextLine();
            File alt=new File(s1);
            if(alt.exists()== true)
            {
                System.out.println("File "+s1+ " already.");
                vd.readfile(s1, aa);
            }
            else
            {
                vd.writefile(s1, aa);
                System.out.println("New file success");
            }
        }
        public static void writefile(String s,double []a) throws IOException
        {
            RandomAccessFile raf;
            try {
                raf = new RandomAccessFile(s, "rw");
            } catch (FileNotFoundException exc) {
                System.out.println("Cannot open file.");
                return;
            }
     
            // Write values to the file.
            for (int i = 0; i < a.length; i++) {
                try {
                    raf.writeDouble(a[i]);
     
                } catch (IOException exc) {
                    System.out.println("Error writing to file.");
                    return;
                }
            }
            raf.close();
        }
        public static void readfile(String s,double []a) throws IOException
        {
            double d;
            RandomAccessFile raf;
            try {
                raf = new RandomAccessFile(s, "rw");
            } catch (FileNotFoundException exc) {
                System.out.println("Cannot open file.");
                return;
            }
            try {
                // Now, read every other value.
                            System.out.println("Nhung so co chi so le trong mang: ");
                            for (int i = 1; i < a.length; i += 2) {
                                raf.seek(8 * i); // seek to ith double
                                d = raf.readDouble();
                                System.out.print(d + "\t");
                            }
               
                            System.out.println("\n");
                        } catch (IOException exc) {
                            System.out.println("Error seeking or reading.");
                        }
                        raf.close();
        }
    }
    
  3. Martimillion

    Martimillion New Member

    Cảm ơn bạn !
  4. bqthanh94_cntt

    bqthanh94_cntt alone 94

    cho mình hỏi bài code ở trên 1 tí: raf.seek(0*8);
    8 là byte kiểu double, vậy cho mình hỏi là sao mình thực hiện trên kiểu Int là: raf.seek(0*4); lại không được
    nguyenthanhTuyen thích bài này.
  5. trungma

    trungma New Member

    Cho mình hỏi có cách nào lấy được độ dài của mảng trong file không. bài của mình trong trường hợp file đã có sẵn thì phải nhập đúng số phần tử của mảng nó mới chạy đúng:khắc phuc hộ mình với....
    bai29 (open)
    PHP:
    import java.io.*;
    import java.util.Scanner;
    public class 
    Bai29FileRanrom {
    public static 
    void main(String[] argsthrows Exception{
    String s1;
    @
    SuppressWarnings("resource")
    Scanner sc=new Scanner(System.in);
    System.out.print("Nhap ten file can tao: ");
    s1=sc.nextLine();
    //nhap độ dài của mang cần nhập vào file
    System.out.print("Nhap vao so phan tu cua mang Double: ");
    int n=sc.nextInt();
    Bai29 a=new Bai29();
    File filename=new File(s1);
    if (
    filename.exists()==true){
    System.out.println("File da ton tai");
    System.out.println("Thong tin file:"+s1);
    a.Read(s1,n);
    }else{
    System.out.println("File chua ton tai, nhap thong tin file moi: ");
    a.Write(s1,n);
    a.Read(s1,n);

    }
    }
    }
    //Ghi du lieuj vao file
    class Bai29{
    String s1;
    double[] data;
    void Write(String s1,int nthrows Exception{
    RandomAccessFile rfile;
    @
    SuppressWarnings("resource")
    Scanner sc=new Scanner(System.in);
    double data[]=new double[n];
    try{
    rfile=new RandomAccessFile(s1"rw");
    }catch(
    FileNotFoundException e1){
    System.out.println("Khong tao duoc file");
    return;
    }
    for (
    int i=0;i<n;i++){
    try{
    rfile.writeDouble(data[i]=sc.nextDouble());
    }catch(
    IOException e2){
    System.out.println("Loi khong viet duoc file");
    }
    }
    rfile.close();
    }
    //Đọc các phần tử lẻ của mảng từ file
    void Read(String s1,int n)throws IOException{
    RandomAccessFile rfile;

    try {
    rfile = new RandomAccessFile(s1"rw");
    } catch (
    FileNotFoundException exc) {
    System.out.println("Cannot open file.");
    return;
    }
    for (
    int i=1;i<n;i+=2) {
    rfile.seek(i); 
    double d rfile.readDouble();
    System.out.println(" ");
    }
    rfile.close();
    }
    }

  6. thanhdat86

    thanhdat86 New Member

    MyUnit29 (open)

    PHP:
    package hoc.java;
     
    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.Random;
    import java.util.Scanner;
     
    public class 
    Unit29 {
    public static 
    void main(String[] args) {
    Scanner indata = new Scanner(System.in);
    Unit29 u = new Unit29();
    System.out.println("Nhap ten file: ");
    String file indata.nextLine();
    if (
    u.CheckFile(file) == true) {
    System.out.println("File da ton tai");
    System.out.println("Noi dung file: ");
    u.InputData(file);
    } else {
    u.OutputData(file);
    }
     
    }
     
    public 
    void InputData(String filename) {
    try {
    RandomAccessFile raf = new RandomAccessFile(filename"rw");
    int i 0;
    while ((
    i*4) < raf.length())
    {
    raf.seek(i);
    System.out.print(raf.getFilePointer());
    System.out.println(" " raf.readFloat());
    i+=2;
    }
    raf.close();
     
    } catch (
    IOException exc) {
    System.out.println("Co loi xay ra");
    }
    }
     
    public 
    void OutputData(String filename) {
    float[] arrSoThuc = new float[10];
    for (
    int i 0arrSoThuc.lengthi++) {
    arrSoThuc[i] = new Random().nextFloat();
    }
    try {
    RandomAccessFile raf = new RandomAccessFile(filename"rw");
    for (
    int i 0arrSoThuc.lengthi++) {
    {
    raf.writeFloat(arrSoThuc[i]);
    }
    raf.close();
     
    }
    } catch (
    IOException exc) {
    System.out.println("co loi xay ra");
    }
    }
     
     
    public 
    boolean CheckFile(String filename) {
    File f = new File(filename);
    if (
    f.exists())
    return 
    true;
    else
    return 
    false;
    }
    }
  7. TruongCongPha

    TruongCongPha New Member

    PHP:
    package baiTap;
    import java.io.*;
    import java.util.Scanner;
    public class 
    Unit_29 {
    float a[];
    int n;
    public 
    void taoFile(){
    Scanner in=new Scanner(System.in);
    System.out.print("So phan tu cua mang: ");
    n=in.nextInt();
    System.out.println("Cac phan tu:");
    a=new float[n];
    for (
    int i 0a.lengthi++) {
    System.out.print("a["+(i+1)+"]= ");
    a=in.nextFloat();
    }
    }
    public 
    void vietFile(String filethrows IOException{
    float f;
    RandomAccessFile raf;
    try {
    raf=new RandomAccessFile(file,"rw");
    } catch (
    Exception e) {
    System.out.println("Xay ra loi1: "+e);
    return;
    }
    //viet cac gia tri vao file
    for (int i 0ni++) {
    try {
    raf.writeFloat(a);
    } catch (
    Exception e) {
    System.out.println("Xay ra loi2: "+e);
    return;
    }
    }
    raf.close();
    }
    public 
    void docFile(String filethrows IOException{
    RandomAccessFile raf;
    float f;
    try {
    raf=new RandomAccessFile(file,"rw");
    System.out.println("Cac phan tu cua chi so le:");
    for (
    int i 0<ni+=2) {
    raf.seek(4*i);
    f=raf.readFloat();
    System.out.println(f+" ");
    }
    } catch (
    Exception e) {
    System.out.println("Xay ra loi4: "+e);
    return;
    }
    raf.close();
    }
    public static 
    void main(String[] argsthrows IOException {
    Unit_29 un = new Unit_29();
    String link;
    Scanner in=new Scanner(System.in);
    System.out.println("Nhap dia chi:");
    link=in.nextLine();
    File f=new File(link);
    if(
    f.exists()==true){
    System.out.println("File da ton tai");
    System.out.println("Thong tin File "+link+" :");
    un.docFile(link);
    }else {
    System.out.println("File chua duoc tao\n Viet file moi ");
    f.createNewFile();
    un.taoFile();
    un.vietFile(link);
    un.docFile(link);
    }
    }
    }
  8. TruongCongPha

    TruongCongPha New Member

    vì sao khi nhập tên file trùng rồi, mà tới khi lấy dữ liệu ra từ file đó lại k đc. mình làm theo cách trên nhưng k có dữ liệu đưa ra
  9. HDTinh

    HDTinh New Member

    Cho mình hỏi cách dùng seek(). Mình không hiểu?
  10. Tentacle

    Tentacle New Member

    Show Spoiler

    PHP:
    import java.io.*;
    import java.util.*;
    public class 
    Bai29 {
     
     
     
     
     
     
     
     
     
    public static 
    void main(String[] argsthrows IOException{
     
     
     
     
    double arr[]={1.1,2.2,3.3,4.4,5.5};
    File a=new File("E:\\bai29.dat"); 
    if (
    a.exists()==true){
    System.out.println("File da duoc tao");
    RandomAccessFile rddouble d;
    rd = new RandomAccessFile("E:\\bai29.dat""rw");
    for (
    int i=1;i<arr.length;i+=2){
    rd.seek(8*i);
    d=rd.readDouble();
    System.out.println(d+" ");
     
    }
    }else {
    System.out.println("File chua duoc tao");
    RandomAccessFile rd;
    try {
    a.createNewFile();
             
    rd = new RandomAccessFile("E:\\bai29.dat""rw");
         } catch (
    FileNotFoundException exc) {
             
    System.out.println("Cannot open file.");
             return;
         }  
    for (
    int i=0;i<arr.length;i++){
    rd.writeDouble(arr[i]);
    }
     
     
     
     
    }
     
    }
    }

Chia sẻ trang này