CSV文件格式
name,age,color,hobby 第一行为属性名字
Fido,5,White,Running 第二行开始为属性对应的值
Pat,3,Black,PlayingBall
对于传入的任意一个Object的List, 可以将其属性按上面的方式写入CSV文件
对于传入一个Class类的对象和文件名, 可以读取该文件并还原成对象的List.
--------------------
一道笔试题,大家可不可以提供点思路阿,我看到此题一片茫然不知如何入手

解决方案 »

  1.   

    如果是实际应用,我会建议你去找操作csv文件的开源库。
    自己玩的话,用io读数据。第一行作为metaData,依赖class反射获得对应method
    然后用反射创建instance,写数据。基本上。会reflect就简单,不会就没法搞。
      

  2.   

    需要用到反射写入时获得类的属性列表,然后根据get方法获得各属性值写入读取时获得类的属性列表,把文件里的对象强转成类的类型,然后通过set赋值,再放入list中
      

  3.   

    = = code在公司
    留个油箱
      

  4.   

    对于传入的任意一个Object的List, 可以将其属性按上面的方式写入CSV文件 
    可以把List存储的元素一个一个的取出来, 转换成对应的类型(不知道这个类型那还搞什么搞呀, 因为就这类型有这几个属性, 不可能你随便找个类型就读这几个属性吧), 把他的属性写到文件中, 用逗号隔开, 一行一个对象.
    对于传入一个Class类的对象和文件名, 可以读取该文件并还原成对象的List. 
    很像按行读取文件,然后使用如StringTokenizer分解, 用来构造一个List中的成员, 一行是一个成员.
      

  5.   

    其实很简单,你就把cvs当作.txt文件来理解把把你的数值全都add 到list中然后 FileWrite 就可以了吧BufferedWriter
      

  6.   

    7楼说得对,只不过就是规则比较固定的txt文件罢了,你能操作IO读写txt这个面试题就一点问题都没有了
      

  7.   

    import java.lang.reflect.*;
    import java.io.*;
    import java.util.*;class csvOperation 
    {
    public static void writeCSV(List list) throws IOException
    {
    File writer=new File("c:\\test.csv");
    BufferedWriter bw=new BufferedWriter(new FileWriter(writer));
    // String[] temp;
    // String aLine=""; Object o=list.get(0); //获取List中的一个对象
    Class cl=o.getClass(); //得到此对象的运行时类,cl.newInstance()可以生成该类的一个对象,
    Field[] fields=cl.getDeclaredFields(); //得到对象中的所有声明字段,包括private类型在内的所有字段
    AccessibleObject.setAccessible(fields,true); //反射机制默认行为受限于java的访问控制,这一句解除限制 for(int i=0;i<fields.length;i++) //循环遍历整个fields数组,调用每个Field对象的getName()方法取得Field的
    { //名称,
    Field f=fields[i];
    if(i==fields.length-1) //将属性名称作为csv文件的第一行写入
    bw.write(f.getName()+"\r\n");
    else
    bw.write(f.getName()+",");
    } Object p;
    for(int k=0;k<list.size();k++) //此循环遍历List中的所有对象,取每个对象的字段值
    {
    p=list.get(k); //cl=p.getClass();
    //Field[] fields=cl.getDeclaredFields(); for(int i=0;i<fields.length;i++) //内循环将一个对象的字段值作为一行写进csv文件
    {
    Field f=fields[i];
    //String name=f.getName();
    try
    {
    Object val=f.get(p); //此句为关键,取得f字段的值,不管字段是什么类型(int,String等),这个方法是通用的

    if(i==fields.length-1) //字段值写入csv文件
    bw.write(val.toString()+"\r\n");
    else
    bw.write(val.toString()+",");
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }
    } bw.flush();
    }

    public static void main(String[] args)
    {
    List list=new ArrayList();
    list.add(new Person("tom",19,"red","sleeping"));
    list.add(new Person("bill",23,"green","eating"));
    list.add(new Person("bush",24,"white","talking")); try{
    csvOperation.writeCSV(list);
    }
    catch(IOException ex)
    {
    ex.printStackTrace();
    }

    //System.out.println("Hello World!");
    }
    }///自定义的一个测试类Person
    class Person
    {
    private String name;
    private int age;
    private String color;
    private String hobby; public Person(String name,int age,String color,String hobby)
    {
    this.name=name;
    this.age=age;
    this.color=color;
    this.hobby=hobby;
    } public void setName(String name)
    {
    this.name=name;
    } public void setAge(int age)
    {
    this.age=age;
    } public void setColor(String color)
    {
    this.color=color;
    } public void setHobby(String hobby)
    {
    this.hobby=hobby;
    } public String getName()
    {
    return this.name;
    } public int getAge()
    {
    return this.age;
    } public String getColor()
    {
    return this.color;
    } public String getHobby()
    {
    return this.hobby;
    }
    } //end class Person
      

  8.   

    不好意思,忘了用插入源代码功能了。再发一遍。还有,代码中只提供了怎么样“对于传入的任意一个Object的List, 可以将其属性按上面的方式写入CSV文件”。也就是writeCSV(List list)方法。至于第二问,如果也用反射机制的话,也是可以实现的。写csv文件时可以get每个对象的字段值“Object val=f.get(p)”; ,在读csv文件时就是set对象的字段值“f.set(Object obj, Object value)”。依照这个思路,问题不难解决。
        还有楼主在哪儿弄到的这个笔试题?反射可不是java中的初级内容,我也是查了一下午资料才写出来这段代码的。“反射是一种功能强大且复杂的机制,使用它的对象是工具构造者而不是普通的应用程序员”。import java.lang.reflect.*;
    import java.io.*;
    import java.util.*;class csvOperation 
    {
    public static void writeCSV(List list) throws IOException
    {
    File writer=new File("c:\\test.csv");
    BufferedWriter bw=new BufferedWriter(new FileWriter(writer));
    // String[] temp;
    // String aLine=""; Object o=list.get(0); //获取List中的一个对象
    Class cl=o.getClass(); //得到此对象的运行时类,cl.newInstance()可以生成该类的一个对象,
    Field[] fields=cl.getDeclaredFields(); //得到对象中的所有声明字段,包括private类型在内的所有字段
    AccessibleObject.setAccessible(fields,true); //反射机制默认行为受限于java的访问控制,这一句解除限制 for(int i=0;i<fields.length;i++) //循环遍历整个fields数组,调用每个Field对象的getName()方法取得Field的
    { //名称,
    Field f=fields[i];
    if(i==fields.length-1) //将属性名称作为csv文件的第一行写入
    bw.write(f.getName()+"\r\n");
    else
    bw.write(f.getName()+",");
    } Object p;
    for(int k=0;k<list.size();k++) //此循环遍历List中的所有对象,取每个对象的字段值
    {
    p=list.get(k); //cl=p.getClass();
    //Field[] fields=cl.getDeclaredFields(); for(int i=0;i<fields.length;i++) //内循环将一个对象的字段值作为一行写进csv文件
    {
    Field f=fields[i];
    //String name=f.getName();
    try
    {
    Object val=f.get(p); //此句为关键,取得f字段的值,不管字段是什么类型(int,String等),这个方法是通用的

    if(i==fields.length-1) //字段值写入csv文件
    bw.write(val.toString()+"\r\n");
    else
    bw.write(val.toString()+",");
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }
    } bw.flush();
    }

    public static void main(String[] args)
    {
    List list=new ArrayList();
    list.add(new Person("tom",19,"red","sleeping"));
    list.add(new Person("bill",23,"green","eating"));
    list.add(new Person("bush",24,"white","talking")); try{
    csvOperation.writeCSV(list);
    }
    catch(IOException ex)
    {
    ex.printStackTrace();
    }

    //System.out.println("Hello World!");
    }
    }///自定义的一个测试类Person
    class Person
    {
    private String name;
    private int age;
    private String color;
    private String hobby; public Person(String name,int age,String color,String hobby)
    {
    this.name=name;
    this.age=age;
    this.color=color;
    this.hobby=hobby;
    } public void setName(String name)
    {
    this.name=name;
    } public void setAge(int age)
    {
    this.age=age;
    } public void setColor(String color)
    {
    this.color=color;
    } public void setHobby(String hobby)
    {
    this.hobby=hobby;
    } public String getName()
    {
    return this.name;
    } public int getAge()
    {
    return this.age;
    } public String getColor()
    {
    return this.color;
    } public String getHobby()
    {
    return this.hobby;
    }
    } //end class Person