转自:http://blog.csdn.net/xiaocaidexuexibiji/article/details/17101573
什么是流:
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
流的分类:
根据数据类型:字符流,字节流
根据数据流向:输入流,输出流
字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
区别:
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
Java流操作有关的类或接口
Java中流的类结构图
1.InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
ObjectInputStream 和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。意思是FileInputStream类可以通过一个String路径名创建一个对象,FileInputStream(String name)。而DataInputStream必须装饰一个类才能返回一个对象,DataInputStream(InputStream in)。如下图示:
实例:
import java.io.*;
public class IOTest {
public static void testFileInputStream_1(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[1024];
is.read(buffer);
is.close();
System.out.println(new String(buffer));
}
public static void testFileInputStream_2(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = is.read(buffer);
is.close();
System.out.println(new String(buffer, 0, len));
}
public static void testFileInputStream_3(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
is.read(buffer);
is.close();
System.out.println(new String(buffer));
}
public static void testFileInputStream_4(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
for (int i = 0; i < buffer.length; i++) {
buffer[i] = (byte) is.read();
}
is.close();
System.out.println(new String(buffer));
}
public static void testFileInputStream_5(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[1024];
int count = 0;
int temp = 0;
while ((temp = is.read()) != -1) {
buffer[count++] = (byte) temp;
}
is.close();
System.out.println(new String(buffer, 0, count));
}
public static void testDataInputStream(String fileName) throws Exception {
File file = new File(fileName);
DataInputStream is = new DataInputStream(new FileInputStream(file));
char[] buffer = new char[1024];
int count = 0;
char temp;
while ((temp = is.readChar()) != '\n') {
buffer[count++] = temp;
}
System.out.println(buffer);
}
public static void testPushbackInputStream(String content) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes());
PushbackInputStream pis = new PushbackInputStream(bais);
int len = pis.available();
System.out.println("len: " + len);
int temp;
while ((temp = pis.read()) != -1) {
if (temp == '.') {
pis.unread(temp);
temp = pis.read();
System.out.println("Pushback: " + (char) temp);
} else {
System.out.println((char) temp);
}
}
}
}
2.OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,
ObjectOutputStream 和所有FilterOutputStream的子类都是装饰流。具体例子跟InputStream是对应的。
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class IOTest {
public static void main(String[] args) throws Exception {
testZipInputStream_1("E:\\temp\\2012_04_23_mr_nr.zip", "E:\\temp\\");
}
public static void testZipOutputStream_1(String fileNameSrc, String fileNameZip)
throws Exception {
File file = new File(fileNameSrc);
File zipFile = new File(fileNameZip);
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(os);
ZipEntry ze = new ZipEntry("注意这个地方");
zos.putNextEntry(ze);
zos.setComment("zip test");
// byte[] buffer = new byte[is.available()]; is.read(buffer);
// zos.write(buffer);
int temp = 0;
while ((temp = is.read()) != -1) {
zos.write(temp);
}
is.close();
zos.close();
os.close();
}
public static void testZipOutputStream_2(String fileNameSrc, String fileNameZip)
throws Exception {
File file = new File(fileNameSrc);
File zipFile = new File(fileNameZip);
InputStream is = null;
OutputStream os = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(os);
zos.setComment("zip test");
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
is = new FileInputStream(files[i]);
ZipEntry ze = new ZipEntry(file.getName() + File.separator + files[i].getName());
zos.putNextEntry(ze);
byte[] buffer = new byte[is.available()];
is.read(buffer);
zos.write(buffer);
is.close();
}
zos.close();
}
}
public static void testZipInputStream_1(String fileNameZip, String fileNameTo) throws Exception {
File file = new File(fileNameZip);
File outFile = null;
ZipFile zipFile = new ZipFile(file);
ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file));
ZipEntry entry = null;
InputStream input = null;
OutputStream output = null;
while ((entry = zipInput.getNextEntry()) != null) {
System.out.println("解压缩" + entry.getName() + "文件");
outFile = new File(fileNameTo + File.separator + entry.getName());
if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdir();
}
if (!outFile.exists()) {
outFile.createNewFile();
}
input = zipFile.getInputStream(entry);
output = new FileOutputStream(outFile);
int temp = 0;
while ((temp = input.read()) != -1) {
output.write(temp);
}
input.close();
output.close();
}
}
public static void testZipInputStream_2(String fileNameZip) throws Exception {
File file = new File(fileNameZip);
File fileTo = null;
ZipFile zipFile = new ZipFile(file);
InputStream is = new FileInputStream(file);
ZipInputStream zis = new ZipInputStream(is);
ZipEntry ze = null;
}
public static void testDataOutputStream(String fileName, String content) throws Exception {
File file = new File(fileName);
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file, true));
dos.write(content.getBytes());
dos.close();
}
public static void testFileOutputStream_1(String fileName, String content) throws Exception {
File file = new File(fileName);
OutputStream os = new FileOutputStream(file);
os.write(content.getBytes());
os.close();
}
public static void testFileOutputStream_2(String fileName, String content) throws Exception {
File file = new File(fileName);
OutputStream os = new FileOutputStream(file);
byte[] buffer = content.getBytes();
for (int i = 0; i < buffer.length; i++) {
os.write(buffer[i]);
}
os.close();
}
public static void testFileOutputStream_3(String fileName, String content) throws Exception {
File file = new File(fileName);
OutputStream os = new FileOutputStream(file, true);
os.write(content.getBytes());
os.close();
}
public static void testFileOutputStream_4(String fileFormName, String fileToName)
throws Exception {
File fileFrom = new File(fileFormName);
File fileTo = new File(fileToName);
FileInputStream fis = new FileInputStream(fileFrom);
FileOutputStream fos = new FileOutputStream(fileTo);
int temp;
while ((temp = fis.read()) != -1) {
fos.write(temp);
}
fis.close();
fos.close();
}
public static void testByteArrayOutputStream(String content) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = content.getBytes();
for (int i = 0; i < buffer.length; i++) {
baos.write(buffer[i]); // baos.write(Character.toUpperCase(buffer[i]));
}
System.out.println(baos.toString());
baos.close();
}
public static void testPipedStream() throws Exception {
Send send = new Send();
Receive receive = new Receive();
send.getPos().connect(receive.getPis());
new Thread(send).start();
new Thread(receive).start();
}
}
class Send implements Runnable {
private PipedOutputStream pos = null;
public Send() {
this.pos = new PipedOutputStream();
}
public PipedOutputStream getPos() {
return this.pos;
}
@Override
public void run() {
try {
pos.write("Hello world!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
try {
pos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Receive implements Runnable {
private PipedInputStream pis = null;
public Receive() {
this.pis = new PipedInputStream();
}
public PipedInputStream getPis() {
return this.pis;
}
@Override
public void run() {
byte[] buffer = new byte[1024];
int len = 0;
try {
len = this.pis.read(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
this.pis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Received: " + new String(buffer, 0, len));
}
}
3.字节流的输入与输出的对应图示
图中蓝色的为主要的对应部分,红色的部分就是不对应部分。紫色的虚线部分代表这些流一般要搭配使用。从上面的图中可以看出Java IO 中的字节流是极其对称的。哲学上讲“存在及合理”,现在我们看看这些字节流中不太对称的几个类吧!
4.几个特殊的输入流类分析
LineNumberInputStream
主要完成从流中读取数据时,会得到相应的行号,至于什么时候分行、在哪里分行是由改类主动确定的,并不是在原始中有这样一个行号。在输出部分没有对应的部分,我们完全可以自己建立一个LineNumberOutputStream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行号,看起来也是可以的。好像更不入流了。
PushbackInputStream
其功能是查看最后一个字节,不满意就放入缓冲区。主要用在编译器的语法、词法分析部分。输出部分的BufferedOutputStream 几乎实现相近的功能。
StringBufferInputStream
已经被Deprecated,本身就不应该出现在InputStream部分,主要因为String 应该属于字符流的范围。已经被废弃了,当然输出部分也没有必要需要它了!还允许它存在只是为了保持版本的向下兼容而已。
SequenceInputStream
可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从IO 包中去除,还完全不影响IO 包的结构,却让其更“纯洁”――纯洁的Decorator 模式。
PrintStream
也可以认为是一个辅助工具。主要可以向其他输出流,或者FileInputStream 写入数据,本身内部实现还是带缓冲的。本质上是对其它流的综合运用的一个工具而已。一样可以踢出IO 包!System.err和System.out 就是PrintStream 的实例!
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.SequenceInputStream;
public class IOTest {
public static void testSystemIn(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
System.setIn(is);
byte[] buffer = new byte[is.available()];
System.in.read(buffer);
System.out.println(new String(buffer));
}
public static void testSystemErr_2(String fileName) throws Exception {
File file = new File(fileName);
System.err.println("输出到控制台");
OutputStream os = new FileOutputStream(file);
PrintStream ps = new PrintStream(os);
System.setErr(ps);
System.err.println("重定向输出到文件err");
}
public static void testSysteErr_1() throws Exception {
OutputStream os = System.err;
os.write("Hello world!".getBytes());
os.close();
}
public static void testSystemOut_2(String fileName) throws Exception {
File file = new File(fileName);
System.out.println("输出到控制台");
OutputStream os = new FileOutputStream(file);
PrintStream ps = new PrintStream(os);
System.setOut(ps);
System.out.println("重定向输出到文件");
}
public static void testSysteOut_1() throws Exception {
OutputStream os = System.out;
os.write("Hello world!".getBytes());
os.close();
}
public static void testPrintStream(String fileName) throws Exception {
File file = new File(fileName);
OutputStream os = new FileOutputStream(file);
PrintStream ps = new PrintStream(os);
ps.println("Hellow world!");
ps.append("你好!");
ps.println();
String name = "James";
int age = 20;
ps.printf("This is %s, and he is %d", name, age);
ps.flush();
ps.close();
os.close();
}
public static void testSequenceInputStream(String fileFrom1, String fileFrom2, String fileTo) throws Exception {
File file1 = new File(fileFrom1);
File file2 = new File(fileFrom2);
File file3 = new File(fileTo);
InputStream is1 = new FileInputStream(file1);
InputStream is2 = new FileInputStream(file2);
OutputStream os = new FileOutputStream(file3);
SequenceInputStream sis = new SequenceInputStream(is1, is2);
int temp = 0;
while ((temp = sis.read()) != -1) {
os.write(temp);
}
is1.close();
is2.close();
os.close();
sis.close();
}
}
5.Reader
Reader 是所有的输入字符流的父类,它是一个抽象类。
CharReader、StringReader是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。
BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。
FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。
InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。
实例:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Scanner;
public class ReaderTest {
public static void testFileReader_1(String fileName) throws Exception {
File file = new File(fileName);
Reader reader = new FileReader(file);
char[] buffer = new char[1024];
reader.read(buffer);
System.out.println(new String(buffer));
reader.close();
}
public static void testFileReader_2(String fileName) throws Exception {
File file = new File(fileName);
Reader reader = new FileReader(file);
int temp = 0;
int count = 0;
char[] buffer = new char[1024];
while ((temp = reader.read()) != -1) {
buffer[count++] = (char) temp;
}
reader.read(buffer);
System.out.println(new String(buffer, 0, count));
reader.close();
}
public static void testBufferedReader(String fileName) throws Exception {
File file = new File(fileName);
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
int temp = 0;
int count = 0;
char[] buffer = new char[1024];
while ((temp = bufferedReader.read()) != -1) {
buffer[count++] = (char) temp;
}
System.out.println(new String(buffer, 0, count));
bufferedReader.close();
fileReader.close();
}
public static void testScanner_1() throws Exception {
Scanner scanner = new Scanner(System.in);
int intVal = scanner.nextInt();
System.out.println(intVal);
double doubleVal = scanner.nextDouble();
System.out.println(doubleVal);
String next = scanner.next();
System.out.println(next);
}
public static void testScanner_2(String fileName) throws Exception {
File file = new File(fileName);
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
scanner.close();
}
}
6.Writer
Writer 是所有的输出字符流的父类,它是一个抽象类。
CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。
PipedWriter 是向与其它线程共用的管道中写入数据,
BufferedWriter 是一个装饰器为Writer 提供缓冲功能。
PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。
OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似,后面会有它们的对应图。
实例:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class WriterTest {
public static void testFileWriter(String fileName) throws Exception {
File file = new File(fileName);
Writer writer = new FileWriter(file, true);
writer.write("Hello world!");
writer.flush();
writer.close();
}
public static void testBufferedWriter(String fileName) throws Exception {
File file = new File(fileName);
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write("你好");
bw.flush();
bw.close();
}
}
7.字符流的输入与输出的对应
8.字符流与字节流转换
转换流的特点:
(1)其是字符流和字节流之间的桥梁
(2)可对读取到的字节数据经过指定编码转换成字符
(3)可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
当字节和字符之间有转换动作时;
流操作的数据需要编码或解码时。
具体的对象体现:
InputStreamReader:字节到字符的桥梁
OutputStreamWriter:字符到字节的桥梁
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。
实例:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
public class IOTest {
public static void testInputStreamReader(String fileName) throws Exception {
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
Reader reader = new InputStreamReader(fis);
char[] buffer = new char[1024];
int len = reader.read(buffer);
System.out.println(new String(buffer, 0, len));
reader.close();
fis.close();
}
public static void testOutputStreamWriter(String fileName) throws Exception {
File file = new File(fileName);
FileOutputStream fos = new FileOutputStream(file);
Writer writer = new OutputStreamWriter(fos);
writer.write("Hello world!");
writer.flush();
writer.close();
}
}
9.File
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
实例:
import java.io.File;
public class FileTest {
public static void testFile_1() {
System.out.println(File.separator);
System.out.println(File.separatorChar);
System.out.println(File.pathSeparator);
System.out.println(File.pathSeparatorChar);
}
public static void testFile_2(String fileName) {
File file = new File(fileName);
if (file.isDirectory()) {
String[] fileStrs = file.list();
for (int i = 0; i < fileStrs.length; i++) {
System.out.println(i + " -> " + fileStrs[i]);
}
File[] fileList = file.listFiles();
for (int i = 0; i < fileList.length; i++) {
System.out.println(i + " => " + fileList[i].getAbsolutePath());
}
} else if (file.isFile()) {
System.out.println(file.getAbsolutePath());
}
}
}
10.RandomAccessFile类
该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。该对象特点:
1.该对象只能操作文件,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。
2.该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)
3.注意:该对象在实例化时,如果要操作的文件不存在,会自动创建;如果文件存在,写数据未指定位置,会从头开始写,即覆盖原有的内容。可以用于多线程下载或多个线程同时写数据到文件。
实例:
import java.io.File;
import java.io.RandomAccessFile;
public class FileTest {
public static void testRandomAccessFile_2(String fileName) throws Exception {
File file = new File(fileName);
RandomAccessFile raf = new RandomAccessFile(file, "rw");
String utf = raf.readUTF();
Boolean bol = raf.readBoolean();
char c = raf.readChar();
double d = raf.readDouble();
float f = raf.readFloat();
short s = raf.readShort();
int i = raf.readInt();
long l = raf.readLong();
System.out.println(utf);
System.out.println(bol);
System.out.println(c);
System.out.println(d);
System.out.println(f);
System.out.println(s);
System.out.println(i);
System.out.println(l);
}
public static void testRandomAccessFile_1(String fileName) throws Exception {
File file = new File(fileName);
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.writeUTF("UTF String Test");
raf.writeBoolean(true);
raf.writeChar('x');
raf.writeDouble(12.24);
raf.writeFloat(33.12F);
raf.writeShort(24);
raf.writeInt(25);
raf.writeLong(1234);
raf.close();
}
public static void testFile_1() {
System.out.println(File.separator);
System.out.println(File.separatorChar);
System.out.println(File.pathSeparator);
System.out.println(File.pathSeparatorChar);
}
public static void testFile_2(String fileName) {
File file = new File(fileName);
if (file.isDirectory()) {
String[] fileStrs = file.list();
for (int i = 0; i < fileStrs.length; i++) {
System.out.println(i + " -> " + fileStrs[i]);
}
File[] fileList = file.listFiles();
for (int i = 0; i < fileList.length; i++) {
System.out.println(i + " => " + fileList[i].getAbsolutePath());
}
} else if (file.isFile()) {
System.out.println(file.getAbsolutePath());
}
}
}
11.ObjectInputStream,ObjectOutputStream和Serializable,Externalizable
实例
import java.io.Externalizable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
public class IOTest {
public static void testObjectOutputStream_1(String fileName) throws Exception {
File file = new File(fileName);
OutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
Person person = new Person("小明", 12);
oos.writeObject(person);
oos.flush();
oos.close();
os.close();
}
public static void testObjectOutputStream_2(String fileName) throws Exception {
File file = new File(fileName);
OutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
Animal animal = new Animal("小狗", 2);
oos.writeObject(animal);
oos.flush();
oos.close();
os.close();
}
public static void testObjectOutputStream_3(String fileName) throws Exception {
File file = new File(fileName);
OutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
Factory factory = new Factory("淘宝", "杭州");
oos.writeObject(factory);
oos.flush();
oos.close();
os.close();
}
public static void testObjectInputStream_1(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Object object = ois.readObject();
Person person = (Person) object;
System.out.println(person);
ois.close();
is.close();
}
public static void testObjectInputStream_2(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Object object = ois.readObject();
Animal animal = (Animal) object;
System.out.println(animal);
ois.close();
is.close();
}
public static void testObjectInputStream_3(String fileName) throws Exception {
File file = new File(fileName);
InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Object object = ois.readObject();
Factory factory = (Factory) object;
System.out.println(factory);
ois.close();
is.close();
}
}
class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "name:" + this.name + ",age:" + this.age;
}
}
class Animal implements Externalizable {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "name:" + this.name + ",age:" + this.age;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(this.name);
out.writeInt(this.age);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.name = (String) in.readObject();
this.age = in.readInt();
}
}
class Factory implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient String address;
public Factory() {
}
public Factory(String name, String address) {
this.name = name;
this.address = address;
}
public String toString() {
return "name:" + this.name + ",address:" + this.address;
}
}