一起来测试JDK/JRE中FileWriter的bug!!

来源:互联网 发布:一楼适合做榻榻米 知乎 编辑:程序博客网 时间:2024/05/16 02:03
本文首发于CSDN,niko7的个人空间。http://blog.csdn.net/niko7
转载和引用必须注明出处!

这个bug是我在调试程序时发现的,还没有查过是否有类似报道,也不确定是否已经修正。
现把测试代码放上来,有兴趣的朋友可以一起来验证,顺便测试一下别的平台,别的版本中是否也存在这个问题?
像这样的问题,一般只存在于特定的平台,特定的版本。
如果恰好你正在用这个平台(或者你的产品将被部署到这个环境),那么注意避开这个bug!

代码:
package niko7.test.csdn;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

/**
 * 测试JDK/JRE中FileWriter的bug。
 * 
 * 详细情况看代码中的注释。
 * 这种问题应该是在特定的 jdk/jre 版本中才存在的,望大家协助测试,并将结果反馈到我的blog中: http://blog.csdn.net/niko7
 * 
 * 转载、引用必须保留此段信息。
 * 
@author niko7,(顾法华,杭州)
 * @email niko7@163.com
 
*/

public class TestJDK
{
    
public static void main(String[] args)
    
{
        Properties p 
= System.getProperties();
        System.out.println(
"jre信息:");
        p.list(System.out);
        System.out.println();
        
        String s 
= "0123456789_0123456789_0123456789_0123456789_0123456789_0123456789_0123456789_0123456789_0123456789_= ";
        FileWriter fw 
= null;
        
try
        
{
            File f 
= new File("output.txt");
            System.out.println(
"文件位置:"+f.getAbsoluteFile());
            fw 
= new FileWriter(f);
            
for (int i = 0; i < 300; i++)
            
{
                fw.write(s);
                
                
//如果没有下面一行,那么文件的内容不是你想的那样的!!!!
                
//第81行,第3个“_”神秘失踪!!
                
//0123456789_0123456789_01234567890123456789_0123456789_0123456789_0123456789_0123456789_0123456789_=
                
//比上面的一行和下面的一行短一点!
                
//第161行,第241行,都有字符丢失!
                
//fw.flush();//这一行不注释掉就能正常
            }

            fw.flush();
        }

        
catch (Exception e)
        
{
            e.printStackTrace();
        }

        
finally
        
{
            
if(null!=fw)
            
{
                
try
                
{
                    fw.close();
                }

                
catch (IOException e)
                
{
                    e.printStackTrace();
                }

                fw 
= null;
            }

        }

        System.out.println(
"完成!");
    }

}


以下是我测试的环境:
jre信息:
-- listing properties --
java.runtime.name
=Java(TM) 2 Runtime Environment, Stand...
sun.boot.library.path
=C:javaj2sdk1.4.2_03jrein
java.vm.version
=1.4.2_03-b02
java.vm.vendor
=Sun Microsystems Inc.
java.vendor.url
=http://java.sun.com/
path.separator=;
java.vm.name
=Java HotSpot(TM) Client VM
file.encoding.pkg
=sun.io
user.country
=CN
sun.os.patch.level
=Service Pack 2
java.vm.specification.name
=Java Virtual Machine Specification
user.dir
=C:est
java.runtime.version
=1.4.2_03-b02
java.awt.graphicsenv
=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs
=C:javaj2sdk1.4.2_03jrelibendorsed
os.arch
=x86
java.io.tmpdir
=C:DOCUME~1gfhLOCALS~1Temp
line.separator
=

java.vm.specification.vendor
=Sun Microsystems Inc.
user.variant
=
os.name
=Windows XP
sun.java2d.fontpath
=
java.library.path
=C:javaj2sdk1.4.2_03in;.;C:WINDOW...
java.specification.name
=Java Platform API Specification
java.
class.version=48.0
java.util.prefs.PreferencesFactory
=java.util.prefs.WindowsPreferencesFac...
os.version
=5.1
user.home
=C:Documents and Settingsgfh
user.timezone
=
java.awt.printerjob
=sun.awt.windows.WPrinterJob
file.encoding
=GB18030
java.specification.version
=1.4
user.name
=gfh
java.
class.path=C:estest_output...
java.vm.specification.version
=1.0
sun.arch.data.model
=32
java.home
=C:javaj2sdk1.4.2_03jre
java.specification.vendor
=Sun Microsystems Inc.
user.language
=zh
awt.toolkit
=sun.awt.windows.WToolkit
java.vm.info
=mixed mode
java.version
=1.4.2_03
java.ext.dirs
=C:javaj2sdk1.4.2_03jrelibext
sun.boot.
class.path=C:javaj2sdk1.4.2_03jrelib t.jar;...
java.vendor
=Sun Microsystems Inc.
file.separator
=
java.vendor.url.bug
=http://java.sun.com/cgi-bin/bugreport...
sun.cpu.endian=little
sun.io.unicode.encoding
=UnicodeLittle
sun.cpu.isalist
=pentium i486 i386
原创粉丝点击