CSV文件格式
name,age,color,hobby 第一行为属性名字
Fido,5,White,Running 第二行开始为属性对应的值
Pat,3,Black,PlayingBall
对于传入的任意一个Object的List, 可以将其属性按上面的方式写入CSV文件
对于传入一个Class类的对象和文件名, 可以读取该文件并还原成对象的List.
--------------------
一道笔试题,大家可不可以提供点思路阿,我看到此题一片茫然不知如何入手
name,age,color,hobby 第一行为属性名字
Fido,5,White,Running 第二行开始为属性对应的值
Pat,3,Black,PlayingBall
对于传入的任意一个Object的List, 可以将其属性按上面的方式写入CSV文件
对于传入一个Class类的对象和文件名, 可以读取该文件并还原成对象的List.
--------------------
一道笔试题,大家可不可以提供点思路阿,我看到此题一片茫然不知如何入手
自己玩的话,用io读数据。第一行作为metaData,依赖class反射获得对应method
然后用反射创建instance,写数据。基本上。会reflect就简单,不会就没法搞。
留个油箱
可以把List存储的元素一个一个的取出来, 转换成对应的类型(不知道这个类型那还搞什么搞呀, 因为就这类型有这几个属性, 不可能你随便找个类型就读这几个属性吧), 把他的属性写到文件中, 用逗号隔开, 一行一个对象.
对于传入一个Class类的对象和文件名, 可以读取该文件并还原成对象的List.
很像按行读取文件,然后使用如StringTokenizer分解, 用来构造一个List中的成员, 一行是一个成员.
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
还有楼主在哪儿弄到的这个笔试题?反射可不是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