黑马程序员技术交流社区

标题: 关于Properties修改数据时的一个问题 [打印本页]

作者: 徐帅    时间: 2012-6-5 16:48
标题: 关于Properties修改数据时的一个问题
假设info.txt中开始的数据是:
hehe=13
haha=19
heihei=29
在修改数据时,输出流FileOutputStream fos  在prop.load(fis)之后建立即可,
但是当在开始的时候就和输入流FileInputStream fis  一起建立,结果只出现修改后的hehe=11,
原来的数据 haha=19. heihei=29 都没有了,这是为什么呢?请帮忙解答下啊

import java.util.*;
import java.io.*;
class PropertiesDemo2
{
        public static void main(String[] args) throws IOException
        {
                //setAndGet();
                loadDemo();
       }
public static void loadDemo()throws IOException
        {
                Properties prop = new Properties();

                FileInputStream fis = new FileInputStream("info.txt");               
               
                //应该在修改前先将流中的数据加载进集合
                prop.load(fis);
               
                prop.setProperty("hehe","11");
               
                //应该在修改之后建立输出流
                FileOutputStream fos = new FileOutputStream("info.txt");

                prop.store(fos,"wow");
               
                prop.list(System.out);
               
                fos.close();

                fis.close();
        }
}



作者: 张少威    时间: 2012-6-5 16:59
FileOutputStream fos = new FileOutputStream("info.txt");

上面这条语句执行的效果:
    1. 如果info.txt不存在,则会创建一个info.txt文件
    2. 如果info.txt存在,则会清空info.txt文件中的数据

所以如果楼主把FileOutputStream fos = new FileOutputStream("info.txt");这条语句放在prop.load(fis);语句之前,
结果就是,prop载入了一个空流。

希望楼主满意。

作者: 徐帅    时间: 2012-6-5 20:49
张少威 发表于 2012-6-5 16:59
FileOutputStream fos = new FileOutputStream("info.txt");

上面这条语句执行的效果:

如果info.txt存在,会清空info.txt文件中的数据。那这样的话,在修改过后建立一个输出流,info.txt
还是存在的啊。不就还要清空?你说会载入一个空流,fis和fos不是两个独立的流么?不是太明白啊,能否
说的详细点

作者: 徐帅    时间: 2012-6-5 21:00
伊文龙 发表于 2012-6-5 17:19
看FileOutputStream类的api帮助文档你就会很清楚了~~~
FileOutputStream(File file)
          创建一个向 ...

FileOutputStream(File file,boolean append)的意思是在文件尾添加数据,
我修改了下程序,结果正确。只是不明白为什么FileOutputStream(File file)
为什么放在不同位置会产生不同的结果?能否说的详细点啊
作者: 李春阳    时间: 2012-6-5 21:04
查看API看下FileOutputStream()构造方法:
有俩个:
1、FileOutputStream(File file)
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
2、FileOutputStream(File file, boolean append)
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

楼主用的是第一个构造方法。
这里就有个需要注意的地方,当你new你的fos的时候,对应文件夹内要是没文件,就会自动给你生成一个。
但当文件已经存在的时候,会覆盖之前的文件,
也就是你前面写的19 29都被清空~没了~

如果想实现你需要的结果的话,用第2种构造方法:
注意参数false为覆盖;true为追加。

因而你需要把你的构造方法改一下:
FileOutputStream fos = new FileOutputStream("info.txt", true);

作者: 张頔    时间: 2012-6-5 22:01
???搞不懂  为什么你的程序无一动没动 但是输出结果却是这样
--listing properties --
heihei=29
haha=19
hehe=11


没有出错呢????
作者: 张頔    时间: 2012-6-5 22:07
张少威 发表于 2012-6-5 16:59
FileOutputStream fos = new FileOutputStream("info.txt");

上面这条语句执行的效果:

???我运行了一边为什么没出错啊  汗汗
作者: 王杰    时间: 2012-6-5 22:24
如果你再将数据加载进集合前建立输出流,那么就会将原来的那个文件给覆盖了,那样你就相当于只是将setProperty的值存入了集合后又存入文件中。
作者: 张頔    时间: 2012-6-5 22:25
知道了
楼主的意思是
FileInputStream fis = new FileInputStream("info.txt");  
FileOutputStream fos = new FileOutputStream("info.txt");
prop.load(fis);
当这样时 会只出现hehe=11  对不对啊?
这是因为new FileOutputStream("info.txt");当你new时会把原先存在的给覆盖掉,这事file终究没有数据了
这时prop.load(fis);导入的file文件就是覆盖后的文件

          FileOutputStream fos = new FileOutputStream("info.txt");
                FileInputStream fis = new FileInputStream("info.txt");
                prop.load(fis);
这样是和上边一样也会覆盖

          FileInputStream fis = new FileInputStream("info.txt");
                FileOutputStream fos = null;
                prop.load(fis);
                fos = new FileOutputStream("info.txt");
这样就不回覆盖





作者: 徐帅    时间: 2012-6-6 21:42
张頔 发表于 2012-6-5 22:25
知道了
楼主的意思是
FileInputStream fis = new FileInputStream("info.txt");  

解答的很详细,明白了。谢谢
作者: 徐帅    时间: 2012-6-6 21:44
张頔 发表于 2012-6-5 22:01
???搞不懂  为什么你的程序无一动没动 但是输出结果却是这样
--listing properties --
heihei=29

呵呵,那还神奇了。我的输出流在数据载入文件之前建立就会覆盖了之前的文件
其他楼的已解答
作者: 徐帅    时间: 2012-6-6 21:48
李春阳 发表于 2012-6-5 21:04
查看API看下FileOutputStream()构造方法:
有俩个:
1、FileOutputStream(File file)

解答的很清晰,明白了。我的理解是这和FileWriter也可能会覆盖之前的文件一样。只是一个操作字符流,
一个操作字节流,都会和文件关联,原理应该是一样的





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2