问: 如何获得某一个目录下的文件列表?
答:以“c:/Windows/.”目录为例,获得该目录下文件列表的代码为:
File MyDir = new File(“C:/Windows/.”); String[] FileNames=MyDir.list(); |
问:利用如下代码拷贝中文文件,为什么出错?
int c; while ((c = MyFileReader.read()) != -1) MyFileOutputStream.write(c); |
答:利用如下代码片断拷贝中文文件不会出错:
int c; while ((c = MyFileReader.read()) != -1) MyFileWriter.write(c); |
原代码造成出错的原因是:FileReader.read()返回一个int型数值,其取值范围是0 到65535,通常来说是两个字节的。FileWriter.write(int c)向文件写入一个int型,通常来说也是两个字节的。如果某个字符的高位字节为空,那么其高位字节将被舍弃。FileOutputStream.write(int b)虽然接受一个int型作为参数,实际上只向文件写入一个字节,如果传递过来的参数是一个双字节的汉字,其高位字节将被舍弃,造成文件内容错误。建议:只使用InputStream/OutputStream进行I/O操作。代码为:
int c; while((c =MyFileInputStream. read())!=-1) MyFileOutputStream.write(c); |
问:如何利用文件进行数据存取?
答:对于一般的科学计算应用程序,DataInputStream和DataOutputStream类通常是最好的选择。这两个类提供了存取各种数据的方法。下面的范例演示了构造DataInputStream和DataOutputStream的方法:
MyDataInputStream = new DataInputStream( new FileInputStream(MyInputFile)); MyDataOutputStream = new DataOutputStream( new FileOutputStream(MyOutputFile)); |
利用ObjectInputStream和ObjectOutputStream同样可以进行数据存取。需要注意的是这样做增加了硬盘的开销,因为进行对象序列化过程添加了一些额外的信息。在利用ObjectInputStream和ObjectOutputStream进行通信的时候,虽然数据发收过程得到了大大简化,但是对带宽的要求也大大地提高了。
问:如何获得可用的硬盘空间?
答:目前没有更好的纯Java解决方案,但有一个JConfig的类库提供了一些方法可以获得磁盘和文件信息,这个类库使用了JNI 方法。它的下载地址:http://www.tolstoy.com/samizdat/jconfig.html。值得注意的是,如果使用的是Windows系列操作系统,那么下面的方法在英文版的Windows系统上基本都能够得到正确的结果,但在中文版的Windows系统上基本都不能够获得正确的结果。
1.String osname= System. getProperty(“os.name”); 2.String command =“”; 3.if (osname.indexOf(“NT”) >-1) 4.command =“c://winnt// System32//cmd.exe”; 5.else if (osname.indexOf(“Windows”) > -1) 6.command =“c://windows// command.com”; 7.Process p = Runtime.get- Runtime().exec( 8.command +“/c dir > c://dir .txt”); 9.p.waitFor(); |
然后需要做的是对得到的dir.txt文件进行分析。
如果使用的是Uinx/Linux操作系统,可以使用类似的方法来获得相关信息。不过建议上述代码行8处使用的命令改为df -k >dir.txt。
问:如何显示和存储拉丁语言中的特殊字符?
答:使用统
一码
Unicode可以显示和存储拉丁语言中的特殊字符。具体应用范例如下:
MyJTextArea.append(“/u00E 1 ” ); MyJTextArea.append(“/u00E 2 ” ); MyJTextArea.append(“/u00E 3 ” ); MyJTextArea.append(“/u00E 4 ” ); MyJTextArea.append(“/u00E 5 ” ); 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 ” )); |
问:用Java怎么知道究竟有几个可用的存储设备?
答:在Windows系统中可以有多个逻辑分区,可应用下面的方法找出来:
public void ListDisks() { File[] roots = File.listRoots(); for (int i=0; i { System.out.println(roots[i]); } ) |
问:如何解决用JDBC向数据库中插入数据的中文问题?
答:这个问题的实现通常与各个JDBC Driver的实现有关。目前大多数JDBC Driver采用本地编码格式来传输中文字符,例如中文字符“0x
4175
”
会被转成“0x
41
”
和“0x
75
”
进行传输。因此我们需要对JDBC Driver返回的字符及要发给JDBC Driver的字符进行转换。
当用JDBC Driver向数据库中插入数据时,需要先将Unicode转成Native Code;当 JDBC Driver从数据库中查询数据时,则需要将Native Code转换成Unicode。 下面给出了这两种转换的实现:
String native2Unicode(String s) { if (s == null || s.length() == 0) { return null; } byte[] buffer = new byte[s.length()]; for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) { c = s.charAt(i); byte []buf = (“”+c).getBytes(); buffer[j++] = (char)buf[0]; buffer[j++] = (char)buf[1]; } else { buffer[j++] = s.charAt(i); } } return new String(buffer, 0, j); } |
有些JDBC Driver如果对jdbc driver Manager设置了正确的字符集属性,以上2个方法就不需要了。
问:我要做一个站点,让互联网用户可以了解查询我们公司的商品,我可以使用XML作为后台的Web数据库吗?
答:XML的确与数据库有相似之处,比如说它们都具有数据存储、数据有效性验证、数据查询、数据访问编程接口等特征。但是还有许多实际数据库所具备的功能是XML所不具备的,如:索引、安全机制、事务机制、数据完整性、多用户访问、触发器、多文档查询等。在实际应用中,对于一些数据量小、访问用户少、性能要求不高的门户站点而言,将XML文档直接作为数据库使用是可能的。然而对于商业应用而言,后台还是应选择专门的数据库。如果访问数量较大的话,还可以考虑在数据库与应用服务器之间采用XML作为信息缓存。但是数据库中对应数据的更新应是定期的,这样才能保证XML文件缓存中的数据在其生存期内与数据库中对应数据相一致。
问:XML-Data与Schema有什么区别?
答:XML-Data与Schema的区别是细微的。通常将对数据的某种约束规则统一称之为Schema,即模式。这种称法在数据库中广泛使用并被XML所沿袭。从这一角度而言,DTD、XML-Data都可算是用于XML的某种Schema,凡是符合Schema约束的XML文档我们称之为有效的XML。为了区别起见,可以将XML-Data称之为XML-Data Schema。XML-Data Schema最早由微软提出,并于1998年1月被W
3C
接受成为“建议”(Note)。随后,在1999年W
3C
在XML-Data的基础上发布了“XML Schema工作草案”,这也就是通常所说的XML Schema。XML Schema于
2001
年
5
月
2
日
正式发布为W
3C
标准。作为XML-Data的创建者,微软公司在XML Schema V1.0尚未正式出炉前就已经在他的MSXML解析器、IE浏览器、Biztalk Server 2000中提供了对XML-Data的广泛支持(事实上它们支持的是XML-Data的一个子集)。鉴于它与XML Schema的血缘关系,我们通常也称其为Schema,即MS Schema。基于XML-Data及其扩展的Schema有一共同特点,即Schema自身也都是标准的XML文档。这与传统的DTD规范是截然不同的。这也是我们通常将XML约束简单划分为DTD与Schema的主要依据。需要指出的是,在IE、MSXML等工具中所支持的MS Schema与目前W
3C
正式发布的XML Schema并不完全兼容。也就是说,在Biztalk Server 2000中建立的XSD文件未必会符合标准的XML Schema规范。