第1关:Java输入输出之文件字符IO流之文件加密
任务描述
本关任务:对给定文件的内容加密,并将加密后的内容输出到另一个文件。
相关知识
之前我们学习了 Reader(字符输入流)和 Writer (字符输出流),下面我们来了解一下它们的常用子类,FileReader (文件字符输入流)和 FileWriter(文件字符输出流)。
FileReader (文件字符输入流)
FileReader 是 Reader 的子类,用于从文件中获取字符流。 ######FileReader 的构造方法 下表中是它的常用构造方法:
构造方法 | 说明 |
---|---|
FileReader(File file) | 通过打开一个到实际文件的连接来创建一个 FileReader 对象,该文件通过文件系统中的 File 对象指定 |
FileReader(String name) | 通过打开一个到实际文件的连接来创建一个 FileReader 对象,该文件通过文件系统中的路径名 name 指定 |
构造方法示例:
public static void main(String[] args) throws IOException{
// 通过File对象创建FileReader对象
File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
FileReader fileReader1 = new FileReader(file);
// 通过字符串路径直接创建FileReader对象
FileReader fileReader = new FileReader("C:\\Users\\yy\\Desktop\\file\\a.txt");
}
FileReader 的方法
下表中是它的常用方法:
方法名 | 方法说明 |
---|---|
read() | 从文件中读取单个字符,返回一个 int 型变量,代表读取到的字符 |
read(byte b[]) | 从文件中读取字符流到数组中 |
read(byte b[], int off, int len) | 从文件中读取字符到数组中。off:数组中的起始偏移量,len:写入的字符数 |
read(byte b[]) 方法使用示例:
public static void main(String[] args) throws IOException{
// 通过File对象创建FileReader对象,该路径下的a.txt文件中内容为abcd
File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
try(
FileReader fileReader = new FileReader(file);){
// 创建字符数组,长度为文件长度
char[] characters = new char[(int)file.length()];
// 读取字符流到数组中
int read = fileReader.read(characters);
// 打印数组
System.out.print(characters);
}
}
执行结果:
abcd
FileWriter (文件字符输出流)
FileWriter 是 Writer 的子类,用于将字符流写入到文件中。
FileWriter 构造方法
下表中是它的常用构造方法:
构造方法 | 说明 |
---|---|
FileWriter(File file) | 通过文件对象创建 FileWriter 对象 |
FileWriter(File file, boolean append) | 如果 append 参数为 true,则将字节写入文件末尾处,相当于追加信息。如果 append 参数为 false, 则覆盖文件信息 |
FileWriter(String name) | 通过字符串路径创建 FileWriter 对象 |
FileWriter(String name, boolean append) | 如果 append 参数为 true,则将字节写入文件末尾处,相当于追加信息。如果 append 参数为 false, 则覆盖文件信息 |
FileWriter(File file, boolean append) 构造方法示例:
public static void main(String[] args) throws IOException{
// 通过File对象创建FileWriter对象
File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
FileWriter filewriter = new FileWriter(file,false);
}
FileWriter 的方法
下表中是它的常用方法:
方法名 | 方法说明 |
---|---|
write(int b) | 将字符写入文件输出流 |
write(byte b[]) | 将字符数组写入文件输出流 |
write(byte b[], int off, int len) | 将字符数组写入文件输出流,off:数组中的起始偏移量,len:写入的字节数 |
close() | 关闭流 |
write(byte b[], int off, int len) 方法使用示例:
public static void main(String[] args) throws IOException{
// 通过File对象创建FileWriter对象,该路径下的a.txt文件中内容abcd
File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
try(FileWriter filewriter = new FileWriter(file,false);){
// 创建字符数组
char[] characters = {f,g,h,j};
// 将字符数组中部分数据写入文件流(从数组中下标为 1 的位置,取 2 个元素)
filewriter.write(characters,1,2);
}
}
执行结果:文件中写入了 gh,并且原字符串被覆盖了。
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,对给定文件的内容加密,并将加密后的内容输出到另一个文件,具体要求如下:
- 接收给定的一行字符串(如:/test/a.txt,/test/b.txt。字符串中第一个文件路径为源文件,第二个路径文件用于存储加密内容);
- 把源文件中的内容加密并写入到给定的文件中;
- 加密规则: 对于数字,如果不是 9,在原来的基础上加 1,比如 5 变成 6,3 变成 4;如果是 9,变成 0; 对于字母字符,字符需要保留大小写,如果是非 z 字符,向右移动一个,比如 d 变成 e,G 变成 H;如果是 z(Z),z->a,Z-A; 对于非字母字符,比如 '、&、^, 保留不变,中文也保留不变。
注意:给定字符串中的逗号分隔符为中文逗号。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
例: 测试输入:
/test/a.txt,/test/b.txt
预期输出(后台查看用于存储加密内容的文件产生的结果):
gtJg76$中
开始你的任务吧,祝你成功!
源代码:
import java.io.*;
import static java.lang.Character.isLetterOrDigit;
import java.util.Scanner;
public class FileTest {
public static void main(String[] args) throws IOException {
// 请在Begin-End间编写完整代码
/********** Begin **********/
// 接收给定字符串,获取相关路径
Scanner input = new Scanner(System.in);
String str = input.nextLine();
String[] array = str.split(",");
// 读取源文件
File file1 = new File(array[0]);
char[] chars = new char[Math.toIntExact(file1.length())];
try(
FileReader fileReader = new FileReader(file1);) {
fileReader.read(chars);
}
// 加密
for (int i = 0; i < chars.length; i ++){
chars[i] = (char) Encryption(chars[i]);
}
// 把加密后的内容保存到目标文件
File file2 = new File(array[1]);
try(
FileWriter fileWriter = new FileWriter(file2);) {
fileWriter.write(chars);
}
}
// 定义加密方法
public static int Encryption(int len){
if ((len >= '0' & len < '9') | (len >= 'a' & len < 'z') | (len >= 'A' & len < 'Z')){
return len + 1;
}else if (len == '9'){
return len - 9;
}else if (len == 'z' | len == 'Z'){
return len - 25;
}else {
return len;
}
}
/********** End **********/
}