文件加密解密(字节流)

注意
本文最后更新于 2023-12-08,文中内容可能已过时。

基本功能:给定一个密钥,读取文件内容,加密后,输出到另外一个文件。

这里使用文件输入流读取文件内容,然后每个字节和密码进行异或简单加密。加密完成,使用文件输出流写入另一个文件中。解密和加密方法一样。利用的是对同一个数异或两遍其值不变的性质。因此一个程序可以完成加密和解密功能。只需修改文件名即可。

1 文件加密解密

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package cn.lruihao.base;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class EncryptFile {

  public static void main(String[] args) throws IOException {
    byte pwd=123;//加密/解密密码
    FileInputStream f=new FileInputStream("src/cn/lruihao/base/EncryptFile.java");//待加密文件
    FileOutputStream fout=new FileOutputStream("encrypted.txt");//已加密文件
    System.out.println("开始加密。");
    int n=f.available()/5;
    byte[] b=new byte[n];//以一个字节数组的长度读取和复制
    int count=0;
    while((count=f.read(b,0,n))!=-1) {
      //写入之前先加密/解密
      for(int i=0;i<count;i++) {
        b[i]=(byte)(b[i]^pwd);//
      }
      fout.write(b,0,count);
    }
    System.out.println("完成加密");
    f.close();
    fout.close();
//    f=new FileInputStream("encrypted.txt");
//    fout=new FileOutputStream("unencrypted.txt");
//    System.out.println("开始解密。");
//    n=f.available()/5;
//    b=new byte[n];//以一个字节数组的长度读取和复制
//    count=0;
//    while((count=f.read(b,0,n))!=-1) {
//      //写入之前先加密/解密
//      for(int i=0;i<count;i++) {
//        b[i]=(byte)(b[i]^pwd);
//      }
//      fout.write(b,0,count);
//    }
//    System.out.println("完成解密");
//    f.close();
//    fout.close();
  }

}

2 文件复制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package cn.lruihao.base;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileStreamCopy {

  public static void main(String[] args) throws IOException {
    int size;
    FileInputStream f=new FileInputStream("src/cn/lruihao/base/FileStreamCopy.java");
    FileOutputStream fout=new FileOutputStream("copy-of-file.txt");
    System.out.println("总长度:"+(size=f.available()));
    int n=size/10;
    System.out.print("使用单字节方法读取后:");
    for(int i=0;i<n;i++) {
      fout.write(f.read());
    }
    System.out.println("剩余长度:"+f.available());
    System.out.println("读取一个字节数组后:");
    byte b[]=new byte[n];
    f.read(b);
    fout.write(b);
    System.out.println("剩余长度:"+f.available());
    System.out.println("读取余下数据:");
    int count=0;
    while((count=f.read(b,0,n))!=-1) {
      //System.out.println(count);
      fout.write(b,0,count);
    }
    System.out.println("剩余长度:"+f.available());
    f.close();
    fout.flush();
    fout.close();
  }

}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package cn.lruihao.base;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedStreamCopy {

  public static void main(String[] args) throws IOException {
    FileInputStream f=new FileInputStream("src/cn/lruihao/base/BufferedStreamCopy.java");
    FileOutputStream fout=new FileOutputStream("copy-of-file.txt");
    BufferedInputStream bis=new BufferedInputStream(f);
    BufferedOutputStream bos=new BufferedOutputStream(fout);
    System.out.println("开始复制。");
    int n=f.available()/5;
    byte[] b=new byte[n];
    int count=0;
    while((count=bis.read(b,0,n))!=-1) {
      bos.write(b,0,count);
    }
    System.out.println("复制完成");
    bis.close();
    bos.flush();
    bos.close();
    f.close();
    fout.flush();
    fout.close();
  }

}

相关内容

Buy me a coffee~
Lruihao 支付宝支付宝
Lruihao 微信微信
0%