黑马程序员技术交流社区
标题:
问个关于输入输出的问题
[打印本页]
作者:
莫嘉伟
时间:
2013-3-4 20:18
标题:
问个关于输入输出的问题
class Student implements Comparable<Student>
{
//定义学生类的name变量
private String name;
//定义学生类的数淡,语文和英语成绩
private int ma,cn,en;
//定义学生类的总分
private int sum;
//学生类的带参数构造器
Student(String name,int ma,int cn,int en){
this.name=name;
this.ma=ma;
this.cn=cn;
this.en=en;
this.sum=ma+cn+en;
}
//实现比较大小的方法
public int compareTo(Student s){
int num=new Integer(this.sum).compareTo(new Integer(s.sum));
if(num==0)
return this.name.compareTo(s.name);
return num;
}
//定义获取学生姓名的方法
public String getName(){
return this.name;
}
//定义获取学生总分的方法
public int getSum(){
return this.sum;
}
//定义判断两个学生对象是否相等的方法
public boolean equals(Object obj){
if(!(obj instanceof Student)) throw new ClassCastException("类型不匹配");
Student s=(Student)obj ;
return this.name.equals(s.name)&&this.sum==s.sum;
}
//定义打印学生对象时的输出信息
public String toString(){
return "student["+name+","+ma+","+cn+","+en+"]";
}
}
class StudentInfoTool{
public static Set<Student> getStudents() throws NumberFormatException, IOException{
return getStudents(null);
}
public static Set<Student> getStudents(Comparator<Student> cmp) throws NumberFormatException, IOException{
//定义一个缓冲字符输入流用于从标准输入中读取数据
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//字义一个字符串变量用于存放从标准输入中读入的一行数据
String line=null;
//定义一个存放Student类元素的Set集合,其初始值为null
Set<Student> stus=null;
//下面两行个if代码块根据传入的比较器返回使用不同的比较器排序后的stus
if(cmp==null){
stus=new TreeSet<Student>();
}
else{
stus=new TreeSet<Student>(cmp);
}
//当前输入不会空时进入循环
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
//定义一个字符串数组,将从标准输入读入的数据用","作为分隔符分隔成4个字符串
String[] info=line.split(",");
/* System.out.println(info.length);
for(int i=0;i<info.length;i++){
if(info[i]!=" "){
System.out.println(info[i]);}
}**/
Student stu=new Student(info[0],Integer.parseInt(info[1]),
Integer.parseInt(info[2]), Integer.parseInt(info[3]));
stus.add(stu);
System.out.println(stus.size());
}
bufr.close();
return stus;
}
public static void writeToFile(Set<Student> stus) throws IOException{
//定义一个缓冲输出流,其节点为一个向stu.txt输出的文件输出流
BufferedWriter bufw=new BufferedWriter(new FileWriter("stu.txt"));
//遍历stus集合中的元素,向文件中写入stus中元素的toString()方法返回的信息,
//
for(Student stu:stus){
bufw.write(stu.toString()+"\t");
bufw.write(stu.getSum()+"");
//输出完一个学生信息以后进行换行
bufw.newLine();
//刷新流
bufw.flush();
}
//关闭流
bufw.close();
}
}
public class Test3{
public static void main(String[] args) throws IOException{
Comparator<Student> cmp=Collections.reverseOrder();//反转比较器的顺序
Set<Student> stus=StudentInfoTool.getStudents(cmp);
System.out.println(stus);
StudentInfoTool.writeToFile(stus);
}
}
这个代码···我知道有的哥们一看就知道是啥了不过放心我已经搞完这个了现在就是有些想不通的回头看看,就是说这前面的将键盘输入读取下来并放进数组集合中去的我都试验过了是没错的,关键是第二个writeToFile()方法这里,我感觉只要我调用了writeToFile()方法无论我传入的参数为不为空它至少得给我创建个文件吧,可是我连文件都看到,是不是因为 BufferedWriter的问题?求解答
作者:
Benwolf0818
时间:
2013-3-4 21:13
你仔细看下你的代码,按执行顺序读,你如果不输入数据能读到flush吗?文件是在其后建立的
作者:
莫嘉伟
时间:
2013-3-4 21:58
可是我写入了数据一样不行,我确认过只要按格式输入的话是可以读到输入的
作者:
谢洋
时间:
2013-3-4 23:27
只要按格式输入可以,你有没有看找打印结果啊,是不是路径不找对啊?
作者:
莫嘉伟
时间:
2013-3-4 23:28
肯定找了啊,用Eclipse写的这路径老好找了,真没有,不信你把这代码跑一次看看,真没有
作者:
李俊伟
时间:
2013-3-5 01:34
本帖最后由 李俊伟 于 2013-3-5 10:37 编辑
我也测试过了,代码没问题,比如在控制台上输入
a,2,3,4,5
over
<1>若stu.txt文件不存在会在src的同级目录下创建此文件,并将输出内容拷贝到stu.txt文件中。再次在控制台上输入规定格式内容,over回车后,目标文件内容会被新内容覆盖,若不想stu.txt的原有内容被覆盖,可以将writeToFile方法中的BufferedWriter bufw=new BufferedWriter(new FileWriter("stu.txt"));改写为:writeToFile方法中的BufferedWriter bufw=new BufferedWriter(new FileWriter("stu.txt",true));
<2>若stu.txt是目录(当然造成异常的不止这一种)且跟src目录在同一级目录下,在输入over回车后则会抛异常。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2