我们知道Java中对文件操作有6种流:
1 文件字节流:这是InputStream和OutputStream的子类 eg: FileInputStream FileOutputStream
2 文件字符流 这是Reader和Writer的其子类 eg:FileReader FileWriter
3 缓冲流 BufferReader类创建的对象称为缓冲输入流,该输入流的指向必须是一个Reader流,称为BufferReader的底层流,底层流负责将数据读入到缓冲区,BufferReader流的源就是这个缓冲区,缓冲输入流再从缓冲区读取数据;同样的, BufferWriter类创建的对象称为缓冲输出流,该输入流的指向必须是一个Writer流,称为BufferWriter的底层流,BufferWriter流负责将数据写入到缓冲区,底层流的源就是这个缓冲区,底层流再从缓冲区写入数据到目的地
4 数据流 DataInputStream和DataOutputStream创建的对象称为数据输入流和数据输出流,这两个流允许程序按照与机器无关的风格读取Java原始数据。也就是说我们读取一个数值时候,不必关心这个数值应当是多少字节。
5 对象流 ObjectInputStream和ObjectOutputStream类分别是InputStream和OutputStream的子类。ObjectInputStream和ObjectOutputStream创建的对象称为对象输入流和对象输出流,对象输出流使用WriteObject(Object obj)方法将一个对象Obj写入输出流送往目的地,对象输入流则使用readObject()方法从源中读取一个对象到程序中。下面我着重讲解对象流
当我们使用对象流写入或者读取对象时,要保证对象是序列化的,这是为了保证能把对象写入到文件,并且从文件中正确读取到程序中。一个类如果实现了Serializable接口,那么这个类创建的对象就是序列化的对象,Serializable接口中的方法对程序是不可见的,因此实现该接口的类不需要实现额外的方法,当把一个序列化的对象写入到对象输出流的时候,JVM会自动的实现Serializable接口中的方法,按照一定格式的文本将对象写入到目的地。
但是我们应该明确,对象流写入到文件是以16进制保存的,因此使用普通的编辑器打开(word,记事本)会乱码,对象流本来就是适合网络之间的传输。
另外我们必须要明确是:使用readObject()只能从文件中读取一个一次,不能像BufferReader的readLine()方法一样可以循环控制中读取输入,也就是说如果文件中存在多个对象,那么只是读取第一个对象,例如:
package inputoutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
class TV implements Serializable{
private int price;
private double weigth;
private String describe;
private boolean isNice;
List<List<String>> list;
public TV(){
list=new ArrayList<>();
for(int i=0;i<10;i++)
list.add(new ArrayList<String>());
}
public List<List<String>> getList() {
return list;
}
public void setList(List<List<String>> list) {
this.list = list;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public double getWeigth() {
return weigth;
}
public void setWeigth(double weigth) {
this.weigth = weigth;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
public boolean isNice() {
return isNice;
}
public void setNice(boolean isNice) {
this.isNice = isNice;
}
}
public class ObjectStream {
private TV t;
private final static String OUTPUT="C:\\Users\\samsung\\Desktop\\weiwei.txt";
public ObjectStream(){
t=new TV();
t.setNice(true);
t.setDescribe("very nice~~");
t.setPrice(800);
t.setWeigth(200.23);
for(int i=0;i<10;i++){
for(int j=0;j<4;j++)
t.list.get(i).add("["+(i+3)+","+j+"]");
}
}
public void write(TV tv) throws FileNotFoundException, IOException{
File file=new File(OUTPUT);
/*TV []data=new TV[2];
data[0]=tv;data[1]=tv;*/
ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file,false));
//objectOutputStream.writeObject(data);
objectOutputStream.writeObject(tv);
objectOutputStream.close();
System.out.println("write over~!~~");
}
public void read(TV tv) throws FileNotFoundException, IOException, ClassNotFoundException{
File file=new File(OUTPUT);
ObjectInputStream inputStream =new ObjectInputStream(new FileInputStream(file));
TV v=(TV) inputStream.readObject();
//List<TV> s=new ArrayList<>();
//TV vv[]= (TV[]) inputStream.readObject();
//TV []vv=(TV[])inputStream.readObject();
//for(TV v:vv){
System.out.println(v.getDescribe());
System.out.println(v.getPrice());
System.out.println(v.isNice());
System.out.println(v.getWeigth());
System.out.println(v.getList());
//}
}
public void writeChar() throws Exception{
String output="C:\\Users\\samsung\\Desktop\\ww.txt";
String s="上来的飞机上开发是卡洛斯的房间里谁";
File file=new File(output);
FileOutputStream stream=new FileOutputStream(file);
stream.write(s.getBytes());
stream.close();
}
public void readChar()throws Exception{
String output="C:\\Users\\samsung\\Desktop\\ww.txt";
File file=new File(output);
FileInputStream stream=new FileInputStream(file);
byte b[]=new byte[200];
while(stream.read(b, 0, 200)!=-1){
String string=new String(b);
System.out.println(string);
}
stream.close();
}
public static void main(String[] args) throws Exception {
ObjectStream stream=new ObjectStream();
stream.write(stream.t);
stream.read(stream.t);
/*stream.writeChar();
stream.readChar();*/
}
}
但是当我们想要存放多个对象到某一个文件中并且想要读取的时候把所有的对象都读取出来,那么我们必须使用一种数据结构把这些对象存入,比喻list或者直接使用数组,并且必须保证存入时的数据结构和取出时的数据结构是一样的,比喻我们使用数组存放了对象,然后使用writerObject方法把这个数组写入,那么我们在使用readObject方法读取数据的时候必须将其返回类型定义为一个对象数组,例如:注意下面的代码和上面的代码的细微变化:
package inputoutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
class TV implements Serializable{
private int price;
private double weigth;
private String describe;
private boolean isNice;
List<List<String>> list;
public TV(){
list=new ArrayList<>();
for(int i=0;i<10;i++)
list.add(new ArrayList<String>());
}
public List<List<String>> getList() {
return list;
}
public void setList(List<List<String>> list) {
this.list = list;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public double getWeigth() {
return weigth;
}
public void setWeigth(double weigth) {
this.weigth = weigth;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
public boolean isNice() {
return isNice;
}
public void setNice(boolean isNice) {
this.isNice = isNice;
}
}
public class ObjectStream {
private TV t;
private final static String OUTPUT="C:\\Users\\samsung\\Desktop\\weiwei.txt";
public ObjectStream(){
t=new TV();
t.setNice(true);
t.setDescribe("very nice~~");
t.setPrice(800);
t.setWeigth(200.23);
for(int i=0;i<10;i++){
for(int j=0;j<4;j++)
t.list.get(i).add("["+(i+3)+","+j+"]");
}
}
public void write(TV tv) throws FileNotFoundException, IOException{
File file=new File(OUTPUT);
TV []data=new TV[2];
data[0]=tv;data[1]=tv;
ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file,false));
objectOutputStream.writeObject(data);
//objectOutputStream.writeObject(tv);
objectOutputStream.close();
System.out.println("write over~!~~");
}
public void read(TV tv) throws FileNotFoundException, IOException, ClassNotFoundException{
File file=new File(OUTPUT);
ObjectInputStream inputStream =new ObjectInputStream(new FileInputStream(file));
//TV v=(TV) inputStream.readObject();
//List<TV> s=new ArrayList<>();
//TV vv[]= (TV[]) inputStream.readObject();
TV []vv=(TV[])inputStream.readObject();
for(TV v:vv){
System.out.println(v.getDescribe());
System.out.println(v.getPrice());
System.out.println(v.isNice());
System.out.println(v.getWeigth());
System.out.println(v.getList());
}
}
public void writeChar() throws Exception{
String output="C:\\Users\\samsung\\Desktop\\ww.txt";
String s="上来的飞机上开发是卡洛斯的房间里谁";
File file=new File(output);
FileOutputStream stream=new FileOutputStream(file);
stream.write(s.getBytes());
stream.close();
}
public void readChar()throws Exception{
String output="C:\\Users\\samsung\\Desktop\\ww.txt";
File file=new File(output);
FileInputStream stream=new FileInputStream(file);
byte b[]=new byte[200];
while(stream.read(b, 0, 200)!=-1){
String string=new String(b);
System.out.println(string);
}
stream.close();
}
public static void main(String[] args) throws Exception {
ObjectStream stream=new ObjectStream();
stream.write(stream.t);
stream.read(stream.t);
/*stream.writeChar();
stream.readChar();*/
}
}
这里使用了一个对象数组data将两个对象存入并且读出的时候使用了对象数组来接收。