Làm cách nào tôi có thể nhận được kích thước của tệp hoặc thư mục bằng cách sử dụng NIO mới trong java 7?Nhận kích thước tệp/thư mục bằng cách sử dụng Java 7 new IO
Trả lời
Sử dụng Files.size(Path)
để lấy kích thước của tệp.
Đối với kích thước của một thư mục (nghĩa là kích thước của tất cả các tệp chứa trong thư mục), bạn vẫn cần phải recurse theo cách thủ công, theo như tôi biết.
MutableLong size = new MutableLong();
Files.walkFileTree(directoryPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
size.add(attrs.size());
}
}
Điều này sẽ tính toán kích thước của tất cả các tệp trong một thư mục. Tuy nhiên, lưu ý rằng tất cả các tệp trong thư mục cần phải là tệp thông thường, vì API chỉ định phương thức kích thước của BasicFileAttributes:
"Kích thước tệp không phải là tệp thông thường được triển khai cụ thể và do đó không xác định."
Nếu bạn vấp phải tệp không được kiểm soát, bạn sẽ có hoặc không bao gồm kích thước tệp hoặc trả về một số kích thước không xác định. Bạn có thể kiểm tra xem tệp có thường xuyên với
BasicFileAttributes.isRegularFile()
Câu trả lời hay, và đối với bất cứ ai tự hỏi các lớp Mutable * cho nguyên thủy là một phần của apache.commons.lang – Nicholi
Đây là ví dụ sẵn sàng chạy cũng sẽ bỏ qua và không thể nhập thư mục. Nó sử dụng java.util.concurrent.atomic.AtomicLong
để tích lũy trạng thái.
public static void main(String[] args) throws IOException {
Path path = Paths.get("c:/");
long size = getSize(path);
System.out.println("size=" + size);
}
static long getSize(Path startPath) throws IOException {
final AtomicLong size = new AtomicLong(0);
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
size.addAndGet(attrs.size());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc)
throws IOException {
// Skip folders that can't be traversed
System.out.println("skipped: " + file + "e=" + exc);
return FileVisitResult.CONTINUE;
}
});
return size.get();
}
Tự hỏi tại sao 'AtomicLong' lại cần thiết? Tại sao không chỉ là một 'long'? Có điều gì đó song hành về [walkFileTree] không (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree%28java.nio.file.Path,%20java. util.Set,% 20int,% 20java.nio.file.FileVisitor% 29)? – peterh
tbh, tôi chỉ viết lại câu trả lời khác mà không sử dụng 3pp (MutableLong). Nhưng tôi nghĩ rằng biến phải là "cuối cùng" để được truy cập từ lớp ẩn danh bên trong. AtomicLong cho phép. –
Phương thức 'postVisitDirectory' cũng có thể được ghi đè lên. Không cần đánh dấu tham chiếu 'size' là cuối cùng ở đây vì nó không bị thay đổi trong lớp ẩn danh bên trong. Chỉ có nội dung (giá trị) của nó được thay đổi. Một mảng dài (với một phần tử duy nhất) có thể được sử dụng thay cho AtomicLong. – Stephan
- 1. Nhận kích thước thư mục
- 2. Đọc hex trong C# bằng cách sử dụng IO
- 3. Nhận loại/kích thước của `time_t` bằng cách sử dụng ctypes
- 4. Java InputStream kích thước
- 5. Cách ẩn thư mục bằng cách sử dụng java
- 6. Nhận kích thước tệp bằng Python?
- 7. Kích thước Java ImageIcon
- 8. Cách nhận kích thước màn hình bằng mã?
- 9. Điều khiển mức mục trên kích thước mục ribbon bằng cách sử dụng ribbon WPF (cho .NET 4) và RibbonControlSizeDefinition
- 10. Tại sao kích thước bộ đệm mặc định là 8k trong Java IO?
- 11. Sao chép thư mục trong khi vẫn giữ liên kết tượng trưng bằng cách sử dụng Java File/IO API
- 12. Nhận kích thước tệp bằng cách sử dụng yêu cầu python, trong khi chỉ nhận được tiêu đề
- 13. MPI_Recv: Nhận kích thước khác với kích thước được gửi
- 14. Nhận kích thước màn hình hiệu quả từ Java
- 15. Đệ quy nhận kích thước của một thư mục
- 16. Ghim một ứng dụng Java bằng cách sử dụng Launch4j vào thanh công cụ Windows 7
- 17. Bắt kích thước tiêu đề khác nhau bằng cách thay đổi kích thước cửa sổ
- 18. Cách nhận kích thước màn hình trên Windows Phone 7 Series?
- 19. Cách phát hiện kích thước của tệp bằng cách sử dụng API tệp và Dropzone.js
- 20. Cách nhận kích thước hộp thoại?
- 21. Làm thế nào để giảm kích thước mp4 bằng cách sử dụng FFMPEG lib vào android
- 22. Cách nhắm mục tiêu kích thước màn hình cụ thể bằng cách sử dụng truy vấn phương tiện @ media?
- 23. Phát hiện kích thước phông chữ bằng pixel bằng cách sử dụng jQuery
- 24. Java 7 phá vỡ ứng dụng SWT trên OS X bằng cách sử dụng Web Start
- 25. Nhận kích thước yêu cầu POST bằng PHP
- 26. Làm cách nào để nhận được kích thước tệp bằng megabyte bằng Perl?
- 27. "new Foo() {}" và "new Foo()" trong Java
- 28. kích thước thư mục android
- 29. Cách nhận thời lượng, kích thước và kích thước video trong PHP?
- 30. Maven không sử dụng Java 7
Có gì sai với cách cũ? Trừ khi có hỗ trợ cho kích thước thư mục đệ quy ngay bây giờ. Lanhung? – Thilo
Tôi đã nghe nó nhanh hơn rất nhiều. và tôi muốn thử điều đó. – clamp
Tôi phải tự hỏi làm thế nào nó có thể được nhanh hơn .. – Thilo