天天看點

Java中的檔案與磁盤操作技術詳細解析

Java中的檔案與磁盤操作技術詳細解析
Java中的檔案與磁盤操作技術詳細解析
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("u00 E3 ");

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 co MM and = ""; 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]); } }

Java中的檔案與磁盤操作技術詳細解析