java读取二进制文件,并且用二分查找安装一定的规则查找符合条件的数据列
来源:互联网 发布:bbs url 网络推广 编辑:程序博客网 时间:2024/04/26 19:45
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
使用上一遍文章的代码生成二进制文件,然后可用于本文的测试。
- java读取二进制文件,并且用二分查找安装一定的规则查找符合条件的数据列
- 二分查找,找到第一个符合条件的数字
- grep-查找符合条件的字符串
- 用find_if查找容器中符合条件的子集
- 二分查找的各种条件
- 简单的二分查找条件
- 查找某个数据,找到后把符合条件数据的一行复制到另外一个地方
- 浅谈数据的查找(二分查找)
- Find的使用方法 【查找符合多重条件的文件】
- 实例2:查找符合查询条件的RSS
- 编程之美2.8查找符合条件的数
- 查找二叉树中符合特定条件的值
- linux grep命令(查找文件里符合条件的字符串)
- linux查找符合条件的文件并删除
- DB: 表查找符合条件的最小日期
- 查找出数组中符合某一条件的数组索引
- grep在一个文本中查找符合条件的文本
- mysql模糊查找:一个表T2的某列数据,作为另一个表T1查找条件进行模糊查找
- django中如何登录数据库
- 用Maven部署war包到远程Tomcat服务器
- input与span之间莫名的空隙
- qt读写excel
- 凑硬币
- java读取二进制文件,并且用二分查找安装一定的规则查找符合条件的数据列
- 偶遇mysql从库同步延迟延重
- Python基础篇—Pandas应用(二)
- MyEclipse安装JS代码提示插件——Spket插件)
- Tomcat Server.xml详解
- Java基于POI读取Excel工具类
- 03_Elasticsearch如何安装以及相关插件的介绍
- Struts2 三种action类
- 服务器配置ASP.NET服务过程