日期:2014-05-20  浏览次数:20908 次

java中同时对一个文件建立读写流时,为什么有时候出现问题呢
对同一个文件建立读写流,然后用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读取文件键值对的时候,失效了,搞不懂。
java IO Properties

------解决方案--------------------
FileWriter  fw = new FileWriter(f);  

把这行删了。。。跑过这行你把文件直接清空了。
------解决方案--------------------
楼上正解,文件写入对象被创建时会执行一个native的open操作,这个操作会清空文件。你也可以选择创建追加模式的文件写入对象。

FileWriter  fw = new FileWriter(f,true);  
------解决方案--------------------
引用:
那为什么我下一段程序,同时对一个文件建立读流和写入流,后面能正常读取文件内容,也能正常在指定位置进行写入呢?


你下面的代码和上面的代码有很大区别。
FileOutputStream 对象在创建时,如果不选择追加模式,就会清空原文件内容,不管你写没写入。FileWriter实际上也是通过内部的FileOutputStream来操作的,所以是一样的。