------- android培训、java培训、期待与您交流! ----------
一.对象序列化
所谓的对象序列化就是把对象进行流化。说白了就是通过流管道传对象
步骤:1.建立一个对象类
class Person implements Serializable//要实现序列化先要实现Serializable接口,或者Externalizable接口
{
static final long serialVersionUID = 42L;//自定义serialVersionUID
String name;
transient int age;//transient修饰成员不能被序列化
static String country country=”cn“;//静态成员也不能被序列化
Person(String name,int age,String country)
{
this.name=name;
this.age=age;
this.country=country;
}
}
步骤二 。在一个objectOutputStream流里面写对象
步骤三,在ObjectInoutStream流里面读出对象
class ObjectStreamDemo
{
public static void main(String[] args)
{
}
public stativ void readObject()
{
ObjectInputStream ois=new ObjectInputStream(new FileOutputstream("obj.txt"));
Person p=(Person)ois.readObject();
sop(p);
ois.close();
}
public static void writeObject() throws IOException
{
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputstream("obj.txt"));
oos.writeobject(new Person("lisi",39));
oos.close();
}
}
class Person implemnts Serializable
{
String name;
int age;
Person(String name,int age)
{
this.age=age;
this.name=name;
}
public String toString()
{
return name+":"age;
}
}
二。管道流
输入输出可以直接连接PipedInputStream和PipedOutStream
一边写一边读,读连着写
new PipedInputStream().connect(new PipedOutputStream());
将流对象写入到实例对象中,然后启动多线程方法
三.随即访问文件自身具备读写的方法
RandomAccessFile()
四.基本数据对象
DataOutputStream()
文件读写流FileOutputStream()
五.操作字节数组
ByteArrayInputStream(),数据源是一个字节数组
因为流对象都是数组对象,无需close()
六.常见编码表
ASCII 美国标准信息交换码 一个字节的7位来表示
欧洲码表
GB2312 占两个字节
Unicode 国际标准 两个字节一个字符
GBK 中文升级
UTF-8 三个字节表示一个字符
七.字符转换流
InputStreamReader
OutputStreamReader
在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流转换类。
OutputStreamWriter:是Writer的子类,将输出的字符变为字节流,即:将一个字符流的输出对象变为字节流的输出对象 ;
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象
一般读入InputStreamReader isr=new InputStreamReader(new FileInputStream("gbk.txt"),"GBK");//
一般写入OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("gbk.txt"),"UTF-8");
八.字符编码
字符串变字节数组
String str=”123“;
str.getBytes()
字节数组变字符串
new String(str.getBytes(),"ISO8859-1")
九练习
import java.io.*;
import java.util.*
class Student implements Comparble<Student>
{
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;
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 getNmae()
{
return name;
}
public int getSum()
{
return sum;
}
public int hashCode()
{
return name.hashCode()+sum*78;
}
public boolean equlas(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("不匹配");
Student s=(Student)obj;
return this.name.equlas(s.name) && this.sum==s.sum;
}
public String toString()
{
return "student"+name+",";
}
}
class StudentInfoTool
{
public static Set<Student> getStudent() throws IOException
{
return getStudent(null);
}
public static Set<Student> getStudent(Comparator<Student> cmp) throws IOException//指定强行逆转比较器,强行反转的Student的自然排列顺序,其实主要是强行逆转了实现了 Comparable 接口的对象 collection 的自然顺序。
{
BufferedRead bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
Set<Student> stus=null;
if(cmp==null)
stus=new TreeSet<Student>();
else
stus=new TreeSet<Student>(cmp);//带比较器的集合。
while((line=bufr.readLine()!=null)
{
if("over".equlas(line))
break;
String[] info=line.split(",")
Student stu=new Student(info[0],Integer.parseInt(info[1]),Integer.parseInt(info[2]),Integer.parseInt(info[3]));
stus.add(stu);
}
bufr.close();
return stus;
}
public static void write2File(Set<Student> stus) throws IOException
{
BufferedWirte bufw=new BufferedWriter(new FileWriter("stuinfo.txt"))
for(Student s:stus)
{
bufw.write(s.toString());
bufw.write(s.getSum());
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
class StudetnDemo
{
public static void main(String[] args)
{
Comparartor<Student> cmp=Collections.reversOrder();
set<Student> stus=StudentInfoTool.getStudents(cmp);
StudentInfoToo.write2File(stus);
}
}