- 需求
数字:
如果不是9
的数字,在原来的基础上加1
,比如5
变成6
,3
变成4
如果是9
的数字,变成0
字母字符:
如果是非z
字符,向右移动一个,比如d
变成e
,G
变成H
如果是z,z->a, Z-A
。
字符需要保留大小写
非字母字符
比如',&^
保留不变,中文也保留不变 - 第一次实现思路:
第一次实现使用if对字符进行分类判断,但是由于没有将细节考虑全面,在最后在处理zZ
和9
上面出现问题。有空再来补充为什么对他们的处理会出现问题。 - 遇到的问题:
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...
对zZ
和9
进行处理,实际还有一个问题,想想看,对中文字符如何处理?这里还有一个特殊情况,下次在进行补充。除中文字符实现的过程如下:
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