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读取文件键值对的时候,失效了,搞不懂。
              
------解决方案--------------------FileWriter  fw = new FileWriter(f);  
把这行删了。。。跑过这行你把文件直接清空了。
------解决方案--------------------楼上正解,文件写入对象被创建时会执行一个native的open操作,这个操作会清空文件。你也可以选择创建追加模式的文件写入对象。
FileWriter  fw = new FileWriter(f,true);  
------解决方案--------------------
你下面的代码和上面的代码有很大区别。
FileOutputStream 对象在创建时,如果不选择追加模式,就会清空原文件内容,不管你写没写入。FileWriter实际上也是通过内部的FileOutputStream来操作的,所以是一样的。