Core Java——IO流的分类

来源:互联网 发布:kuka机器人编程语言 编辑:程序博客网 时间:2024/05/18 15:05

一:IO流的分类

1:从方向上分:输入流 / 输出流

2:从处理的单元上分:字节流 / 字符流

3:从处理的效率(介质):节点流 / 处理流

 二:流类基本结构:

三:一般操作文件流的步骤:

  1:使用File类来找到一个文件

  2:通过File类的对象去实例化字节流或者字符流的子类

  3:进行字节流或者字符流的读写操作

  4:关闭文件流

四:System.in和System.out

为了支持标准输入输出设备,java定义了两个特殊的流对象;System.in和System.out.

System.in:对应键盘;属于InputStream类型;使用它可以读取键盘上输入的数据。Scanner s=new Scanner(System.in)

System.out:对应显示器;属于PrintStream类型;PrintStream是OutputStream的一个子类,使用它可以将数据输出到显示器上。

五:打印流:PrintWriter

PrintWriter类(高级流)。

例1:向显示器上输出

public class PrintWriterDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
PrintWriter out = null;
// 通过System.out对PrintWriter实例化
out = new PrintWriter(System.out);
// 输出字符
out.print("Hello World!!");
out.close();
}
}

例2:向文件中输出

public class PrintWriterTest {


public static void main(String[] args) throws IOException {
PrintWriter out=null;
File file = new File("D:\\file\\my1108.txt");
//通过FileWriter实例化的out,所以out就就具备了向文件输出的能力
out=new PrintWriter(file);
//由FileWriter实例化,所以向文件中输出
out.print("你好!!");
out.close();
}
}

六:字节流和字符流之间的转换

1:InputStreamReader:用于将一个字节流中的字节转化成为字符流

2:OutputStreamWriter:用于将写入的字符转化成为字节后写入一个字节流中

注意:为了避免频繁的进行字符与字节之间的相互转化,最好不要直接使用这两个类来进行读写,而尽量使用BufferedReader来包装InputStreamReader和BufferedWriter来包装OutputStreamWriter

包装的过程:

//读取从键盘上输入的内容

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

//向显示器或者控制台输出

BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out));

实例1:

BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out));

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

String str=in.readLine();

out.write(str);

out.flush();

七:对象序列化:

对象序列化:是指将对象转换为二进制数据流的一种手段。通过将对象序列化,可以方便的实现对象的传输和保存。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

把Java对象转换为字节序列的过程称为对象的序列化。

把字节序列恢复为Java对象的过程称为对象的反序列化。

 

JDK类库中的序列化API

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

只有实现了Serializable接口的类的对象才能被序列化。

对象序列化包括如下步骤:

1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

2) 通过对象输出流的writeObject(Object obj)方法写对象。

对象反序列化的步骤如下:

1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

2) 通过对象输入流的readObject()方法读取对象。

实现Serializable接口

ObjectOutputStream只能对Serializable接口的类的对象进行序列化。默认情况下,ObjectOutputStream按照默认方式序列化,这种序列化方式仅仅对对象的非transient的实例变量进行序列化,而不会序列化对象的transient的实例变量,也不会序列化静态变量。

如果某个属性不想被序列化,那么就要使用transient来修饰此属性。

例:

public class Person implements Serializable{

private Stringname ;

privateintage ;

public Person(String name,int age){

this.name = name ;

this.age = age ;

}

public String toString(){

return"姓名:"+this.name+",年龄:"+this.age ;

}

}

 

public class SerializableDemo{

public static void main( String args[] )throws Exception{

File f = newFile("SerializedPerson.txt") ;

//serialize(f);

deserialize(f);

}

 

// 以下方法为序列化对象方法

//public static void serialize(File f) throws Exception

//{

//OutputStream outputFile = new FileOutputStream(f);

//ObjectOutputStreamcout = new ObjectOutputStream(outputFile);

//cout.writeObject(new Person("张三",25));

//cout.writeObject(new Person("李四",27));

//cout.close();

//}

// 以下方法为反序列化对象方法

public static void deserialize(File f)throws Exception{

InputStreaminputFile =newFileInputStream(f);

ObjectInputStreamcin =newObjectInputStream(inputFile);

Person p = (Person) cin.readObject();

System.out.println(p);

Person p1 = (Person) cin.readObject();

System.out.println(p1);

}

}


原创粉丝点击