import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
/**
* 该题目为控制台应用程序;
* 在控制台输入IDCardNo.txt文件读取txt文件中的身份证号码(15位)数据;
* 按照【其他说明】中的身份证升位业务规则完成升位运算;
* 将最终的升位后的身份证号码(18位)列表写入到IDCardNo(年月日时分秒).txt文件中。
* @author macbookpro
*
*/
public class JavaSE001 {
public static void main(String[] args) {
System.out.println("请输入文件名称:");
Scanner scan = new Scanner(System.in);
//获取文件名称
String fileName = scan.nextLine();
System.out.println(fileName);
readFile(fileName);
}
public static void readFile(String fileName){
//读取文件
File cardFile = new File(fileName);
if (cardFile.exists()) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(cardFile));
String cardNo = null;
while ((cardNo = reader.readLine())!= null) {
System.out.println(cardNo);
//升级身份证
updateIDCard(cardNo);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
reader.close();
for (int i = 0; i < oldIDCardList.size(); i++) {
System.out.println(oldIDCardList.get(i));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}else{
System.out.println("文件不存在");
}
}
/**
* 身份证升级
* @param oldIDCard
*/
public static void updateIDCard(String oldIDCard){
//第一步,在原十五位数身份证的第六位数后面插入19 ,这样身份证号码即为十七位数
StringBuilder IDBuilder1 = new StringBuilder(oldIDCard);
IDBuilder1.insert(5, 19);
String firstStr = IDBuilder1.toString();
//第二步,将身份证前十七位数分别乘以不同系数,从第一至十七位的系数分别为7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2,
// 将这十七位数字和系数相乘的结果相加,用加出来的和除以11,看看余数是多少
// 余数只可能有0、1、2、3、4、5、6、7、8、9、10这十一个数字,其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2,
// 这样就得出了第二代身份证第十八位数的校验码。
StringBuilder IDBuilder2 = new StringBuilder(firstStr);
IDBuilder2.insert(17, subString(firstStr));
String secondStr = IDBuilder2.toString();
System.out.println("最终身份证号码是: "+secondStr);
}
/**
* 获取身份证第十八位
* @param str
*/
public static String subString(String str){
int numArray[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int sum = 0;
for (int i = 0; i < str.length(); i++) {
char num1Str = str.charAt(i);
int num1 = num1Str - ‘0‘;
int num2 = numArray[i];
sum = num1*num2 + sum;
}
int num = sum%11;
System.out.println("余数是: "+ num);
switch (num) {
case 0:
return "1";
case 1:
return "0";
case 2:
return "X";
case 3:
return "9";
case 4:
return "8";
case 5:
return "7";
case 6:
return "6";
case 7:
return "5";
case 8:
return "4";
case 9:
return "3";
case 10:
return "2";
default:
return null;
}
}
}
对txt文件里的数据用BufferedReader处理了,可以每次读取一行身份号码进行处理,还涉及到了字符串的解析。
原文:http://www.cnblogs.com/dreamyu/p/7096434.html