任务描述
本关任务:对给定文件的内容加密,并将加密后的内容输出到另一个文件。
相关知识
之前我们学习了 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文件中内容为abcdFile 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);}}执行结果:
abcdFileWriter (文件字符输出流)
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文件中内容abcdFile 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,并且原字符串被覆盖了
- 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 **********/
- }