在DOS系統(tǒng)中源武,文件拷貝的命令:copy 源文件 目標(biāo)文件路徑
如果要實(shí)現(xiàn)文件的拷貝操作,有兩種方法:
方法一: 將所有的文件內(nèi)容一次性讀取到程序中胳搞,然后一次輸出会前;
- 需要開辟一個(gè)與文件大小一樣的數(shù)組,但是如果文件大小過大蛔溃,程序可能會(huì)崩潰绰沥;
方法二: 采用邊讀邊輸出的方式,就不會(huì)占用過大的內(nèi)存空間贺待;
現(xiàn)在需要拷貝二進(jìn)制數(shù)據(jù)徽曲,使用字節(jié)流比較合適。
設(shè)置啟動(dòng)參數(shù):
設(shè)置啟動(dòng)參數(shù)
范例: 代碼的基本實(shí)現(xiàn)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* @author liuwq
*
*/
public class CopyTest {
public static void main(String[] args) throws Exception{
long start = System.currentTimeMillis();
if (args.length != 2) {
System.out.println("啟動(dòng)參數(shù)有錯(cuò)");
System.exit(1);
}
File inFile = new File(args[0]);
if (!inFile.exists()) {
System.out.println("源文件不存在");
}
File outFile = new File(args[1]);
if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdirs();
}
//實(shí)現(xiàn)文件內(nèi)容的拷貝
InputStream input = new FileInputStream(inFile);
OutputStream output = new FileOutputStream(outFile);
int temp = 0;
while ((temp = input.read()) != -1) {
output.write(temp);
}
input.close();
output.close();
long end = System.currentTimeMillis();
System.out.println("拷貝花費(fèi)的時(shí)間:" + (end - start));
}
}
//執(zhí)行結(jié)果
拷貝花費(fèi)的時(shí)間:175402
以上的程序?qū)儆趩巫止?jié)拷貝麸塞,每一次讀取一個(gè)字節(jié)秃臣,所以循環(huán)耗費(fèi)的時(shí)間太長;如果改變以上代碼的性能問題哪工,可以使用部分?jǐn)?shù)據(jù)讀取并保存的方式奥此,回顧字節(jié)流的兩個(gè)操作方法:
- InputStream:
public int read(byte[] b) throws IOException
|- 將內(nèi)容讀取到字節(jié)數(shù)組中,如果沒有數(shù)據(jù)則返回 -1 雁比, - OutputStream:
public void write(byte[] b, int off, int len) throws IOException
|- 要設(shè)置的字節(jié)數(shù)組實(shí)際上就是read()方法里面使用的數(shù)組稚虎;
|- 一定是從字節(jié)數(shù)組的第0個(gè)元素開始輸出,輸出讀取的數(shù)據(jù)長度章贞。
范例:改進(jìn)拷貝操作
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 CopyTestVersion_2 {
public static void main(String[] args) throws IOException{
long start = System.currentTimeMillis();
if (args.length != 2) {
System.out.println("啟動(dòng)參數(shù)有錯(cuò)");
System.exit(1);
}
File inFile = new File(args[0]);
if (!inFile.exists()) {
System.out.println("源文件不存在");
}
File outFile = new File(args[1]);
if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdirs();
}
//實(shí)現(xiàn)文件內(nèi)容的拷貝
InputStream input = new FileInputStream(inFile);
OutputStream output = new FileOutputStream(outFile);
//實(shí)現(xiàn)文件拷貝
int temp = 0;
byte[] data = new byte[1024];
while ((temp = input.read(data)) != -1) {
output.write(data, 0, temp);
}
input.close();
output.close();
long end = System.currentTimeMillis();
System.out.println("拷貝花費(fèi)的時(shí)間:" + (end - start));
}
}