日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Java的文件與磁盤(pán)操作

 Joshua 2006-01-14
1 如何獲得某一個(gè)目錄下的文件列表?



File MyDir = new File("C:/Windows/.");

String[] FileNames = MyDir.list();



2 如何實(shí)現(xiàn)一個(gè)打開(kāi)文件或者是存儲(chǔ)文件對(duì)話框?



AWT: FileDialog類(lèi) + FilenameFilter類(lèi)

Swing: JFileChooser類(lèi) + FileFilter類(lèi)



其中,基于Swing的解決方案功能更加強(qiáng)大,界面也更加美觀。



3 利用FileReader/FileOutputStream拷貝中文文件出錯(cuò)?



利用如下代碼片斷拷貝中文文件不會(huì)出錯(cuò):



int c;

while ((c = MyFileReader.read()) != -1)

MyFileWriter.write(c);



利用如下代碼片斷拷貝中文文件會(huì)導(dǎo)致文件內(nèi)容錯(cuò)誤:



int c;

while ((c = MyFileReader.read()) != -1)

MyFileOutputStream.write(c);



造成這個(gè)問(wèn)題的原因是:FileReader.read()返回一個(gè)int,其取值范圍是

0 到65535,通常來(lái)說(shuō)是兩個(gè)字節(jié)的;FileWriter.write(int c)向文件寫(xiě)

入一個(gè)int,通常來(lái)說(shuō)也是兩個(gè)字節(jié)的,如果某個(gè)字符的高位字節(jié)為空,那

么其高位字節(jié)將被舍棄;FileOutputStream.write(int b)雖然接受一個(gè)

int作為參數(shù),實(shí)際上只向文件寫(xiě)入一個(gè)字節(jié),如果傳遞過(guò)來(lái)的參數(shù)是一個(gè)

雙字節(jié)的漢字,其高位字節(jié)將被舍棄,造成文件內(nèi)容錯(cuò)誤。



建議:永遠(yuǎn)只使用InputStream/OutputStream進(jìn)行IO操作。



利用如下代碼片斷拷貝中文文件不會(huì)出錯(cuò):



int c;

while ((c = MyFileInputStream.read()) != -1)

MyFileOutputStream.write(c);



4 如何顯示和存儲(chǔ)拉丁語(yǔ)言中的特殊字符



使用統(tǒng)一碼Unicode可以顯示和存儲(chǔ)拉丁語(yǔ)言中的特殊字符。具體應(yīng)用范例

如下:



MyJTextArea.append("\u00E1");

MyJTextArea.append("\u00E2");

MyJTextArea.append("\u00E3");

MyJTextArea.append("\u00E4");

MyJTextArea.append("\u00E5");



MyFileOutputStream.write(MyJTextArea.getText().getBytes("UTF-8"));

MyFileOutputStream.close();



同樣,在讀取文件的時(shí)候也需要將讀到的內(nèi)容轉(zhuǎn)換成統(tǒng)一碼。



byte[] b = new byte[MyFile.length()];

FileInputStream in = new FileInputStream(MyFile);

in.read(b);

MyJTextArea.append(new String(b, "UTF-8"));



5 如何利用文件進(jìn)行數(shù)據(jù)存取



對(duì)于一般的科學(xué)計(jì)算應(yīng)用程序,DataInputStream和DataOutputStream類(lèi)通

常是最好的選擇。這兩個(gè)類(lèi)提供了存取各種數(shù)據(jù)的方法。下面的范例演示了

構(gòu)造DataInputStream和DataOutputStream的方法:



MyDataInputStream = new DataInputStream(

new FileInputStream(MyInputFile));

MyDataOutputStream = new DataOutputStream(

new FileOutputStream(MyOutputFile));



利用ObjectInputStream和ObjectOutputStream同樣可以進(jìn)行數(shù)據(jù)存取,需

要注意的是這樣做增加了硬盤(pán)的開(kāi)銷(xiāo),因?yàn)檫M(jìn)行對(duì)象序列化過(guò)程添加了一

些額外的信息。在利用ObjectInputStream和ObjectOutputStream進(jìn)行通訊

的時(shí)候,雖然數(shù)據(jù)發(fā)收過(guò)程得到了大大簡(jiǎn)化,但是對(duì)帶寬的要求也大大的

提高了。



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



a. 避免多次訪問(wèn)磁盤(pán),例如一次讀出n個(gè)字節(jié)就比每次讀出1個(gè)字節(jié)的訪問(wèn)

效率要高很多。

b. 避免多次訪問(wèn)操作系統(tǒng)。

c. 避免多次調(diào)用文件存取方法。

d. 避免將字節(jié)和字符混淆處理,在Java語(yǔ)言中字節(jié)與字符的概念是不一樣

的,在涉及到雙字節(jié)字符的問(wèn)題上更是容易出錯(cuò)。



7 如何獲得可用的硬盤(pán)空間?



目前尚未發(fā)現(xiàn)有任何干凈利落的純Java方法能夠解決這個(gè)問(wèn)題。通常的解

決方案是直接訪問(wèn)操作系統(tǒng)獲得這些信息。有一個(gè)被稱(chēng)為JConfig的類(lèi)庫(kù)提

供了一些方法可以獲得磁盤(pán)和文件信息,但是可以肯定這個(gè)類(lèi)庫(kù)使用了JNI

方法。



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



如果你使用的是暈倒死系列操作系統(tǒng),那么下面的方法也許能夠獲得正確

的結(jié)果。我之所以說(shuō)也許,是因?yàn)槲以诙鄠€(gè)暈倒死平臺(tái)上作過(guò)實(shí)際測(cè)試,

在英文版的暈倒死上基本上都能夠得到正確的結(jié)果,在中文版的暈倒死上

基本上都不能夠獲得正確的結(jié)果。



String osname = System.getProperty("os.name");

String command = "";

if (osname.indexOf("NT") > -1)

command = "c:\\winnt\\System32\\cmd.exe";

else if (osname.indexOf("Windows") > -1)

command = "c:\\windows\\command.com";



Process p = Runtime.getRuntime().exec(

command + " /c dir > c:\\dir.txt");

p.waitFor();



然后你需要做的是對(duì)得到的dir.txt文件進(jìn)行分析。



如果你使用的是UNIX/Linux操作系統(tǒng),你可以使用類(lèi)似的方法來(lái)獲得相關(guān)

信息。建議使用的命令是df -k > dir.txt。



8 我能夠用Java來(lái)格式化我的硬盤(pán)或者是軟盤(pán)么?



關(guān)于這個(gè)問(wèn)題,想來(lái)在不久的將來(lái)仍然是不會(huì)有純Java的解決方案了。如

果你一定要在你的Java應(yīng)用程序里面格式化你的C盤(pán)的話,下面的這個(gè)方法

也許會(huì)有所幫助。當(dāng)然,在你使用這個(gè)方法之前,請(qǐng)仔細(xì)備份好女朋友給你

的情書(shū)或者是記下和下一個(gè)網(wǎng)友約會(huì)的日期。



建立一個(gè)稱(chēng)為FormatDrive.bat的文件,該文件必須放在當(dāng)前目錄或者是系

統(tǒng)路徑下,文件的內(nèi)容如下:



rundll32.exe shell32.dll, SHFormatDrive



格式化硬盤(pán)的方法可以這樣寫(xiě):



public void FormatDrive()

{

try

{

Process p = Runtime.getRuntime().exec("FormatDrive.bat");

p.waitfor();

} catch (Exception e)

{

System.out.println(e);

}

}



9 怎么知道我究竟有幾個(gè)可用的存儲(chǔ)設(shè)備?



在UNIX/Linux下你通常沒(méi)有必要關(guān)心這個(gè)問(wèn)題,只要記住那個(gè)斜杠就可以了。

在暈倒死下硬盤(pán)可以有多個(gè)邏輯分區(qū),可應(yīng)用下面的方法找出來(lái):



public void ListDisks()

{

File[] roots = File.listRoots();

for (int i=0; i
{

System.out.println(roots[i]);

}

}





本FAQ參考并引用或者是改寫(xiě)了www.esus.com網(wǎng)站提供的部分內(nèi)容,特此說(shuō)

明。該網(wǎng)站是一個(gè)優(yōu)秀的Java程序設(shè)計(jì)網(wǎng)站,值得各位朋友經(jīng)常前去訪問(wèn)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多