------- android培训、java培训、期待与您交流! ----------
实现一个文件加密程序。要求:输入一个文件夹路径或者文件路径作为第一个参数,输入一个数字类型字符串作为密码(比如:123456),然后程序即可为该文件夹内的所有文件加密或者为该文件加密。当再次输入一个文件夹或者文件作为第一个参数,输入密码作为第二个参数的时候,然后程序可以将该文件夹下的所有文件解密或者为该文件解密。
思路:加密 即让人看不懂原来的文件内容就行
加密的方法 根据一个数异或一个数 两次还是那个数的道理
通过对制造一个一样的文件 把原来的文件中字节都异或1达到加密的目的
并在文件末尾通过RandomAccessFile流 添加上输入的密码来实现保存密码的问题
如何判断文件是否加过密 在每个文件加密的时候都会在文件名后加.lhy作为加密的依据 我名字的缩写
解码同上面加密的思路一样异或1即可解码 当然要输入对的密码才行 解码前同样利用RandomAccessFile流除去文件中的密码
package
博
客;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;
import javax.swing.JFileChooser;
public
class LX4 {
static
String password
=
null;
//无论加密还是解码都需要输入密码所以定义在外面了
/**
*
@param
args
*/
public
static
void main(
String[] args)
throws
Exception {
// TODO Auto-generated method stub
boolean b
=
false;
//用来接收
JFileChooser jfc
=
new JFileChooser();
jfc.setDialogTitle(
"请选择需要加密的文件夹或文件");
jfc.setDialogType(JFileChooser.OPEN_DIALOG);
// 设置 JFileChooser 支持 "Open"文件操作的类型值
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
// 设置文件选择器显示文件和文件夹
int res
= jfc.showOpenDialog(
null);
// 弹出一个 "Open File" 文件选择器对话框。
if (res
== jfc.APPROVE_OPTION) {
File dir
= jfc.getSelectedFile();
if(dir.isDirectory()) {jiamidirectory(dir,dir.getAbsolutePath());}
else ispass(dir.getAbsolutePath());
//password(dir.getAbsolutePath(),b);
}
}
private
static
void password(
String file)
throws
Exception
//解密文件前输入密码并判断是否正确
{
if(password
==
null)
{
System.out.println(
"请输入密码:");
Scanner reader
=
new Scanner(
System.in);
password
=reader.nextLine();}
RandomAccessFile raf
=
new RandomAccessFile(file,
"r");
//随机访问文件流 只读
StringBuffer sb
=
new
StringBuffer();
for(
int i
= password.length() ; i
>=
1 ; i
--)
//利用随机访问查看文件尾端是否有我添加的密码
{raf.seek(raf.length()
-i);
sb.append((
char)raf.read());
}
raf.close();
if(password.equals(sb.toString())) jiema(file,password);
else
System.out.println(
"密码错误");
}
private
static
void addpassword(
String file,
String password)
throws IOException
//在文件中加上密码
//通过RandomAccessFile流 在文件末端加上密码
{RandomAccessFile raf
=
new RandomAccessFile(file,
"rw");
raf.seek(raf.length());
raf.writeBytes(password);
raf.close();
System.out.println(file
+
" "
+
"加密成功");}
private
static
void minpassword(
String file,
String password)
throws IOException
//去除文件中的密码
//通过RandomAccessFile流 直接指向密码所在处用空格填掉
{RandomAccessFile raf
=
new RandomAccessFile(file,
"rw");
for(
int x
=password.length();x
>
0;x
--)
{raf.seek(raf.length()
-x);
raf.write(
"\0".getBytes());}
raf.close();}
private
static
void jiami(
String name)
throws
Exception {
//加密这里用了拼音
if(password
==
null)
//判断密码是否输入过 写这个为了不让加密文件夹时多打好几次密码
{
String s2
=
null;
System.out.println(
"请输入加密密码:");
Scanner reader
=
new Scanner(
System.in);
password
=reader.nextLine();
System.out.println(
"请再次输入加密密码:");
Scanner reader2
=
new Scanner(
System.in);
if(password
==reader2.nextLine()){
System.out.println(
"密码不一致");
return;}
//比对两次输入是否一致
if(password
==
null){
System.out.println(
"密码不为空");
return;}}
File f
=
new File(name);
BufferedInputStream br
=
null;
BufferedOutputStream bw
=
null;
br
=
new BufferedInputStream(
new FileInputStream(name));
bw
=
new BufferedOutputStream(
new FileOutputStream(name
+
".lhy"));
// 复习了一下用separator方便兼容不同系统的路径表达
byte[] b
=
new
byte[br.available()];
// 缓冲
//System.out.println(br.available());
int x ;
while ((x
= br.read(b))
!=
-1) {
for(
int z
=
0;z
<x;z
++)
{
//System.out.println(x);
b[z]
=(
byte) (b[z]^
1);}
bw.write(b);
}
bw.flush();
bw.close();
br.close();
addpassword(name
+
".lhy",password);
f.delete();
}
private
static
void jiema(
String name,
String s)
throws
Exception {
//解码这里也用了拼音 英文着急!
// TODO Auto-generated method stub
minpassword(name,s);
//去除文件中的密码
File f
=
new File(name);
String name2
=
null;
name2
=name.replaceAll(
"\\.lhy",
"");
//文件名中后缀.lhy
BufferedInputStream br
=
null;
BufferedOutputStream bw
=
null;
br
=
new BufferedInputStream(
new FileInputStream(name));
bw
=
new BufferedOutputStream(
new FileOutputStream(name2));
// 复习了一下用separator方便兼容不同系统的路径表达
byte[] b
=
new
byte[br.available()];
// 创建和文件同等大小的缓冲 毕老师视屏里看来的
int x
=
0;
while ((x
= br.read(b))
!=
-1) {
for(
int z
=
0;z
<x;z
++)
{b[z]
=(
byte) (b[z]^
1);
//异或实现加密
//if(z>br.available()-s.length()) b[z]=(byte)0;F
}
bw.write(b);
}
bw.flush();
br.close();
bw.close();
f.delete();
System.out.println(name2
+
" "
+
"解密成功");
}
private
static
void ispass(
String file)
throws
Exception
//判断是否加过密
{
File f
=
new File(file);
if(f.getName().matches(
"(.)+\\.lhy")) password(file);
//解密文件前输入密码并判断是否正确//利用正则表达式来判断文件中是否有.lhy字样
else jiami(file);
//加密文件
}
public
static
void jiamidirectory(File dir,
String path)
throws
Exception {
// 加密文件夹中的文件
File[] f
= dir.listFiles();
for (
int x
=
0; x
< f.length; x
++) {
if (f[x].isDirectory()) {
// 判断是否是文件夹 (应为主函数中以作判断所以是用来判断子文件夹的)
jiamidirectory(f[x], f[x].getAbsolutePath());
// 递归
}
else {
ispass(f[x].getAbsolutePath());
//判断是否加过密
}
}
}
}
五一休息2天就写了这4个代码 深深感觉到自己的不足 只能自己多练练了
活动地址:
http://bbs.itheima.com/forum.php?mod=viewthread&tid=116285