1. 程式人生 > >JavaSE基礎練習001_IO,字符串,循環

JavaSE基礎練習001_IO,字符串,循環

基礎 nts txt scan line buffered insert idc for

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處理了,可以每次讀取一行身份號碼進行處理,還涉及到了字符串的解析。

JavaSE基礎練習001_IO,字符串,循環