黑马程序员技术交流社区

标题: 关于properties的问题 [打印本页]

作者: 覃宏海    时间: 2012-9-15 13:29
标题: 关于properties的问题
本帖最后由 覃宏海 于 2012-9-15 14:04 编辑

为什么运行的结果和我想的不一样?
我预想的是先读取文件中的键值对 然后再改变某个键值对的值
但是输出结果却不是这样子
请问问题在哪里?

        public static void method() throws IOException{
                Properties pr = new Properties();
                FileReader fr = new FileReader("d:\\bbb.txt");
                FileWriter fw = new FileWriter("d:\\bbb.txt");
                pr.load(fr);
                System.out.println(pr);
                pr.setProperty("wangwu", "10");
                pr.store(fw, "haha");
                System.out.println(pr);
                fr.close();
                fw.close();
        }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


public static void method() throws IOException{
                Properties pr = new Properties();
                FileReader fr = new FileReader("d:\\bbb.txt");
                FileWriter fw = new FileWriter("d:\\bbb.txt");<--------------------------------我明白了,问题出现在这里,它把FileReader的文件给覆盖了,变成了一个空白文件
                pr.load(fr);
                System.out.println(pr);<----------------------------------------------------------应该把它移到这语句的后面,这样数据就存在了内存中,FlieWriter覆盖后内存的数据还是存在的!
                pr.setProperty("wangwu", "10");
                pr.store(fw, "haha");
                System.out.println(pr);
                fr.close();
                fw.close();
        }
作者: 唐志兵    时间: 2012-9-15 13:34
public static void method() throws IOException{
                Properties pr = new Properties();
                FileReader fr = new FileReader("d:\\bbb.txt");
                FileWriter fw = new FileWriter("d:\\bbb.txt");
                pr.load(fr);
                System.out.println(pr);   //这里你是要打印某个键的值吗,  应该写成pr.getProperty(String Key),写程序一定要看jdk文档 不能只看教程的。
                pr.setProperty("wangwu", "10");
                pr.store(fw, "haha");
                System.out.println(pr);
                fr.close();
                fw.close();
        }
作者: 覃宏海    时间: 2012-9-15 13:39
本帖最后由 覃宏海 于 2012-9-15 13:40 编辑
唐志兵 发表于 2012-9-15 13:34
public static void method() throws IOException{
                Properties pr = new Properties();
   ...

public static void method() throws IOException{
                 Properties pr = new Properties();
                 FileReader fr = new FileReader("d:\\bbb.txt");
                 FileWriter fw = new FileWriter("d:\\bbb.txt");
                 pr.load(fr);<------------------------------------------在这里读取文件的键值对信息
                 System.out.println(pr);<---------------------------然后再在这里把读取到的信息打出来(问题就出在这里,这里就打印出了一个{},里面没有信息)
                 pr.setProperty("wangwu", "10");
                 pr.store(fw, "haha");
                 System.out.println(pr);<---------------------------接着这里打印了wangwu=10 ,但是bbb.txt里的文件始终都没打印出来
                 fr.close();
                 fw.close();
         }

我的文件里存放的都是键值对
zhangsan=18
这样的信息
作者: 唐志兵    时间: 2012-9-15 13:42
本帖最后由 唐志兵 于 2012-9-15 13:43 编辑

你直接写System.out.println(pr);这是调用了 pr对象的 toString()方法, 如果要打印相应的键值(例如:wangwu这个键)要用:System.out.println(pr.getProperty("wangwu"));
作者: 覃宏海    时间: 2012-9-15 13:51
唐志兵 发表于 2012-9-15 13:42
你直接写System.out.println(pr);这是调用了 pr对象的 toString()方法, 如果要打印相应的键值(例如:wang ...

public static void method() throws IOException{
                 Properties pr = new Properties();
                 FileReader fr = new FileReader("d:\\bbb.txt");
                 FileWriter fw = new FileWriter("d:\\bbb.txt");——————————我把文件名该d:\\bba.txt后,打印的内容就和我要求的一样了,但是在文件夹中就创建了2个文件。我想要的是把要改变的内容在源文件上该。为什么那样就该不了了呢?
                 pr.load(fr);
                 System.out.println(pr);
                 pr.setProperty("wangwu", "10");
                 pr.store(fw, "haha");
                 System.out.println(pr);
                 fr.close();
                 fw.close();
         }
作者: 马睿    时间: 2012-9-15 14:03
本帖最后由 马睿 于 2012-9-15 14:04 编辑

正确代码和答案如下
  1.     public static void method() throws IOException
  2.     {
  3.         Properties pr = new Properties();
  4.         FileReader fr = new FileReader("d:\\bbb.txt");
  5.         
  6.         pr.load(fr);
  7.         Set<String> set = pr.stringPropertyNames();
  8.         for (String name : set)
  9.         {
  10.             System.out.println(name + "=" + pr.get(name));
  11.         }
  12.         
  13.         System.out.println(pr);
复制代码
/*注意此处顺序*/

  1.         FileWriter fw = new FileWriter("d:\\bbb.txt");
  2.         pr.setProperty("wangwu", "10");
  3.         pr.store(fw, "haha");
  4.         System.out.println(pr);
  5.         fr.close();
  6.         fw.close();
  7.         fr.close();
  8.     }
复制代码
主要原因是,FileWrite在创建对象的时候会有一个参数
FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。


如果你没有填写append,则会默认重新创建文档…………也就是一个空文档,由于你每次运行的时候又洗清了文档,会造成读到的是一个空文档,只要把创建对象放下面,延迟加载即可

根据C语言编程条例:尽可能在用到变量的对象的时候再去定义他,给他赋值,这样做其实是用心良苦
作者: 覃宏海    时间: 2012-9-15 14:05
马睿 发表于 2012-9-15 14:03
正确代码和答案如下/*注意此处顺序*/主要原因是,FileWrite在创建对象的时候会有一个参数
FileWriter(Strin ...

嗯,谢谢!我也是刚刚才发现的
作者: 覃宏海    时间: 2012-9-15 14:05
本帖最后由 覃宏海 于 2012-9-15 14:07 编辑
马睿 发表于 2012-9-15 14:03
正确代码和答案如下/*注意此处顺序*/主要原因是,FileWrite在创建对象的时候会有一个参数
FileWriter(Strin ...

嗯,谢谢!我也是刚刚才发现的!主要是在学IO的时候都是先创建的,我已经习惯了。{:soso_e127:}




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