近日在做有关access文件生成的功能。但是sun公司的ojdbc包自带的acceess操作方法不支持跨平台。于是找了第三方的 Access_JDBC30.jar 包。这个包可以跨平台使用。但是是要收费的。免费版本加载一次包只能有50次的链接。用到的insert语句一多就报错。于是改用文本文件加密方式导数据。加密代码如下
package
com.copy.encrypt;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.io.RandomAccessFile;
public
class
FileEncryptAndDecrypt {
/**
* 文件file进行加密
* @param fileUrl 文件路径
* @param key 密码
* @throws Exception
*/
public
static
void
encrypt(String fileUrl, String key)
throws
Exception {
File file =
new
File(fileUrl);
String path = file.getPath();
if
(!file.exists()){
return
;
}
int
index = path.lastIndexOf(
"\\"
);
String destFile = path.substring(
0
, index)+
"\\"
+
"abc"
;
File dest =
new
File(destFile);
InputStream in =
new
FileInputStream(fileUrl);
OutputStream out =
new
FileOutputStream(destFile);
byte
[] buffer =
new
byte
[
1024
];
int
r;
byte
[] buffer2=
new
byte
[
1024
];
while
(( r= in.read(buffer)) >
0
) {
for
(
int
i=
0
;i<r;i++)
{
byte
b=buffer[i];
buffer2[i]=b==
255
?
0
:++b;
}
out.write(buffer2,
0
, r);
out.flush();
}
in.close();
out.close();
file.delete();
dest.renameTo(
new
File(fileUrl));
appendMethodA(fileUrl, key);
System.out.println(
"加密成功"
);
}
/**
*
* @param fileName
* @param content 密钥
*/
public
static
void
appendMethodA(String fileName, String content) {
try
{
// 打开一个随机访问文件流,按读写方式
RandomAccessFile randomFile =
new
RandomAccessFile(fileName,
"rw"
);
// 文件长度,字节数
long
fileLength = randomFile.length();
//将写文件指针移到文件尾。
randomFile.seek(fileLength);
randomFile.writeBytes(content);
randomFile.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
/**
* 解密
* @param fileUrl 源文件
* @param tempUrl 临时文件
* @param ketLength 密码长度
* @return
* @throws Exception
*/
public
static
String decrypt(String fileUrl, String tempUrl,
int
keyLength)
throws
Exception{
File file =
new
File(fileUrl);
if
(!file.exists()) {
return
null
;
}
File dest =
new
File(tempUrl);
if
(!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
InputStream is =
new
FileInputStream(fileUrl);
OutputStream out =
new
FileOutputStream(tempUrl);
byte
[] buffer =
new
byte
[
1024
];
byte
[] buffer2=
new
byte
[
1024
];
byte
bMax=(
byte
)
255
;
long
size = file.length() - keyLength;
int
mod = (
int
) (size%
1024
);
int
div = (
int
) (size>>
10
);
int
count = mod==
0
?div:(div+
1
);
int
k =
1
, r;
while
((k <= count && ( r = is.read(buffer)) >
0
)) {
if
(mod !=
0
&& k==count) {
r = mod;
}
for
(
int
i =
0
;i < r;i++)
{
byte
b=buffer[i];
buffer2[i]=b==
0
?bMax:--b;
}
out.write(buffer2,
0
, r);
k++;
}
out.close();
is.close();
return
tempUrl;
}
/**
* 判断文件是否加密
* @param fileName
* @return
*/
public
static
String readFileLastByte(String fileName,
int
keyLength) {
File file =
new
File(fileName);
if
(!file.exists())
return
null
;
StringBuffer str =
new
StringBuffer();
try
{
// 打开一个随机访问文件流,按读写方式
RandomAccessFile randomFile =
new
RandomAccessFile(fileName,
"r"
);
// 文件长度,字节数
long
fileLength = randomFile.length();
//将写文件指针移到文件尾。
for
(
int
i = keyLength ; i>=
1
; i--){
randomFile.seek(fileLength-i);
str.append((
char
)randomFile.read());
}
randomFile.close();
return
str.toString();
}
catch
(IOException e) {
e.printStackTrace();
}
return
null
;
}
}