Java中的文件與磁盤操作技術詳細解析

1 如何獲得某一個目錄下的文件列表?

File MyDir = new File("C:/Windows/.");
String[] FileNames 
= MyDir.list(); 

  2 如何實現一個打開文件或者是存儲文件對話框?

  AWT: FileDialog類 + FilenameFilter類

  Swing: JFileChooser類 + FileFilter類

  其中,基於Swing的解決方案功能更加強大,界面也更加美觀。

  3 利用FileReader/FileOutputStream拷貝中文文件出錯?

  利用如下代碼片斷拷貝中文文件不會出錯:

int c;
while ((c = MyFileReader.read()) != -1)
MyFileWriter.write(c); 

  利用如下代碼片斷拷貝中文文件會導致文件內容錯誤:

int c;
while ((c = MyFileReader.read()) != -1)
MyFileOutputStream.write(c); 

  造成這個問題的原因是:FileReader.read()返回一個int,其取值範圍是0 到65535,通常來說是兩個字節的;FileWriter.write(int c)向文件寫入一個int,通常來說也是兩個字節的,如果某個字符的高位字節爲空,那麼其高位字節將被捨棄;FileOutputStream.write(int b)雖然接受一個int作爲參數,實際上只向文件寫入一個字節,如果傳遞過來的參數是一個雙字節的漢字,其高位字節將被捨棄,造成文件內容錯誤。

  建議:永遠只使用InputStream/OutputStream進行IO操作。

  利用如下代碼片斷拷貝中文文件不會出錯:

int c;
while ((c = MyFileInputStream.read()) != -1)
MyFileOutputStream.write(c); 

 

  4 如何顯示和存儲拉丁語言中的特殊字符

  使用統一碼Unicode可以顯示和存儲拉丁語言中的特殊字符。具體應用範例

  如下:

MyJTextArea.append("u00E1");
MyJTextArea.append(
"u00E2");
MyJTextArea.append(
"u00E3");
MyJTextArea.append(
"u00E4");
MyJTextArea.append(
"u00E5");
MyFileOutputStream.write(MyJTextArea.getText().getBytes(
"UTF-8"));
MyFileOutputStream.close(); 

 

  同樣,在讀取文件的時候也需要將讀到的內容轉換成統一碼。

byte[] b = new byte[MyFile.length()];
FileInputStream in 
= new FileInputStream(MyFile);
in.read(b);
MyJTextArea.append(
new String(b, "UTF-8")); 

 

  5 如何利用文件進行數據存取

  對於一般的科學計算應用程序,DataInputStream和DataOutputStream類通常是最好的選擇。這兩個類提供了存取各種數據的方法。下面的範例演示了構造DataInputStream和DataOutputStream的方法:

 

MyDataInputStream = new DataInputStream(new FileInputStream(MyInputFile));
MyDataOutputStream 
= new DataOutputStream(new FileOutputStream(MyOutputFile)); 

  利用ObjectInputStream和ObjectOutputStream同樣可以進行數據存取,需要注意的是這樣做增加了硬盤的開銷,因爲進行對象序列化過程添加了一些額外的信息。在利用ObjectInputStream和ObjectOutputStream進行通訊的時候,雖然數據發收過程得到了大大簡化,但是對帶寬的要求也大大的提高了。

  6 文件操作的基本原則是什麼?

  a. 避免多次訪問磁盤,例如一次讀出n個字節就比每次讀出1個字節的訪問效率要高很多。

  b. 避免多次訪問操作系統。

  c. 避免多次調用文件存取方法。

  d. 避免將字節和字符混淆處理,在Java語言中字節與字符的概念是不一樣的,在涉及到雙字節字符的問題上更是容易出錯。

  7 如何獲得可用的硬盤空間?

  目前尚未發現有任何干淨利落的純Java方法能夠解決這個問題。通常的解決方案是直接訪問操作系統獲得這些信息。有一個被稱爲JConfig的類庫提供了一些方法可以獲得磁盤和文件信息,但是可以肯定這個類庫使用了JNI方法。

  下載地址:http://www.tolstoy.com/samizdat/jconfig.html

  如果你使用的是暈倒死系列操作系統,那麼下面的方法也許能夠獲得正確的結果。我之所以說也許,是因爲我在多個暈倒死平臺上作過實際測試,在英文版的暈倒死上基本上都能夠得到正確的結果,在中文版的暈倒死上基本上都不能夠獲得正確的結果。

String osname = system.getProperty("os.name");
String command 
= "";
if (osname.indexOf("NT"> -1)
command 
= "c:winntSystem32cmd.exe";
else if (osname.indexOf("Windows"> -1)
command 
= "c:windowscommand.com";
Process p 
= Runtime.getRuntime().exec(
command 
+ " /c dir > c:dir.txt");
p.waitFor(); 

 

  然後你需要做的是對得到的dir.txt文件進行分析。

  如果你使用的是UNIX/Linux操作系統,你可以使用類似的方法來獲得相關信息。建議使用的命令是df -k > dir.txt。

  8 我能夠用Java來格式化我的硬盤或者是軟盤麼?

  關於這個問題,想來在不久的將來仍然是不會有純Java的解決方案了。如果你一定要在你的Java應用程序裏面格式化你的C盤的話,下面的這個方法也許會有所幫助。當然,在你使用這個方法之前,請仔細備份好女朋友給你的情書或者是記下和下一個網友約會的日期。

 

  建立一個稱爲FormatDrive.bat的文件,該文件必須放在當前目錄或者是系統路徑下,文件的內容如下:

  rundll32.exe shell32.dll, SHFormatDrive

  格式化硬盤的方法可以這樣寫:

 

public void FormatDrive()
{
try
{
Process p 
= Runtime.getRuntime().exec("FormatDrive.bat");
p.waitfor();
}
 catch (Exception e)
{
system.out.println(e);
}

}
 

 

  9 怎麼知道我究竟有幾個可用的存儲設備?

  在UNIX/Linux下你通常沒有必要關心這個問題,只要記住那個斜槓就可以了。

  在暈倒死下硬盤可以有多個邏輯分區,可應用下面的方法

public void ListDisks()
{
File[] roots 
= File.listRoots();
for (int i=0; i
{
system.out.println(roots[i]);
}

}
 

找出來:

 

 
發佈了47 篇原創文章 · 獲贊 4 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章