对同一个文件建立读写流,然后用Propeties类来load该属性文件,尽管文件中有规范的键值对,但是,读取不了文件中的键值对,代码如下:
                Properties prop = new Properties();
File f = new File("G:\\workspace\\Bixiangdong\\src\\TestIO\\info.txt");
FileReader fr = new FileReader(f);
FileWriter  fw = new FileWriter(f);   
prop.load(fr);//失效?那能读取内容吗      同时对一个文件建立读取流和写入流的时候,             //加载会失败!
System.out.println("集合中有内容吗?"+prop);//没有内容
prop.list(System.out);//也是空
但是,写成这样,也就是不对文件建立写出流,则可以正常读取键值对:
                Properties prop = new Properties();
File f = new File("G:\\workspace\\Bixiangdong\\src\\TestIO\\info.txt");
FileReader fr = new FileReader(f);
prop.load(fr);
System.out.println("集合中有内容吗?"+prop);//有内容
prop.list(System.out);//列出键值对
请大家帮我看一下,这是为什么?
但是同时在对一个文件建立读取流在别的问题中是可以的:
try{
RandomAccessFile raf = new RandomAccessFile(new File("G:\\workspace\\testfilepakage\\4444.txt"),"rw");
int pos = 200;
String content = "\r\n此处是插入的文本内容!\r\n";
raf.seek(200);
File temp = new File("G:\\workspace\\testfilepakage\\temp.txt");
//对一个文件同时建立写入流和读取流是可以的,不会影响正常结果。
FileOutputStream  fos = new FileOutputStream(temp);
    FileInputStream   fis = new FileInputStream(temp);
//temp.deleteOnExit();
int len = 0;
byte[] buf = new byte[256];
while((len = raf.read(buf))!=-1)
{
fos.write(buf, 0, len);  //插入点以后的文件内容写入到临时文件中
}
sop("重新定位指针之前指针的位置:"+raf.getFilePointer());

raf.seek(pos);
sop("写入内容之前的指针:"+raf.getFilePointer());

raf.write(content.getBytes());
sop("写入内容之后的指针:"+raf.getFilePointer());

int len1 = 0;
while((len1 = fis.read(buf))!=-1)//将临时文件中内容读出来,重新写到文件中
{
raf.write(buf,0,len1);
}


}catch(IOException e)
{
sop(e.toString());
}这段代码却可以正常运行。而且平时我没注意把读写流分开建立,一般都能行,就是那个Properties读取文件键值对的时候,失效了,搞不懂。
javaIOProperties

解决方案 »

  1.   

    FileWriter  fw = new FileWriter(f);  把这行删了跑过这行你把文件直接清空了。
      

  2.   

    楼上正解,文件写入对象被创建时会执行一个native的open操作,这个操作会清空文件。你也可以选择创建追加模式的文件写入对象。FileWriter  fw = new FileWriter(f,true);  
      

  3.   


    你下面的代码和上面的代码有很大区别。
    FileOutputStream 对象在创建时,如果不选择追加模式,就会清空原文件内容,不管你写没写入。FileWriter实际上也是通过内部的FileOutputStream来操作的,所以是一样的。
    但是RandomAccessFile没有这个效果。你上面的代码是对要写入的文件创建FileWriter,所以文件原先的内容被清空了。
    下面的代码是对临时文件创建FileOutputStream,临时文件本来就没东西,所以清不清空没影响,更不影响你对真正的目标文件创建RandomAccessFile对象。