`
yanguz123
  • 浏览: 568640 次
  • 性别: 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
分享到:
评论

相关推荐

    \\(^_^)/ Java io 结构

    总之,Java IO是Java平台的重要组成部分,对于任何Java开发者来说,理解和掌握Java IO的结构及核心概念是至关重要的。通过熟练运用这些工具,开发者可以有效地实现数据的读取、写入、转换和传输,从而构建出功能强大...

    \\(^_^)/ Java 使用Socket多线程传输整个文件夹

    文件夹的遍历可以使用`java.io.File`类的递归方法。同时,服务端还需要处理目录结构,确保在客户端重建相同的目录结构。 客户端则需要接收服务端发送的数据,并将其写入本地磁盘。这里,我们需要用到Socket的...

    java_test-////--/16

    标签“JAVA”确认了这个话题与Java编程语言紧密相关,因此我们还可以期待这个项目可能涉及到Java的基础语法、类与对象、异常处理、输入/输出流、集合框架、多线程、IO流(包括文件流和网络流)等核心概念。...

    net.zip_TCP网络聊天_java tcp/ip

    为了确保聊天消息的同步,可能需要使用线程安全的数据结构,如ConcurrentHashMap来存储在线用户及其对应的Socket对象。 在“net.zip”压缩包中,可能包含了以下文件和目录: 1. Server.java:服务器端程序,包含...

    j0601IO_chicken_Java-IO_prettyjtt_

    学习Java IO,不仅需要理解各个类的用法,还需要熟悉流的层次结构,了解何时选择使用字节流还是字符流,以及如何利用缓冲和转换来优化性能。此外,对于网络编程,还需要掌握Socket和ServerSocket等网络I/O类。通过...

    java io 结构图

    文件名"dd16b88f-d8ed-3378-b8a6-1ba319c0ea27.gif"和"eximg.jpeg"可能代表了这个Java IO结构图的图片文件,可以帮助读者直观地理解这个复杂的体系。 总之,Java IO系统为开发者提供了强大而灵活的工具来处理输入...

    IO流结构图_io_java_思维导图_

    在本篇文章中,我们将深入探讨Java IO流的基本结构、主要类和接口,以及如何使用它们来操作文件。"IO流结构图_io_java_思维导图_" 提供了一个清晰的可视化工具,帮助开发者理解这一复杂主题。 首先,让我们了解一下...

    java中的IO的基础教学(1)

    Java中的IO(输入/输出)系统是编程中不可或缺的一部分,特别是在处理数据的读取、写入、传输和存储时。本教程将深入讲解Java IO流的基础知识,包括其概念、分类、常用类以及如何在实际编程中应用。 一、IO流的概念...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、...3、JAVA IO流经典代码示例,示例从易到难。代码功能涉及字节、字符、字符串、文本文件、图片、音频、视频。演示错误用法和经典用法。 4、代码的结构可查看README文件。

    Java_IO完全总结

    2. **层次结构**:Java IO系统采用层次化的结构设计,使得用户可以根据需求选择合适的流进行组合使用。 3. **可扩展性**:通过装饰器模式和过滤器模式,可以轻松地扩展流的功能。 4. **灵活性**:Java IO系统提供了...

    VIP09_JavaSE_JavaIO_File_day0307-1.rar

    在"VIP09_JavaSE_JavaIO_File_day0307-1.rar"这个压缩包中,我们可以预想它包含的是一个关于Java IO和File类的课程或教程的第三天第七节的内容。下面,我们将深入探讨Java IO和File类的相关知识点。 1. **Java IO...

    java IO.chm

    这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、文件操作、对象序列化以及NIO(非阻塞IO)等多个方面进行展开。 一、Java IO体系结构 Java IO体系是Java平台中用于处理数据输入...

    传智播客_Java培训_毕向东_Java基础[07-IO]

    ### 传智播客_Java培训_毕向东_Java基础[07-IO]知识点解析 #### 一、概述 本教程由传智播客的资深讲师毕向东老师讲解,主要内容涉及Java语言中的输入输出(IO)技术。这部分是Java编程的基础之一,对于初学者来说...

    java IO 类层次图

    ### Java IO 类层次结构解析 #### 一、概述 Java IO(Input/Output)系统是Java平台中的一个重要组成部分,用于处理程序与外部设备之间的数据交换。Java IO系统提供了丰富的类来支持不同类型的输入输出操作,包括...

    Java_IO(输入输出)

    Java IO(输入输出)是Java编程语言中处理数据输入和输出的核心部分,它提供了一系列类和接口用于在程序与外部资源之间传输数据。在Java中,IO操作涉及到文件的读写、流的处理以及网络通信等。以下是关于Java IO中的...

    java_io详解

    ### Java IO详解 #### 1. 什么是IO 在计算机科学中,IO(Input/...理解Java IO的基本原理和类结构对于开发高效稳定的Java应用程序至关重要。通过合理选择和组合不同的流类,开发者可以轻松实现各种复杂的IO功能。

    java io.pdf

    Java IO体系结构主要由以下几个核心部分组成: 1. **流(Streams)**:Java IO的核心概念是流,它们代表数据的源和目的地。流可以是字节流或字符流,分为输入流和输出流。字节流处理单个字节的数据,而字符流处理...

    IO流 javaio java 流

    总的来说,Java的IO流体系结构复杂而强大,它提供了多种工具和策略来处理各种数据传输场景,包括文件操作、网络通信、对象序列化等。理解并熟练运用这些流可以帮助我们构建高效、可靠的Java应用程序。

    Java-从Decorator,Adapter模式看Java/IO

    Java的IO库是一个复杂而强大的系统,其设计思想和实现方式体现了多种设计模式,包括Decorator(装饰者)模式和Adapter(适配器)模式。本文将深入探讨这两个模式在Java/IO中的应用,并通过实例解释它们如何使得Java...

Global site tag (gtag.js) - Google Analytics