文件的复制粘贴
需求:把文件从F盘复制到E盘
package com.rjxy;
import java.io.*;
public class FileOperation {
//一边读取一边写入
public void copyFile(String path,String objpath){
File file = new File(path);
String newPath = objpath+"\\"+file.getName();
//为了复制的安全性,一定要判断一下
if (path.equalsIgnoreCase(newPath)){
//因为是边读边写
System.err.println("要复制的文件路径绝对不能和目标路径一致,否则会发生不可逆的文件损坏或丢失");
return;
}
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file);
fos = new FileOutputStream(newPath);
byte bytes[] = new byte[1024];//通常我们每次读取 1kb--8kb 之间为宜,我们选1kb试试(1024字节)
int count = fis.read(bytes);
while (count!=-1){
fos.write(bytes,0,count);
fos.flush();
count = fis.read(bytes);
}
System.out.println("复制完毕");
} catch (IOException e) {
e.printStackTrace();
}finally {
//为了代码的健壮性,关闭输入流和输出流时应该分开写:
try {
if (fis!=null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fos!=null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
FileOperation fc = new FileOperation();
//需要给出要复制的文件路径和文件名称,目标文件存放路径
fc.copyFile("F:\\test\\国外留学.pdf","E:\\test");
}
}
执行结果:
并且文件没有损坏,与原文件保持同样大小。
文件加密与解密
学会了文件的复制,文件的加密就变得超级简单,执行过程都一样,只需要在写入时候,给某些字节或全部字节做些手脚,让复制后的文件不能正常打开,它会提示文件已损坏。
加密还要是可逆的,即文件的解密。
怎样设计一个优秀的加密算法,既可以使得加密的过程可逆,又可以保证加密算法足够强大不会让别人随意破解,那就成了问题。
这里我就随便设计了一个针对字节的文件加密算法:
//加密encryption/encode
public static byte[] encryption(byte[] bytes){
/**
* 设置一个加密算法,要求可逆,还可以通过解密得到原来的东西
* 我们这样做:每一个字节的值,都加上它的索引号
* 然后,交换第一个字节和最后一个字节的位置,即解密结束
*/
for (int i = 0;i<bytes.length;i++){
bytes[i] = (byte)(bytes[i]+i);
}
byte temp = bytes[0];
bytes[0] = bytes[bytes.length-1];
bytes[bytes.length-1] = temp;
return bytes;
}
//解密Decryption/decode
public static byte[] decryption(byte[] bytes){
/**
* 解密算法,是加密的逆过程
* 先交换第一个字节和最后一个字节的位置
* 然后,每一个字节的值,都减去它的索引号
*/
byte temp = bytes[0];
bytes[0] = bytes[bytes.length-1];
bytes[bytes.length-1] = temp;
for (int i = 0;i<bytes.length;i++){
bytes[i] = (byte)(bytes[i]-i);
}
return bytes;
}
进行文件加密:
在F盘我们准备了这样的一个视频文件:
在E盘我们保证test文件夹存在:
代码:
//文件加密
public void fileEncrypOption(String filepath,String objpath,boolean isEncryp){
File file = new File(filepath);
File newFile = new File(objpath);
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file);
fos = new FileOutputStream(newFile);
byte[] bytes = new byte[1024];
int count = fis.read(bytes);
while (count!=-1){
if (isEncryp){//加密
if (count==bytes.length){
fos.write(FileOperation.encryption(bytes));
}else {
byte[] b = new byte[count];
for (int i = 0;i<b.length;i++){
b[i] = bytes[i];
}
fos.write(FileOperation.encryption(b));
}
}else {//解密
if (count==bytes.length){
fos.write(FileOperation.decryption(bytes));
}else {
byte[] b = new byte[count];
for (int i = 0;i<b.length;i++){
b[i] = bytes[i];
}
fos.write(FileOperation.decryption(b));
}
}
fos.flush();
count = fis.read(bytes);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fis!=null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos!=null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
main方法:
public static void main(String[] args) {
FileOperation fc = new FileOperation();
String path = "F:\\test\\快手.mp4";
String objPath = "E:\\test\\快手.mp4";
fc.fileEncrypOption(path,objPath,true);//加密
}
执行结果:
同时这个视频是无法播放的:
解密:
public static void main(String[] args) {
FileOperation fc = new FileOperation();
String path = "F:\\test\\快手.mp4";
String objPath = "E:\\test\\快手.mp4";
//fc.fileEncrypOption(path,objPath,true);//加密
fc.fileEncrypOption(objPath,path,false);//解密
}
解密成功: