檔案與流課後作業
檔案與流——課後作業
1、編寫一個程式,指定一個資料夾,能自動計算出其總容量
源程式:
package 指定資料夾的總容量;
import java.io.File;
import java.util.ArrayList;
public class Size {
static long size=0;
private static ArrayList<String> filelist=new ArrayList<String>();
public static void main(String[] args) {
Size s=new Size();
String filePath="F:\\2345Explorer";
s.getFiles(filePath);
}
//通過遞迴得到某一路徑下所有的目錄及檔案
void getFiles(String filePath) {
File root=new
File[] files=root.listFiles();
for(File file:files) {
if(file.isDirectory()) {
getFiles(file.getAbsolutePath());
filelist.add(file.getAbsolutePath());
}
else {
size+=file.getAbsolutePath().length();
}
}
System.out.println("大小是"+size);
}
}
執行測試結果:
大小是431
大小是868
大小是964
大小是1054
大小是1254
大小是1322
大小是2013
大小是2259
大小是2338
大小是2338
大小是3655
大小是3655
大小是3655
大小是3655
大小是3749
2、編寫一個檔案加解密程式,通過命令列完成加解密工作
原始碼:
package 檔案的解加密;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
public class TestDES {
Key key;
public TestDES(String str) {
getKey(str);//生成密匙
}
/**
* 根據引數生成KEY
*/
public void getKey(String strKey) {
try {
KeyGenerator _generator = KeyGenerator.getInstance("DES");
_generator.init(new SecureRandom(strKey.getBytes()));
this.key = _generator.generateKey();
_generator = null;
} catch (Exception e) {
throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);
}
}
/**
* 檔案file進行加密並儲存目標檔案destFile中
*
* @param file 要加密的檔案 如c:/test/srcFile.txt
* @param destFile 加密後存放的檔名 如c:/加密後文件.txt
*/
public void encrypt(String file, String destFile) throws Exception {
Cipher cipher = Cipher.getInstance("DES");
// cipher.init(Cipher.ENCRYPT_MODE, getKey());
cipher.init(Cipher.ENCRYPT_MODE, this.key);
InputStream is = new FileInputStream(file);
OutputStream out = new FileOutputStream(destFile);
CipherInputStream cis = new CipherInputStream(is, cipher);
byte[] buffer = new byte[1024];
int r;
while ((r = cis.read(buffer)) > 0) {
out.write(buffer, 0, r);
}
cis.close();
is.close();
out.close();
}
/**
* 檔案採用DES演算法解密檔案
*
* @param file 已加密的檔案 如c:/加密後文件.txt
* * @param destFile
* 解密後存放的檔名 如c:/ test/解密後文件.txt
*/
public void decrypt(String file, String dest) throws Exception {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, this.key);
InputStream is = new FileInputStream(file);
OutputStream out = new FileOutputStream(dest);
CipherOutputStream cos = new CipherOutputStream(out, cipher);
byte[] buffer = new byte[1024];
int r;
while ((r = is.read(buffer)) >= 0) {
System.out.println();
cos.write(buffer, 0, r);
}
cos.close();
out.close();
is.close();
}
public static void main(String[] args){
TestDES td = new TestDES("aaa");
try {
td.encrypt("e:/r.txt", "e:/r加密後.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //加密
try {
td.decrypt("e:/r加密後.txt", "e:/r解密後.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //解密
}
}
執行測試結果:
我在指定的位置建立了一個文字檔案,並錄入了一段文字:
需要被加密的文字。
通過加密之後得到了一個新的檔案,文字內容被加密為了:
謱??o沑?儩g櫉7鮄\x
通過程式進行解密,得到了一個解密之後的檔案,文字內容為
需要被加密的文字。
以此便達到了對文字檔案的加密操作,並且可以對之進行解密操作。
3、編寫一個檔案分割工具,能把一個大檔案分割成多個小的檔案。並且能再次把它們合併起來得到完整的檔案。
原始碼:
package 檔案的分割合併;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class FileSliptUtil {
public static void splitFileDemo(File src, int m) throws IOException {
if(src.isFile()) {
//獲取檔案的總長度
long l = src.length();
//獲取檔名
String fileName = src.getName().substring(0, src.getName().indexOf("."));
//獲取檔案字尾
String endName = src.getName().substring(src.getName().lastIndexOf("."));
System.out.println(endName);
InputStream in = null;
try {
in = new FileInputStream(src);
for(int i = 1; i <= m; i++) {
StringBuffer sb = new StringBuffer();
sb.append(src.getParent());
sb.append("\\");
sb.append(fileName);
sb.append("_data");
sb.append(i);
sb.append(endName);
System.out.println(sb.toString());
File file2 = new File(sb.toString());
//建立寫檔案的輸出流
OutputStream out = new FileOutputStream(file2);
int len = -1;
byte[] bytes = new byte[10*1024*1024];
while((len = in.read(bytes))!=-1) {
out.write(bytes, 0, len);
if(file2.length() > (l / m)) {
break;
}
}
out.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(in != null)
in.close();
}
System.out.println("--- 檔案分割完成 ---");
}
}
public static void joinFileDemo(String[] src) {
// 獲取合併檔案
File newFile = new File(src[0].toString());
// 獲取檔名 字尾
String fileName = newFile.getName().substring(0, newFile.getName().indexOf("_"));
String endName = newFile.getName().substring(newFile.getName().lastIndexOf("."));
// 得到新的檔名
StringBuffer sb = new StringBuffer();
sb.append(newFile.getParent());
sb.append("\\");
sb.append(fileName);
sb.append(endName);
newFile = new File(sb.toString());
for(int i = 0; i < src.length; i++) {
File file = new File(src[i]);
try {
//讀取小檔案的輸入流
InputStream in = new FileInputStream(file);
OutputStream out = new FileOutputStream(newFile, true);
int len = -1;
byte[] bytes = new byte[10*1024*1024];
while((len = in.read(bytes))!=-1) {
out.write(bytes, 0, len);
}
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("檔案合併完成!");
}
public class TestFileSlipt {
public void main(String[] args) throws Exception {
//分割檔案
FileSliptUtil.splitFileDemo(new File("檔案路徑"), 2);
//合併檔案
FileSliptUtil.joinFileDemo(new String[]{"檔案路徑", "檔案路徑"});
}
}
}