- 浏览: 1249749 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
1. Java的IO运用了装饰者模式,提供了一个称做链接(Chaining)的机制,可以将一个流处理器跟另一个流处理器首尾相接,以其中之一的输出为输入,形成一个流管道的链接,如:
2. Java的IO具有对称性:
a. 输入 - 输出对称:
字节流的两个抽象基类:InputStream和OutputStream
字符流的两个抽象基类:Reader和Writer
b. 字节流 - 字符流对称:
输入流:InputStream和Reader分别负责字节流和字符流的输入,
输出流:OutputStream和Writer分别负责字节流和字符流的输出。
3. 使用完资源后,必须要手动调用close()方法关闭,否则会导致缓冲区的部分没有写入到流而产生错误。最好是放在finally块中,保证执行。
如果要把异常抛给调用者,省略catch从句;如果在catch中重新抛出异常会损失性能:
已经关闭的资源 再次调用close()不会抛异常,也不会产生任何动作。
4. 输入流和输出流之间的转换一般通过字节数组来中转:
5. 字节流和字符流之间的转换:InputStreamReader, OutputStreamWriter。
6. 底层的流一定是字节流,字符流不过是在其基础上按照编码进行了处理。
7. 使用缓冲类BufferedInputStream, BufferedOutputStream, BufferedReader或BufferedWriter来提升性能:
8. 扩展FilterInputStream, FilterOutputStream, FilterReader或FilterWriter来实现自定义的输入输出流处理类。
9. 如果文件路径包含特殊字符(如空格)经过编码后(%20)传给FileInputStream,会抛出java.io.FileNotFoundException:
解决办法:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("lecturer.dat"));
2. Java的IO具有对称性:
a. 输入 - 输出对称:
字节流的两个抽象基类:InputStream和OutputStream
// 输入流实现Closeable接口(close()方法) public abstract class InputStream implements Closeable { } // 输出流实现Closable接口和Flushable接口(flush()方法) public abstract class OutputStream implements Closeable, Flushable { }
字符流的两个抽象基类:Reader和Writer
// 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. 字节流 - 字符流对称:
输入流:InputStream和Reader分别负责字节流和字符流的输入,
输出流:OutputStream和Writer分别负责字节流和字符流的输出。
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, BufferedReader或BufferedWriter来提升性能:
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, FilterReader或FilterWriter来实现自定义的输入输出流处理类。
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);
发表评论
-
Netty系列之一:回显服务端和客户端
2014-09-02 22:26 9442Netty是一款基于Java NIO的 ... -
ByteBuffer 源码分析
2014-04-14 11:32 01. duplicate() 创建一个新的ByteBuffe ... -
PushbackInputStream 源码分析
2014-04-19 12:04 1379扩展java.io.FilterInputStream,代表的 ... -
RandomAccessFile 源码分析
2012-11-08 22:12 0public RandomAccessFile(S ... -
FileWriter 源码分析
2012-08-04 12:07 0public class FileWriter exten ... -
StringReader 源码分析
2012-07-12 18:00 1344public class StringReader ext ... -
OutputStreamWriter 源码分析
2012-06-29 09:59 2591字符流通向字节流的桥梁:可使用指定的charset将要写入流中 ... -
InputStreamReader 源码分析
2012-06-28 14:54 2250InputStreamReader在字节流和字符流之间架起了桥 ... -
Writer 源码分析
2012-06-28 17:47 1236Writer是写入字符流的抽象类。子类必须实现的方法有 wri ... -
PrintWriter 源码分析
2012-06-21 09:55 0public class PrintWriter exte ... -
FilterOutputStream 源码分析
2012-05-31 09:54 0public class FilterOutputStr ... -
PipedInputStream 源码分析
2012-05-31 09:53 0public class PipedInputStrea ... -
InputStream的mark和reset方法测试
2012-05-31 09:43 7976public class InputStreamTest ... -
BufferedOutputStream 源码分析
2012-05-30 18:25 5251BufferedOutputStream实现了一个缓冲输出流。 ... -
Reader 源码分析
2012-05-30 15:53 1568读取字符流的抽象类。子类需要重写read(char[], ... -
InputStream 源码分析
2012-05-30 14:38 3649InputStream是所有输入字节流类的超类。所有Input ... -
FileChannel 源码解析
2012-05-29 15:41 0public abstract class FileCh ... -
FileInputStream 源码分析
2012-05-29 10:53 5199java.io.FileInputStream是从文件系统中获 ... -
File 类源代码解析
2013-10-12 17:01 58791. 分隔符 // 名称分隔符,Windows系 ...
相关推荐
有关Java输入输出流的总结有关Java输入输出流的总结有关Java输入输出流的总结
Java IO总结 Java IO是Java中对文件的操作方式,以流的方式进行。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件...
Java io流的总结
JavaIO总结[借鉴].pdf
javaIO总结,帮助初学者了解及掌握IO,以及java高级的一些基础知识
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语言中最基本和最重要的输入/输出机制,负责将数据从外部世界输入到Java应用程序中或将数据从Java应用程序输出到外部世界。IO流可以分为两大类:字节流和字符流。 1. 节点流:离数据...
这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、文件操作、对象序列化以及NIO(非阻塞IO)等多个方面进行展开。 一、Java IO体系结构 Java IO体系是Java平台中用于处理数据输入...
这是别人总结的很有实用价值的javaIO流教程。
下面是对Java IO流的详细总结: 1. 流的概念: 流是一种抽象的数据传输方式,可以将数据从一个地方传输到另一个地方。Java中的流分为输入流和输出流,分别用于读取和写入数据。流按照处理数据的不同类型,又可以...
总结来说,Java NIO提供了一种更高效、更适合处理并发的IO模型,尤其在服务器端开发中,如高并发的网络应用,NIO的优势更为明显。理解和掌握Java IO与NIO的使用,对于提升Java应用程序的性能和可扩展性至关重要。
总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...
#### 五、Java IO总结 Java IO是一个强大的框架,它支持各种不同的流类型,包括字节流和字符流。通过使用装饰模式,开发人员可以轻松地扩展流的功能,而无需修改原始流的实现。这种灵活性使得Java IO成为处理文件和...
在这个大总结中,我们将深入探讨Java IO流的基本概念、分类、常用类以及实践应用。 1. **基本概念** - **流(Stream)**:在Java中,流是一个抽象的概念,代表数据的有序序列。它可以是字节流或字符流,流向可以是...
这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...