Sao chép tệp Java (thay đổi kích thước bộ đệm)
Trong Java java.io.InputStream,java.io.OutputStream Tại
Giới thiệu một chương trình mẫu thực hiện xử lý sao chép bằng luồng đầu vào/đầu ra.
Trong xử lý sao chép bằng luồng, ngay cả các tệp lớn cũng có thể được sao chép tương đối nhanh bằng cách tăng kích thước bộ đệm đọc.
Trong chương trình mẫu, kích thước bộ đệm đọc dữ liệu có thể được chỉ định bằng một đối số.
Vùng đệm đọc được chỉ định được bảo mật trong vùng đệm JavaVM, do đó, việc sử dụng vùng đệm quá lớn sẽ dẫn đến hiệu quả kém. Vì vậy, chúng tôi cũng kiểm tra kích thước bộ đệm đọc dữ liệu hiệu quả khi sao chép tệp.
chương trình mẫu
/**
* Ghi dữ liệu từ luồng đầu vào sang luồng đầu ra.
*Luồng đầu vào/đầu ra sẽ bị đóng sau khi quá trình sao chép hoàn tất.
* @param trong luồng đầu vào
* Luồng đầu ra của hệ điều hành @param
* @param bufferSize Kích thước bộ đệm đọc dữ liệu (KB).
* @throws IOException Nếu xảy ra một số ngoại lệ xử lý đầu vào/đầu ra
*/
public static void copyStream(InputStream in, OutputStream os,
int bufferSize) ném IOException {
int len = -1;
byte[] b = byte mới[bufferSize * 1024];
thử {
while ((len = in.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
os.flush();
} Cuối cùng {
nếu (trong != null) {
thử {
ghim theo();
} bắt (IOException e) {
e.printStackTrace();
}
}
nếu (os != null) {
thử {
os.close();
} bắt (IOException e) {
e.printStackTrace();
}
}
}
}
chấp hành
Để sao chép tệp chương trình mẫu, chúng tôi đã chuẩn bị tệp 100 MB "100M.txt" ngay trong ổ C. Trong chương trình mẫu, C:\100M.txt , đọc dữ liệu theo đơn vị kích thước bộ đệm 1000KB. C:\a.txt Sao chép vào.
Mẫu được thực hiện trong môi trường sau.
Hệ điều hành: WindowsXP
CPU: Athlon 1.46GHz
Bộ nhớ: 1GB
JRE: 1.6.4
◆Ví dụ thực thi
/** * Ví dụ thực thi * @param args */ public static void main(String[] args) { try { copyStream("C:\\100M.txt", "C:\\a.txt",1000); } bắt (IOException e) { e.printStackTrace(); } }
Thay đổi kích thước bộ đệm
Để kiểm tra kích thước bộ đệm đọc dữ liệu hiệu quả khi sao chép tệp, hãy sử dụng đối số thứ ba của copyStream làm
Kết quả xử lý bản sao tương tự ở các đơn vị 1KB, 100KB, 1000KB và 10000KB được tóm tắt dưới đây.
Mặc dù không thể kết luận chỉ từ các kết quả trên, nhưng nếu bạn chỉ định kích thước bộ đệm đọc dữ liệu theo đơn vị 1000KB,
Kết quả cho thấy nó hiệu quả về mặt sử dụng heap và thời gian xử lý trong quá trình xử lý sao chép.
Kết quả tương tự cũng đạt được ngay cả khi kích thước tệp tăng lên (khoảng 1GB).
Mặt khác, khi sao chép một tập tin nhỏ (khoảng 1MB trở xuống), việc tăng kích thước bộ đệm sẽ rất lãng phí, vì vậy tôi nghĩ tốt hơn nên chỉ định khoảng 100KB.
Sử dụng FileChannel để có tốc độ nhanh hơn
java.io.InputStream,java.io.OutputStream
Xử lý sao chép rất quan trọng trong việc hiểu các luồng đầu vào/đầu ra, nhưng
I/O mới được giới thiệu trong J2SE1.4 java.nio.channels.FileChannel#transferTo
Bằng cách sử dụng phương pháp này, bạn có thể sao chép tập tin hiệu quả hơn.
Tiếp theo, tôi sẽ chỉ cho bạn cách sao chép tệp dễ dàng và nhanh chóng bằng FileChannel.
⇒ Sao chép tệp Java (dễ dàng và nhanh chóng)