2016-01-29 283 views
1

1>對於空目錄,linux命令du將顯示0大小,這意味着它不使用磁盤空間。對? 但是java中的File.length()不會顯示零,而是會顯示使用某些字節的空目錄。爲什麼java中的File.length()的大小與linux du命令的大小不同

如果Unix中的所有內容都是文件並且應占用磁盤空間,那麼Java就在這裏,爲什麼du會顯示其0個塊。

如果它應該是0塊,那麼爲什麼Java會顯示空目錄使用的某些字節?

$ mkdir empty_directory 
$ du -h empty_directory/ 
    0B empty_directory/ 
$ du empty_directory 
    0  empty_directory 


File f = new File("/test/empty_directory"); 
if (f.exists() && f.isDirectory()) { 
    System.out.println(f.length()); 
} 

68 

2>對於同一個沒有空文件,Linux命令du顯示的大小仍然與java中的File.length()不同。
僅僅是來自差異單位的原因:du使用的塊和File.length()使用的字節數?

$ du -h oneline.txt 
4.0K oneline.txt 
$ du oneline.txt 
8 oneline.txt 
$ ls -s oneline.txt 
8 oneline.txt 

-s顯示實際使用的每個文件的文件系統的塊的數量,以512個字節,其中部分單元被向上舍入到下一個整數值的單位。如果輸出到終端,則在列表之前的一行中輸出所有文件大小的總和。環境變量BLOCKSIZE覆蓋512字節的單位大小。

File f = new File("/test/oneline.txt"); 
if (f.exists() && f.isFile()) { 
    System.out.println(f.length()); 
} 

26 

困惑。你能否就此提供一些幫助?

+0

您使用的是哪個版本的java?來自javadoc的 – STaefi

+3

返回由此抽象路徑名錶示的文件的長度。如果此路徑名錶示目錄,則返回值未指定。「# –

+0

對於第一個問題,javadoc說:*如果此路徑名錶示目錄*,則返回值未指定。 –

回答

4

在Linux/Unix系統上,有一個「塊大小」的概念。該塊大小是操作系統可以處理文件的最小空間量。 du報告塊大小,而不是確切的文件大小。這是文件佔用操作系統的空間大小,而不是文件的大小。

杜工具顯示文件系統塊利用率...

爲了清楚起見,假設我的塊大小= 4 KB(這是相當普遍的。)如果我創建一個文本文件, 2 KB,那麼文件的大小爲2 KB,但文件在系統上佔用的空間量爲4 KB,因爲這是操作系統可以發佈的最小量。

同樣,如果我創建了一個11 KB的文件,那麼文件大小爲11 KB,但實際上它佔用了12 KB。這是因爲我們需要3個塊才能保存文件。

:編輯:stat -f將以字節爲單位顯示驅動器上的塊大小。例如,

stat -f /dev/sda1 
... 
File: "/dev/sda1" 
Block size: 4096 
... 

然後,您可以將它與ls -ls配對,以提供一個目錄列表,其中包含文件使用的塊數。塊是最左邊的一列。

ls -ls 
1 -rw-r--r--. 1 brasmussen someGroup  0 Jan 29 16:24 f1 

你可以在這裏看到,即使認爲文件「f1」的大小爲0字節,它仍然佔用一個塊。因此,其OS大小爲4KB,文件大小爲0KB。

+0

非常感謝您的詳細反饋。我現在清楚第二個問題。對於第一個問題,因爲Unix中的每一件事情都是文件,我認爲一個空目錄也應該佔用磁盤空間,但是du命令會顯示一個空目錄的塊使用數量是0 –

+0

加上一點上下文:4k是通常用作塊大小,因爲在傳統的硬盤驅動器中(你知道,那些具有旋轉磁盤盤片和讀取磁頭的磁盤以及其他東西),4K是一個扇區的大小。扇區是硬盤驅動器一次可讀取旋轉磁盤的最小數據單位。 – nasukkin

8

因爲du命令有不同的目的,因爲它的頁面顯示。它顯示文件使用多少磁盤空間,包括部分空白的塊。這與文件的大小不同,它包含多少數據。

+0

磁盤空間==使用的磁盤塊數量。因爲空間分配在磁盤塊中......而不是字節。 –

+0

「包含部分空白塊」的部分內容你不明白嗎? – EJP

+0

謝謝@Stephen C和EJP!現在用BRasmussen的回答得到它。但我還不清楚的是第一個問題,空目錄也是Unix中的一個文件,它也應占用磁盤空間,而du顯示它需要0個塊 –

1

Directories are just special cases of files並且兩者都是inode的特化版本,即使它們不包含任何內容,它們也會佔用磁盤空間。磁盤上必須有東西來表示目錄的存在,其權限和其他簿記。所以目錄是使用磁盤但沒有長度的文件,因爲它們什麼都不包含。

您正在比較蘋果和橙子與預計不會返回相同結果的程序,因爲它們會計算並報告不同的事情。

+0

謝謝你的幫助。由於空目錄佔用磁盤空間,使我困惑的是du命令會顯示空目錄的使用數量爲0 –

0

塊大小是Linux和Windows共同的特性。它是由文件系統的工作方式引起的,並不是Java特定的。由於處理空間的方式,塊可以由不超過一個文件佔用。

創建一個新的文本document.txt,在其中寫入單個字符並檢查文件大小。它將顯示1個字節的大小和磁盤4 Kb的大小。

相關問題