使用Reader流進行字符加密

  • 需求
    數字:
    如果不是9的數字,在原來的基礎上加1,比如5變成6, 3變成4
    如果是9的數字,變成0
    字母字符:
    如果是非z字符,向右移動一個,比如d變成e, G變成H
    如果是z,z->a, Z-A
    字符需要保留大小寫
    非字母字符
    比如',&^ 保留不變,中文也保留不變
  • 第一次實現思路
    第一次實現使用if對字符進行分類判斷,但是由於沒有將細節考慮全面,在最後在處理zZ9上面出現問題。有空再來補充爲什麼對他們的處理會出現問題。
  • 遇到的問題

1.像這種分多類別進行判斷的情況使用switch...case...非常方便,在第一次實現的時候腦海中閃過應該使用switch...case...,但沒有進行嘗試。
2. write方法使用之後一定要調用close方法釋放流。

fr2.write(ch2);
fr2.close();
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ReaderTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File file1 = new File("C:\\Users\\12082\\Desktop\\MyStringBuffer.txt");
		File file2 = new File("C:\\Users\\12082\\Desktop\\testencode.txt");
		encodeFile(file1,file2);
	}
	public static void encodeFile(File encodingFile, File encodedFile) {
		try {
			FileReader fr1 = new FileReader(encodingFile);
			char ch1[] = new  char[(int)encodingFile.length()];
			char ch2[] =new char[ch1.length];
			fr1.read(ch1);
			System.out.println("加密之前的字符爲:");
			for(char a:ch1) {
				System.out.print(a);
			}
			for(int i = 0 ;i<ch1.length;i++) {
				//判斷是否是數字
				if(Character.isDigit(ch1[i]) && ((int)ch1[i]) !=9 ){
					ch2[i] = (char) (ch1[i]+1);
				}
				if((int)ch1[i] == 9) {
					ch2[i] = (char) (ch1[i] -'9'-'0') ;
				}
				if((Character.isLetter(ch1[i]) && (ch1[i] !='z') && (ch1[i]) !='Z')) {
					ch2[i] = (char) (ch1[i]+1);
				}
				if( (ch1[i] =='z') && (ch1[i] =='Z')){
					ch2[i] = (char) (ch1[i] -'z'-'Z') ;
				}
				if(!(Character.isDigit(ch1[i])||Character.isLetter(ch1[i]))) {
					ch2[i] = ch1[i];
				}
			}
			FileWriter fr2 = new FileWriter(encodedFile);
			fr2.write(ch2);
			fr2.close();
			System.out.println("加密之後的字符爲:");
			for(char a:ch2) {
				System.out.print(a);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
  • 第二次實現思路
    使用switch...case...zZ9進行處理,實際還有一個問題,想想看,對中文字符如何處理?這裏還有一個特殊情況,下次在進行補充。除中文字符實現的過程如下:
package iotest;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class ReaderTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File file1 = new File("C:\\Users\\1026\\Desktop\\encoding.txt");
		File file2 = new File("C:\\Users\\1026\\Desktop\\result.txt");
		encodeFile(file1,file2);
	}
	public static void encodeFile(File encodingFile, File encodedFile) {
		try {
			FileReader fr1 = new FileReader(encodingFile);
			char ch1[] = new  char[(int)encodingFile.length()];
			char ch2[] =new char[ch1.length];
			fr1.read(ch1);
			System.out.println("加密之前的字符爲:");
			for(char a:ch1) {
				System.out.print(a);
			}
			for(int i = 0 ;i<ch1.length;i++) {
				//判斷是否是數字
				 ch2[i] =ch1[i];
				 if (Character.isLetter(ch2[i]) || Character.isDigit(ch2[i])) {
					switch ( ch2[i]) {
				case '9':
					 ch2[i] = '0';
					break;
				case 'z':
					 ch2[i] = 'a';
					break;
				case 'Z':
					 ch2[i] = 'A';
					break;
				default:
					 ch2[i]++;
					break;
					}
				}
				 if (!Character.isLetter(ch2[i]) && !Character.isDigit(ch2[i])) {
					 ch2[i] =ch2[i];
				 }
			}
			FileWriter fr2 = new FileWriter(encodedFile);
			fr2.write(ch2);
			fr2.close();//一定要加
			System.out.println("\n加密之後的字符爲:");
			for(char a:ch2) {
				System.out.print(a);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

這裏要推薦一下how2j這個網站,裏面有java全棧開發的詳細技能,關鍵是這個網站裏配的很多的練習題目,這點很贊!鏈接如下:https://how2j.cn?p=149636

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章