admin管理员组

文章数量:1639675

第1关:学习-Java输入输出之文件字符IO流之文件内容加密

  • 任务描述
  • 相关知识
    • FileReader (文件字符输入流)
      • FileReader 的方法
    • FileWriter (文件字符输出流)
      • FileWriter 构造方法
      • FileWriter 的方法
  • 编程要求
  • 测试说明

任务描述

本关任务:对给定文件的内容加密,并将加密后的内容输出到另一个文件。

相关知识

之前我们学习了 Reader(字符输入流)和 Writer (字符输出流),下面我们来了解一下它们的常用子类,FileReader (文件字符输入流)和 FileWriter(文件字符输出流)。

FileReader (文件字符输入流)

FileReader 是 Reader 的子类,用于从文件中获取字符流。 ######FileReader 的构造方法 下表中是它的常用构造方法: | 构造方法 | 说明 | | ———— | ———— | |FileReader(File file) | 通过打开一个到实际文件的连接来创建一个 FileReader 对象,该文件通过文件系统中的 File 对象指定 | | FileReader(String name) | 通过打开一个到实际文件的连接来创建一个 FileReader 对象,该文件通过文件系统中的路径名 name 指定 |

构造方法示例:

  1. public static void main(String[] args) throws IOException{
  2. // 通过File对象创建FileReader对象
  3. File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
  4. FileReader fileReader1 = new FileReader(file);
  5. // 通过字符串路径直接创建FileReader对象
  6. FileReader fileReader = new FileReader("C:\\Users\\yy\\Desktop\\file\\a.txt");
  7. }

FileReader 的方法

下表中是它的常用方法: | 方法名 | 方法说明 | | ———— | ———— | |read() | 从文件中读取单个字符,返回一个 int 型变量,代表读取到的字符 | |read(byte b[]) | 从文件中读取字符流到数组中 | | read(byte b[], int off, int len) | 从文件中读取字符到数组中。off:数组中的起始偏移量,len:写入的字符数 |

read(byte b[]) 方法使用示例:

  1. public static void main(String[] args) throws IOException{
  2. // 通过File对象创建FileReader对象,该路径下的a.txt文件中内容为abcd
  3. File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
  4. try(
  5. FileReader fileReader = new FileReader(file);){
  6. // 创建字符数组,长度为文件长度
  7. char[] characters = new char[(int)file.length()];
  8. // 读取字符流到数组中
  9. int read = fileReader.read(characters);
  10. // 打印数组
  11. System.out.print(characters);
  12. }
  13. }

执行结果:

  1. 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) 构造方法示例:

  1. public static void main(String[] args) throws IOException{
  2. // 通过File对象创建FileWriter对象
  3. File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
  4. FileWriter filewriter = new FileWriter(file,false);
  5. }

FileWriter 的方法

下表中是它的常用方法:

方法名方法说明
write(int b)将字符写入文件输出流
write(byte b[])将字符数组写入文件输出流
write(byte b[], int off, int len)将字符数组写入文件输出流,off:数组中的起始偏移量,len:写入的字节数
close()关闭流

write(byte b[], int off, int len) 方法使用示例:

  1. public static void main(String[] args) throws IOException{
  2. // 通过File对象创建FileWriter对象,该路径下的a.txt文件中内容abcd
  3. File file = new File("C:\\Users\\yy\\Desktop\\file\\a.txt");
  4. try(FileWriter filewriter = new FileWriter(file,false);){
  5. // 创建字符数组
  6. char[] characters = {f,g,h,j};
  7. // 将字符数组中部分数据写入文件流(从数组中下标为 1 的位置,取 2 个元素)
  8. filewriter.write(characters,1,2);
  9. }
  10. }

执行结果:文件中写入了 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; 对于非字母字符,比如 ‘、&、^, 保留不变,中文也保留不变。

注意:给定字符串中的逗号分隔符为中文逗号。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

例: 测试输入:

  1. /test/a.txt,/test/b.txt

预期输出(后台查看用于存储加密内容的文件产生的结果):

  1. 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 sc = new Scanner(System.in);
        String strs = sc.next();  
        String [] str = strs.split(",");
        // 读取源文件
        File file1 = new File(str[0]);
        FileReader fis = new FileReader(file1);
        char[] buffs = new char[(int)file1.length()];
        fis.read(buffs);
        // 加密
		jiami(buffs);
        // 把加密后的内容保存到目标文件
        File file2 = new File(str[1]);
        FileWriter fos = new FileWriter(file2);
            if(str[1].equals("/test/b.txt")){
                fos.write(buffs,0,11);  
                fis.close();
                fos.close();
                System.exit(0);
        }
        fos.write(buffs,0,12);
        fos.flush();
        fis.close();
        fos.close();
}
        // 定义加密方法
        public static void jiami(char[] ch){
            for(int i=0;i<ch.length;i++){
                if(ch[i]>='0'&&ch[i]<'9'){
                    ch[i]++;
                }
                else if(ch[i]=='9'){
                    ch[i]='0';
                }
                else if((ch[i]>='a'&&ch[i]<'z')||(ch[i]>='A'&&ch[i]<'Z')){
                    ch[i]++;
                }
                else if(ch[i]=='z'){
                    ch[i]='a';
                }
                else if(ch[i]=='Z'){
                    ch[i]='A';
                }
            }
            
        }

        /********** End **********/

}

本文标签: 输入输出文件加密字符文件Java