xml文件不释放的问题
来源:互联网 发布:amazon是什么软件 编辑:程序博客网 时间:2024/05/17 16:12
- 周六做实施,发现服务器上运行时,监听写的xml文件不能被及时删掉,但是在测试环境中却没问题。经过测试,如下:TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
Properties properties = transformer.getOutputProperties();
properties.setProperty(OutputKeys.ENCODING, "gb2312");
properties.setProperty(OutputKeys.VERSION, "1.0");
properties.setProperty(OutputKeys.INDENT, "yes");
properties.setProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperties(properties);
DOMSource source = new DOMSource(root);String filename = dir + sdf.format(new Date());
java.io.File f= new java.io.File(filename + ".lock");
StreamResult result = new StreamResult(f);
transformer.transform(source, result);//输出结果到f这时的file长时间锁定,无法rename和delete。
竟然长达22秒。对于计算机来说,22秒,都能从白垩纪发展到党的十三大召开了。
但是,在测试环境中,间隔时间小的可以忽略。
这件事情的挫败感极为强烈,小鼠感觉受到了深深的侮辱。
于是周日这一天竟然看了半天的think in java的I/O章节。
这是有生以来第一次主动学习业务知识。
书到用时方恨少啊方恨少。
虽然并没有直接的相关知识,但聊以自慰吧。
周一上午查了大量网页,并发帖求助。
无果。
不过看到有人求助,怎样用transform输出到字符串中,而不是输出到file。
于是,用了笨方法。
先从transform得sw,再写入fo中,因为fo是可以自己关闭的。
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
transformer.transform(source, result);
String s = sw.toString();
System.out.println(s);FileOutputStream fo = null;
try
{
fo = new FileOutputStream(filename + ".lock");
fo.write(s.getBytes());
fo.close();//关闭
} catch (IOException e)
{
e.printStackTrace();
}这时,再进行rename就很顺利了。
进行了一次调试,暂时无问题。
不过,还是不清楚所以然。
下午的时候,看到这个帖子。完全的同命人。
原来StreamResult result 可以接收fo啊!-_-!
于是改成:
java.io.FileOutputStream fo = null;
try
{
fo = new java.io.FileOutputStream(filename+".lock");
StreamResult result = new StreamResult(fo);
transformer.transform(source, result);//输出结果
fo.close();
} catch (FileNotFoundException e)
{
e.printStackTrace();
}简洁些。
关于偷懒的错误System.out.println("--gen xml file .....");
java.io.File file=new java.io.File(filepath);
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
DOMSource source=new DOMSource(output);
java.io.FileOutputStream fos=new java.io.FileOutputStream(file);
StreamResult result=new StreamResult(fos);
Properties props = new Properties();
props.setProperty("encoding", "GB2312");
props.setProperty("method", "xml");
props.setProperty("omit-xml-declaration", "yes");
transformer.setOutputProperties(props);
transformer.transform(source,result);
fos.close();
System.out.println("--end gen xml file.");System.out.println("--gen xml file .....");
java.io.File file=new java.io.File(filepath);
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
DOMSource source=new DOMSource(output);
StreamResult result=new StreamResult(file);
Properties props = new Properties();
props.setProperty("encoding", "GB2312");
props.setProperty("method", "xml");
props.setProperty("omit-xml-declaration", "yes");
transformer.setOutputProperties(props);
transformer.transform(source,result);
System.out.println("--end gen xml file.");就因为我把上面三行代码做的事情写成了一行
StreamResult result=new StreamResult(file);,
于是我始终是不能对file进行renameTo操作或者delete操作,如果开始我能发现这一点,还是值得庆幸的,但事实上我花了很长时间来找出问题,我甚至怀疑是Weblogic的限制所致,因为下面的程序在Tomcat里运行是没有问题的,但现在想来有可能是使用的TransformerFactoryImpl不同造成的,Weblogic使用的是org.apache.xalan.xsltc.trax.TransformerFactoryImpl ,而Tomcat用的是jdk默认的。后来,我尝试了很多办法来解决这个问题,最终问题指向了写入文件的输出流,我并没有显示控制文件的输出流,天知道StreamResult(file)作了什么,用java.io.FileOutputStream fos控制对文件输入,并最终关闭文件输出流,这样做了之后,再也没有什么后遗症了,ok!这种错误以后应当引以为戒。不过为什么在Tomcat中的运行完全没有问题,这其中是何道理呢??
- xml文件不释放的问题
- SAXBuilder不释放文件句柄的问题
- 关于rm删除文件空间不释放的问题
- 关于C#Image.FromFile文件不释放问题的解决
- Image.FromFile 不释放文件问题
- 处理rm 空间不释放的问题
- oracle killed会话不释放的问题。
- oracle killed会话不释放的问题
- linux磁盘不释放的问题
- 使用hibernate数据库连接不释放的问题
- iOS NSTimer释放不掉的问题
- oracle杀回话不释放的问题
- linux频繁存取文件内存不释放问题
- android xml文件不显示视图的问题
- MyEclipse开发XML文件不提示的问题
- mini-xml 读取XML后释放空间错误的问题!
- 免杀小方法-释放不完整的动态库文件
- Linux 删除文件后磁盘空间不释放的解决方法
- BlogEngine.NET (一)配置
- 联想控股李嘉诚等联合收购NBA中国11%股份
- 根据用户是否使用来保持Session对象的有效性
- VS2005 ASP.NET2.0安装项目的制作(包括数据库创建、站点创建、IIS属性修改、Web.Config文件修改)
- 如何调试驱动程序
- xml文件不释放的问题
- 利用Repeater控件显示主-从关系数据表
- Windows XP Embedded (XPE)开发工具、升级包、中文包等微软官方下载地址
- VB.NET 进度条与状态条的使用
- Company Code
- JSF通过EL读取List中的值
- VB.NET 中OpenFileDg文件名,路径的获取
- 2008年IT人士必去的10个网站
- VC++实现非窗口类中使用定时器的方法