Java的文件与磁盘操作

原创 2004年09月28日 10:50:00
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://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();



然后你需要做的是对得到的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]);

}

}





本FAQ参考并引用或者是改写了www.esus.com网站提供的部分内容,特此说

明。该网站是一个优秀的Java程序设计网站,值得各位朋友经常前去访问。

Java的文件与磁盘操作

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";...
  • java169
  • java169
  • 2008年05月22日 01:25
  • 163

文件、文件夹、磁盘操作

先记下标题
  • mwj_88
  • mwj_88
  • 2013年01月16日 08:39
  • 378

Java中的文件与磁盘操作技术详细解析

1 如何获得某一个目录下的文件列表?File MyDir = new File("C:/Windows/.");String[] FileNames = MyDir.list();   2 如何实现一...
  • ivorytower
  • ivorytower
  • 2008年04月22日 15:35
  • 1177

常用函数-------文件、磁盘操作函数

软件大多都要对文件、磁盘进行操作。熟悉掌握这些函数可以帮助你轻松实现创建、删除、保存文件等功能。     1.Append   功能说明:追加内容到文件中。文件必须要存在。     参考实例...
  • penjie0418
  • penjie0418
  • 2012年01月10日 21:59
  • 257

磁盘操作

 查看几块硬盘 Lsblk cd /mnt mkdir sda 挂载硬盘mount /dev/sda /mnt/sda  mount -a挂载全部  du -smh *|grep...
  • mirabelle521
  • mirabelle521
  • 2017年05月04日 13:14
  • 92

SMTH Java FAQ (3) 文件与磁盘操作(菜鸟必看)

1 如何获得某一个目录下的文件列表?     File MyDir = new File("C:/Windows/.");   String[] FileNames = MyDir.list();  ...
  • xxcc
  • xxcc
  • 2001年12月17日 11:33
  • 752

delphi中有关磁盘文件管理/处理的函数

1.   CopyFile函數詳解━━━━━━━━━━━━━━━━━━━━━━━━━━CopyFile函數,文件拷贝函数.其基本結構如下:copyfile(               lpcstr ...
  • ijong
  • ijong
  • 2010年10月12日 14:24
  • 651

磁盘操作资料

MBR Date  自磁芯大战以来,病毒从DOS时代的病毒发展到WINDOS系统的病毒,从变形、加密到智能化现在的病毒是让人防不胜防,现在网络上病毒大肆泛滥,给人们带来的很大的危害,本人在此仅做抛砖引...
  • soft_biao
  • soft_biao
  • 2006年04月30日 09:25
  • 3644

[Linux][入门系列]CentOS 的基础命令详解-磁盘基础操作

[Linux][入门系列]CentOS 的基础命令详解 前言 继上次我们安装完CentOS之后,我们就要在CentOS进行一波操作了。OS,顾名思义,就是操作系统。既然是操作系统,那它就是可以...
  • tlytg
  • tlytg
  • 2017年02月21日 19:49
  • 145

C++关于磁盘的数据的操作

磁盘里面存在以逗号分开的double类型的数据点(里面的点,每三个一组,分别是x,y,z坐标),现在需要从磁盘里面读出数据的个数,以及x和y坐标的最大值以及最小值#include #include #...
  • Acmerr
  • Acmerr
  • 2015年07月05日 11:01
  • 625
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的文件与磁盘操作
举报原因:
原因补充:

(最多只允许输入30个字)