java读取二进制文件,并且用二分查找安装一定的规则查找符合条件的数据列

来源:互联网 发布:bbs url 网络推广 编辑:程序博客网 时间:2024/04/26 19:45
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;




public class Prog1p2 {


public static void main(String[] args) throws IOException {
File fileRef; // used to create the file
RandomAccessFile dataStream = null; // specializes the file I/O
List<DataRecord> recs = new ArrayList<DataRecord>(); 
System.out.print("Please input you file name:");
BufferedReader str = new BufferedReader(
new InputStreamReader(System.in));
String fileName = str.readLine();


fileRef = new File(fileName);


try {
dataStream = new RandomAccessFile(fileRef, "rw");
} catch (IOException e) {
e.printStackTrace();
System.out.println("I/O ERROR: Something went wrong with the "
+ "creation of the RandomAccessFile object.");
System.exit(-1);
}
//记录数据总条数
   long             numberOfRecords = 0; // loop counter for reading file


        try {
            numberOfRecords = (dataStream.length() / DataRecord.RECORD_LENGTH);
        } catch (IOException e) {
            System.out.println("I/O ERROR: Couldn't get the file's length.");
            System.exit(-1);
        }
        
        System.out.println("\nThere are " + numberOfRecords
                         + " records in the file.\n");
        try {


        while (numberOfRecords > 0) {
         DataRecord rec=new DataRecord();
         rec.fetchObject(dataStream);
          recs.add(rec);
       
         numberOfRecords--;
        }
    } catch (Exception e) {
    e.printStackTrace();
}
        System.out.println(recs.size());
        //输出前五条,后五条
        for (int j = 0; j < recs.size(); j++) {
if(j<5){
// System.out.println(" first five records of data:");
 System.out.println("Read records :" + recs.get(j).getCode()+" "+ recs.get(j).getName()
 +" "+ recs.get(j).getDouble1()+" "+ recs.get(j).getInt1()
 +" "+ recs.get(j).getDouble2()+" "+ recs.get(j).getDouble3()
 +" "+ recs.get(j).getDouble4()+" "+ recs.get(j).getDouble5()
 +" "+ recs.get(j).getDouble6()+" "+ recs.get(j).getDouble7());
   
         System.out.println();
}
if(recs.size()<5) break;
if(j>recs.size()-6){
//System.out.println(" last five records of data:");
 System.out.println("Read records: " + recs.get(j).getCode()+" "+ recs.get(j).getName()
 +" "+ recs.get(j).getDouble1()+" "+ recs.get(j).getInt1()
 +" "+ recs.get(j).getDouble2()+" "+ recs.get(j).getDouble3()
 +" "+ recs.get(j).getDouble4()+" "+ recs.get(j).getDouble5()
 +" "+ recs.get(j).getDouble6()+" "+ recs.get(j).getDouble7());
   
         System.out.println();
}

}

   try {
            dataStream.close();
        } catch (IOException e) {
            System.out.println("I/O ERROR: Seems we can't reset the file "
                             + "pointer to the start of the file.");
            System.exit(-1);
        }
   while(true){
System.out.print("Please input an “Energ Kcal” value :");
BufferedReader str1 = new BufferedReader(
new InputStreamReader(System.in));
String intNum = str1.readLine();
int key=0;
try {
key =Integer.parseInt(intNum);
} catch (Exception e) {
System.out.println("UnInvalid Value!");
continue;
}
List<DataRecord> lists=null;
try {
lists=binarySearch(recs, 0, recs.size(), key);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(lists.size()==0){
System.out.println("No matching records.");
continue;
}

  for (int j = 0; j < lists.size(); j++) {


 System.out.println("Read records :" + lists.get(j).getCode()+" "+ lists.get(j).getName()
 +" "+ lists.get(j).getDouble1()+" "+ lists.get(j).getInt1()
 +" "+ lists.get(j).getDouble2()+" "+ lists.get(j).getDouble3()
 +" "+ lists.get(j).getDouble4()+" "+ lists.get(j).getDouble5()
 +" "+ lists.get(j).getDouble6()+" "+ lists.get(j).getDouble7());
   
         System.out.println();
}


   }
}

public static  List<DataRecord> binarySearch(List<DataRecord> recs, int from, int to, int key) 
throws Exception {
       if (from < 0 || to < 0) {
           throw new IllegalArgumentException("params from & length must larger than 0 .");
       }
       
       List<DataRecord> lists=new ArrayList<DataRecord>();
       
       if(key>recs.get(recs.size()-1).getInt1()||key<recs.get(0).getInt1()){
        System.out.println(recs.get(recs.size()-1).getInt1());
            return lists;
            }
       if (from <= to) {
           int middle = (from >>> 1) + (to >>> 1); // 右移即除2
           DataRecord rec=recs.get(middle);
         
           if (rec.getInt1()>key) {
               to = middle - 1;
           } else if (rec.getInt1()<key) {
               from = middle + 1;
           } else {
           
            int i=middle;
           while (i>from) {
            if(recs.get(i).getInt1()==key){
            lists.add(recs.get(i));
            }else{
            break;
            }
            i--;
}
           int j=middle;
           while (j<to) {
            if(recs.get(j).getInt1()==key){
            lists.add(recs.get(j));
            }else{
            break;
            }
            j++;
}
           
            return lists;
           }
       }
       return binarySearch(recs, from, to, key);
   }


}


附上数据以供测试

~01001~^~BUTTER,WITH SALT~^15.87^717^0.85^81.11^2.11^0.06^0.0^0.06^24^0.02^2^24^24^643^0.09^0.000^0.000^1.0^0.0^0.005^0.034^0.042^0.110^0.003^3^0^3^3^18.8^0.17^2499^684^671^0^158^0^0^0^2.32^0.0^0^7.0^51.368^21.021^3.043^215^5.0^~1 pat,  (1" sq, 1/3" high)~^14.2^~1 tbsp~^0
~01002~^~BUTTER,WHIPPED,W/ SALT~^16.72^718^0.49^78.30^1.62^2.87^0.0^0.06^23^0.05^1^24^41^583^0.05^0.010^0.001^0.0^0.0^0.007^0.064^0.022^0.097^0.008^4^0^4^4^18.8^0.07^2468^683^671^1^135^6^0^13^1.37^0.0^0^4.6^45.390^19.874^3.331^225^3.8^~1 pat,  (1" sq, 1/3" high)~^9.4^~1 tbsp~^0
~01003~^~BUTTER OIL,ANHYDROUS~^0.24^876^0.28^99.48^0.00^0.00^0.0^0.00^4^0.00^0^3^5^2^0.01^0.001^0.000^0.0^0.0^0.001^0.005^0.003^0.010^0.001^0^0^0^0^22.3^0.01^3069^840^824^0^193^0^0^0^2.80^0.0^0^8.6^61.924^28.732^3.694^256^12.8^~1 tbsp~^205^~1 cup~^0


使用上一遍文章的代码生成二进制文件,然后可用于本文的测试。


0 0
原创粉丝点击