作业要求
作业难点
- 文件转换为字符串,并对字符串进行加密,加密后进行解密
- 文件的递归读取
- 文件的压缩,Zip流的使用
作业代码
作业1
本代码参考意义价值不大,文件读取较为冗余,用于博主本人记录。
里面字符串加密的工具转载于为“com.openailab.oascloud.gateway.util.EncryptUtil”
作者为:zxzhang
public class EncryptOrDecipher {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int mode = 0;
String pathName = "";
int method = 0;
System.out.println("请输入您需要加密还是解密?1、加密,2、解密");
mode = in.nextInt();
String keyString = "";
if(mode == 1){
System.out.println("请输入您需要加密的文件/文件夹");
pathName = in.next();
System.out.println("请输入您需要加密的方式:1、BASE 64加密;2、DES 加密");
method = in.nextInt();
File fileInput = new File(pathName);
if(method == 2){
System.out.println("您选择的是DES加密,请输入一个秘钥(请务必记住):");
keyString = in.next();
}
if(!fileInput.isDirectory()){
encryptDocument(fileInput, fileInput.getParent(), method,keyString);
}else{
encryptFile(fileInput, fileInput.getParent(), method,keyString);
}
}else if(mode == 2){
System.out.println("请注意!解压后的绝对路径文件若已经存在,会进行覆盖");
System.out.println("请输入您需要解密的文件/文件夹");
pathName = in.next();
System.out.println("请输入您需要解密的方式:1、BASE 64解密;2、DES 解密");
method = in.nextInt();
if(method == 2){
System.out.println("您选择的是DES解密,请输入一个秘钥(请务必记住):");
keyString = in.next();
}
File fileInput = new File(pathName);
if(!fileInput.isDirectory()){
decipherDocument(fileInput, fileInput.getParent(), method,keyString);
}else{
decipherFile(fileInput, fileInput.getParent(), method,keyString);
}
}
}
//加密文件
//参数:加密文件,加密方法
public static void encryptDocument(File fileInput,String fileInputPathParent,int encryptMethod,String keyString){
String[] fileNames = fileInput.getName().split("\\.");
String encryptAbsolutePath = fileInputPathParent+"\\"+fileNames[0]+"enc"+"."+fileNames[1];
System.out.println("您要加密的文件存放的绝对路径:"+encryptAbsolutePath);
FileInputStream fileInputStream =null;
FileOutputStream fileOutputStream = null;
try {
//输入流
fileInputStream = new FileInputStream(fileInput);
//输出流
fileOutputStream = new FileOutputStream(new File(encryptAbsolutePath));
int size = fileInputStream.available();
byte[] buffer = new byte[size];
fileInputStream.read(buffer);
String strBforEnc = byToString(buffer);
//分三种不同的情况进行加密
if(encryptMethod == 1){
String encryptStrByBase64 = EncryptUtil.encryptByBase64(strBforEnc);
byte[] bytesAfterEnc = StringToBy(encryptStrByBase64);
fileOutputStream.write(bytesAfterEnc);
}else if(encryptMethod == 2){
String encryptStrByDes = EncryptUtil.encryptByDes(strBforEnc,StringToBy(keyString));
byte[] bytesAfterEnc = StringToBy(encryptStrByDes);
fileOutputStream.write(bytesAfterEnc);
}else{
}
fileOutputStream.close();
fileInputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
public static void encryptFile(File fileInput,String fileInputPathParent,int encryptMethod,String keyString){
File[] files = fileInput.listFiles();
String encryPath = fileInputPathParent+"\\"+fileInput.getName()+"enc";
File encryFile = new File(encryPath);
if(!encryFile.exists()){
encryFile.mkdir();
}
//递归下去加密
for (File file : files) {
if(!file.isDirectory()){
encryptDocument(file,encryFile.getAbsolutePath(),encryptMethod,keyString);
}else{
encryptFile(file,encryFile.getAbsolutePath(),encryptMethod,keyString);
}
}
}
//解密文件
public static void decipherDocument(File fileInput,String fileInputPathParent,int encryptMethod,String keyString){
String[] fileNames = fileInput.getName().split("\\.");
int len = fileNames[0].length();
String encryptAbsolutePath = fileInputPathParent+"\\"+fileNames[0].substring(0,len-3)+"."+fileNames[1];
System.out.println("您要解密的文件存放的绝对路径:"+encryptAbsolutePath);
FileInputStream fileInputStream =null;
FileOutputStream fileOutputStream = null;
try {
//输入流
fileInputStream = new FileInputStream(fileInput);
//输出流
fileOutputStream = new FileOutputStream(new File(encryptAbsolutePath));
int size = fileInputStream.available();
byte[] buffer = new byte[size];
fileInputStream.read(buffer);
String strAfterEnc = byToString(buffer);
//分三种不同的情况进行解密
if(encryptMethod == 1){
String decryptByBase64 = EncryptUtil.decryptByBase64(strAfterEnc);
byte[] bytesBeforEnc = StringToBy(decryptByBase64);
fileOutputStream.write(bytesBeforEnc);
}else if(encryptMethod == 2){
String decryptByDES = EncryptUtil.decryptByDes(strAfterEnc,StringToBy(keyString));
byte[] bytesAfterEnc = StringToBy(decryptByDES);
fileOutputStream.write(bytesAfterEnc);
}else{
}
fileOutputStream.close();
fileInputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
//解密文件夹
public static void decipherFile(File fileInput,String fileInputPathParent,int encryptMethod,String keyString){
File[] files = fileInput.listFiles();
int len = fileInput.getName().length();
String decryPath = fileInputPathParent+"\\"+fileInput.getName().substring(0,len-3);
File decryFile = new File(decryPath);
if(!decryFile.exists()){
decryFile.mkdir();
}
//递归下去加密
for (File file : files) {
if(!file.isDirectory()){
decipherDocument(file,decryFile.getAbsolutePath(),encryptMethod,keyString);
}else{
decipherFile(file,decryFile.getAbsolutePath(),encryptMethod,keyString);
}
}
}
//byte数组转换为String
public static String byToString(byte[] buff){
int size = buff.length;
char[] byToChs = new char[size];
for(int i =0;i<size;i++){
byToChs[i] = (char) buff[i];
}
StringBuilder sb = new StringBuilder();
sb.append(byToChs);
String str = sb.toString();
return str;
}
//String转换为byte数组
public static byte[] StringToBy(String str){
char[] strTochs = str.toCharArray();
int size = strTochs.length;
byte[] buffer = new byte[size];
for(int i = 0;i<size;i++){
buffer[i] = (byte) strTochs[i];
}
return buffer;
}
课后作业2
public class ZipFile {
public void zip(String zipFileName,File inputFile) throws Exception{
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
zip(out,inputFile,"");
out.close();
}
public void zip(ZipOutputStream out,File inputFile,String base) throws Exception{
if(inputFile.isDirectory()){
File[] files = inputFile.listFiles();
// out.putNextEntry(new ZipEntry(base+"/"));
base = base.length() == 0 ? "":base+"/";
for (File file : files) {
System.out.println(file);
zip(out,file,base+file.getName());
}
}else {
out.putNextEntry(new ZipEntry(base));
FileInputStream fin = new FileInputStream(inputFile);
int by;
System.out.println(base);
while((by=fin.read())!= -1){
out.write(by);
}
fin.close();
}
}
public static void main(String[] args) {
ZipFile zipFile = new ZipFile();
try{
System.out.println("请输入你想要压缩的文件/文件夹的绝对路径:");
Scanner in = new Scanner(System.in);
String path = in.next();
System.out.println("压缩中");
zipFile.zip("zipFile.zip",new File(path));
System.out.println("压缩完成");
}catch (Exception e){
e.printStackTrace();
}
}
}
此代码参考博客
点击此处
略带修改,该博文解释的相当清楚,学习之。