`

Java IO 总结

阅读更多
1. Java的IO运用了装饰者模式,提供了一个称做链接(Chaining)的机制,可以将一个流处理器跟另一个流处理器首尾相接,以其中之一的输出为输入,形成一个流管道的链接,如:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("lecturer.dat"));


2. Java的IO具有对称性:
a. 输入 - 输出对称:
    字节流的两个抽象基类InputStreamOutputStream
// 输入流实现Closeable接口(close()方法)
public abstract class InputStream implements Closeable {
}

// 输出流实现Closable接口和Flushable接口(flush()方法)
public abstract class OutputStream implements Closeable, Flushable {
}


    字符流的两个抽象基类ReaderWriter

// Reader实现Readable(read()方法)和Closeable接口
public abstract class Reader implements Readable, Closeable {
}

// Writer实现Appendable接口(append系列方法)、Closable接口和Flushable接口
public abstract class Writer implements Appendable, Closeable, Flushable {
}


b. 字节流 - 字符流对称:
    输入流:InputStreamReader分别负责字节流和字符流的输入,
    输出流:OutputStreamWriter分别负责字节流和字符流的输出。

3. 使用完资源后,必须要手动调用close()方法关闭,否则会导致缓冲区的部分没有写入到流而产生错误。最好是放在finally块中,保证执行。
如果要把异常抛给调用者,省略catch从句;如果在catch中重新抛出异常会损失性能:

    public InputStream decrypt(File fileIn) throws Exception {
		FileInputStream fis = null;
		
		try {
			fis = new FileInputStream(fileIn);
		} finally {
			if (fis != null)
				fis.close();
		}
	}

   已经关闭的资源 再次调用close()不会抛异常,也不会产生任何动作。

4. 输入流和输出流之间的转换一般通过字节数组来中转:
	FileInputStream fis = null;
	FileOutputStream fos = null;
	
	try {
		fis = new FileInputStream(new File("eligible.txt"));
		fos = new FileOutputStream(new File("eligibility.txt"));
		byte[] buffer = new byte[8192];
		int count = 0;
		while ((count = fis.read(buffer)) > 0) {
			fos.write(buffer, 0, count);
		}
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		if (fos != null)
			fos.close();
		if (fis != null)
			fis.close();
	}


5. 字节流和字符流之间的转换:InputStreamReader, OutputStreamWriter
	FileInputStream fis = null;
	InputStreamReader isr = null;
	FileOutputStream fos = null;
	OutputStreamWriter osw = null;
	
	try {
		fis = new FileInputStream(new File("eligible.txt"));
		fos = new FileOutputStream(new File("eligibility.txt"));
		// Char reader wraps the byte input stream. It's preferable to specify the char set.
		// Otherwise messy code may occur.
		// Available char set: ASCII, UNICODE, GB2312, GBK, UTF-8, UTF-16, UTF-32
		isr = new InputStreamReader(fis, "UTF-8");
		// Char writer wraps the byte output stream. It's preferable to specify the char set.
		// Otherwise messy code may occur.
		osw = new OutputStreamWriter(fos, "UTF-8");
		char[] buffer = new char[1024];
		int count = 0;
		while ((count = isr.read(buffer)) > 0) {
			osw.write(buffer, 0, count);
		}
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		if (isr != null)
			isr.close();
		if (osw != null)
			osw.close();
	}


6. 底层的流一定是字节流,字符流不过是在其基础上按照编码进行了处理。

7. 使用缓冲类BufferedInputStream, BufferedOutputStream, BufferedReaderBufferedWriter来提升性能:
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("neglect.dat"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("negligible.dat"));
		BufferedReader br = new BufferedReader(new FileReader("elect.dat"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("election.dat"));


8. 扩展FilterInputStream, FilterOutputStream, FilterReaderFilterWriter来实现自定义的输入输出流处理类。

9. 如果文件路径包含特殊字符(如空格)经过编码后(%20)传给FileInputStream,会抛出java.io.FileNotFoundException:
		// String path = SpecialCaseInPath.class.getProtectionDomain().getCodeSource().getLocation().getPath() + "/..\\screw chew.xml"; // This long expression would bring the encoded path
		String path = "C:\\programs%20data\\screw chew.xml";
		FileInputStream fis = new FileInputStream(path);

解决办法:
		// Solution 1:
		// path = path.replaceAll("%20", " ");
		// Solution 2:
		path = URLDecoder.decode(path, "utf-8");
		FileInputStream fis = new FileInputStream(path);
分享到:
评论

相关推荐

    JavaIO总结

    有关Java输入输出流的总结有关Java输入输出流的总结有关Java输入输出流的总结

    JavaIO总结.pdf

    Java IO总结 Java IO是Java中对文件的操作方式,以流的方式进行。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件...

    Java io流总结

    Java io流的总结

    JavaIO总结[借鉴].pdf

    JavaIO总结[借鉴].pdf

    IO总结处理

    javaIO总结,帮助初学者了解及掌握IO,以及java高级的一些基础知识

    JavaIO总结思维导图

    java基础中的IO流部分的总结,有详细的知识点描述,思维导图的整体框架

    Java_IO完全总结

    Java IO系统主要包括两个包:`java.io`和`java.nio`(New IO),其中`java.io`提供了一系列基于流的I/O操作接口与实现类,而`java.nio`则提供了更高效的数据访问方式,如通道和缓冲区等。 Java IO系统的设计原则之...

    JAVA_IO流学习总结

    JAVA_IO流学习总结

    Java IO流 总结

    Java IO流总结 Java IO流是Java语言中最基本和最重要的输入/输出机制,负责将数据从外部世界输入到Java应用程序中或将数据从Java应用程序输出到外部世界。IO流可以分为两大类:字节流和字符流。 1. 节点流:离数据...

    java IO.chm

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

    JAVAIO流学习总结(转)

    这是别人总结的很有实用价值的javaIO流教程。

    JavaIO流详细总结

    下面是对Java IO流的详细总结: 1. 流的概念: 流是一种抽象的数据传输方式,可以将数据从一个地方传输到另一个地方。Java中的流分为输入流和输出流,分别用于读取和写入数据。流按照处理数据的不同类型,又可以...

    Java IO_NIO

    总结来说,Java NIO提供了一种更高效、更适合处理并发的IO模型,尤其在服务器端开发中,如高并发的网络应用,NIO的优势更为明显。理解和掌握Java IO与NIO的使用,对于提升Java应用程序的性能和可扩展性至关重要。

    《JAVA_IO流学习总结》

    总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...

    java io 详解

    #### 五、Java IO总结 Java IO是一个强大的框架,它支持各种不同的流类型,包括字节流和字符流。通过使用装饰模式,开发人员可以轻松地扩展流的功能,而无需修改原始流的实现。这种灵活性使得Java IO成为处理文件和...

    javaIO流知识大总结

    在这个大总结中,我们将深入探讨Java IO流的基本概念、分类、常用类以及实践应用。 1. **基本概念** - **流(Stream)**:在Java中,流是一个抽象的概念,代表数据的有序序列。它可以是字节流或字符流,流向可以是...

    Java学习之IO总结及mina和netty

    这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...

Global site tag (gtag.js) - Google Analytics