`
yanguz123
  • 浏览: 555771 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

\(^_^)/ Java io 结构

    博客分类:
  • Code
 
阅读更多

 转自: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;
	}
}

 

  • 大小: 33.2 KB
  • 大小: 24.3 KB
  • 大小: 20.9 KB
  • 大小: 18.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics