[转载]java问题集锦

问: 如何获得某一个目录下的文件列表?

答:以“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:winntSystem32cmd.exe”;
5.else if (osname.indexOf(“Windows”) > -1)
6.command =“c:windowscommand.com”;
7.Process p = Runtime.get-Runtime().exec( )
8.command +“/c dir > c:dir.txt”);
9.p.waitFor();

然后需要做的是对得到的dir.txt文件进行分析。
如果使用的是Uinx/Linux操作系统,可以使用类似的方法来获得相关信息。不过建议上述代码行8处使用的命令改为df ->dir.txt。

问:如何显示和存储拉丁语言中的特殊字符?

答:使用统一码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”));

问:用Java怎么知道究竟有几个可用的存储设备?


答:在Windows系统中可以有多个逻辑分区,可应用下面的方法找出来:


public void ListDisks()

{

File[] roots = File.listRoots();
for (int i=0; i

{

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

}

)

问:如何解决用JDBC向数据库中插入数据的中文问题?

答:这个问题的实现通常与各个JDBC Driver的实现有关。目前大多数JDBC Driver采用本地编码格式来传输中文字符,例如中文字符“0x4175”会被转成“0x41”和“0x75”进行传输。因此我们需要对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月被W3C接受成为“建议”(Note)。随后,在1999年W3C在XML-Data的基础上发布了“XML Schema工作草案”,这也就是通常所说的XML Schema。XML Schema于2001年5月2日正式发布为W3C标准。作为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与目前W3C正式发布的XML Schema并不完全兼容。也就是说,在Biztalk Server 2000中建立的XSD文件未必会符合标准的XML Schema规范。

[@more@]

请使用浏览器的分享功能分享到微信等