黑马程序员技术交流社区

标题: 有点问题解决一下 ,关于I/O输出问题。。 [打印本页]

作者: 杨习平    时间: 2012-9-4 13:51
标题: 有点问题解决一下 ,关于I/O输出问题。。
public class Testfile {
        public static void main(String[] args) throws IOException {
                // 定义TreeSet集合实现Comparator这个接口
                TreeSet<Studentss> set = new TreeSet<Studentss>(
                                new Comparator<Studentss>() {
                                        // 重写compare这个方法类实现按成绩排序输出
                                        @Override
                                        public int compare(Studentss o1, Studentss o2) {
                                                return (int) (o1.getChinese()- o2.getChinese());
                                        }

                                });
                // 实例化Student类,带参,
      System.out.println("请输入第一个学生的各门成绩");
      Studentss st=new Studentss();
      Studentss se=getAll(st);
      System.out.println("请输入第二个学生的各门成绩");
      Studentss st1=new Studentss();
      Studentss se1=getAll(st1);
      System.out.println("请输入第三个学生的各门成绩");
      Studentss st2=new Studentss();
      Studentss se2=getAll(st2);
      System.out.println("请输入第四个学生的各门成绩");
      Studentss st3=new Studentss();
      Studentss se3=getAll(st3);
      System.out.println("请输入五个学生的各门成绩");
      Studentss st4=new Studentss();
      Studentss se4=getAll(st4);
                // 将Student对象添加到集合中
                set.add(se);
                set.add(se1);
                set.add(se2);
                set.add(se3);
                set.add(se4);
                // 用迭代器编译
                Iterator<Studentss> it = set.iterator();
       
                while (it.hasNext()) {
                        Studentss ss = it.next();
                        System.out.println(ss.getName()+"语文是:" + ss.getChinese()+ ",英语是:" + ss.getEnglish()
                                        + "数学是:" + ss.getMath());
                           String sting=ss.getName()+","+ss.getChinese()+","+ss.getEnglish()+","+ss.getMath();
                         try {
                                File file=new File("D:\\snt.txt");
                                 if(!file.exists()){
                                         file.createNewFile();
                                 }
                                 BufferedWriter bu=new BufferedWriter(new FileWriter(file));
                                 bu.write(sting);
                                 bu.newLine();
                                 bu.flush();
                             bu.close();
                        } catch (FileNotFoundException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                       
                }

                }
public static Studentss getAll(Studentss rt){
              Scanner input=new Scanner (System.in);
              System.out.println("请输姓名:");
              String name=input.next();
              System.out.println("请输入语文成绩   分/");
              int chinese=input.nextInt();
              System.out.println("请输入英语成绩   分/");
              int english=input.nextInt();
              System.out.println("请输入数学成绩   分/");
              int math=input.nextInt();
               Studentss s=new Studentss(name,chinese,english, math);
              return s;
}
               
       
}
// 定义一个Student类
class Studentss {
        String name;
        int chinese;
        int english;
        int math;

        // 有无参,带参构造
        Studentss() {
        }

        Studentss(String name,int chinese, int english, int math) {
                this.name=name;
                this.chinese = chinese;
                this.english = english;
                this.math = math;
        }

        // 实现get,set方法

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getChinese() {
                return chinese;
        }

        public void setChinese(int chinese) {
                this.chinese = chinese;
        }

        public int getEnglish() {
                return english;
        }

        public void setEnglish(int english) {
                this.english = english;
        }

        public int getMath() {
                return math;
        }

        public void setMath(int math) {
                this.math = math;
        }


        @Override
        public String toString() {
                // TODO Auto-generated method stub
                return chinese+","+english+","+math;
        }
}
为什么在程序执行完时。你所建成的File file=new File("D:\\snt.txt");这个文本里面只有最后一个学生的信息啊?我想把五个学生的信息都打印到这个文本里面?高手啊  ??求助 。。

作者: 彭润生    时间: 2012-9-4 14:16
   while (it.hasNext()) {
                         Studentss ss = it.next();
                         System.out.println(ss.getName()+"语文是:" + ss.getChinese()+ ",英语是:" + ss.getEnglish()
                                         + "数学是:" + ss.getMath());
                            String sting=ss.getName()+","+ss.getChinese()+","+ss.getEnglish()+","+ss.getMath();
                          try {
                                 File file=new File("D:\\snt.txt");
                                  if(!file.exists()){
                                          file.createNewFile();
                                  }
                                  BufferedWriter bu=new BufferedWriter(new FileWriter(file));
                                  bu.write(sting);
                                  bu.newLine();
                                  bu.flush();
                              bu.close();
                         } catch (FileNotFoundException e) {
                                 // TODO Auto-generated catch block
                                 e.printStackTrace();
                         }
                        
                }
这一段出了问题,创建写入流因该在外面,这样循环一次就重新创建一个流,所以你文本里面只有最后一个
这样写就可以了
  File file=new File("D:\\snt.txt");
                 BufferedWriter bu=null;
                 if(!file.exists()){
                     file.createNewFile();
                    
                }
                  if(bu==null){
                          bu = new BufferedWriter(new FileWriter(file));
                  }
                while (it.hasNext()) {
                         Studentss ss = it.next();
                         System.out.println(ss.getName()+"语文是:" + ss.getChinese()+ ",英语是:" + ss.getEnglish()
                                         + "数学是:" + ss.getMath());
                            String sting=ss.getName()+","+ss.getChinese()+","+ss.getEnglish()+","+ss.getMath();
                          try {                             
                                                                  
                                  bu.write(sting);
                                  bu.newLine();
                                  bu.flush();
                             
                         } catch (FileNotFoundException e) {
                                 // TODO Auto-generated catch block
                                 e.printStackTrace();
                         }
                        
                }
                bu.close();
没运行过,你试试看可以不。。。。
作者: 杨习平    时间: 2012-9-4 14:40
谢谢 ,你提醒我。问题 已经解决,但你要注意重写compare时,不能用一门成绩来比较,这也是刚才改过来的。
作者: 袁艳超    时间: 2012-9-4 14:49
楼上的方法很正确,也可以这样解决:
        File file = new File("D:\\snt.txt");
                                if (!file.exists()) {
                                        file.createNewFile();
                                }
                                BufferedWriter bu=new BufferedWriter(new
                                                FileWriter(file,true));//构造函数中的第二个参数true表示以追加形式写文件
                                 bu.append(sting);
                                 bu.newLine();
                                 bu.flush();
                                 bu.close();

或者用RandomAccessFile

        // 打开一个随机访问文件流,按读写方式
                                RandomAccessFile randomFile = new RandomAccessFile(
                                                file, "rw");
                                // 文件长度,字节数
                                long fileLength = randomFile.length();
                                // 将写文件指针移到文件尾。
                                randomFile.seek(fileLength);
                                //前后都加上换行
                                randomFile.writeBytes("\r\n"+sting+"\r\n");
                                randomFile.close();




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