Java中的文件与磁盘操纵技能详解
副标题#e#
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"));
#p#副标题#e#
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
假如你利用的是Windows系列操纵系统,那么下面的要领也许可以或许得到正确的功效。我之所以说也许,是因为我在多个Windows平台上作过实际测试,在英文版的Windows上根基上都可以或许获得正确的功效,在中文版的Windows上根基上都不可以或许得到正确的功效。
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来名目化我的硬盘可能是软盘么?
#p#分页标题#e#
关于这个问题,想来在不久的未来仍然是不会有纯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下你凡是没有须要体贴这个问题,只要记着谁人斜杠就可以了。
在Windows下硬盘可以有多个逻辑分区,可应用下面的要领找出来:
public void ListDisks()
{
File[] roots = File.listRoots();
for (int i=0; i
{
System.out.println(roots[i]);
}
}