IO是Java及众多编程语言很重要的一块,同时很多程序的瓶颈和耗时操作也都在IO这块。所以能够很好的解决IO问题对提高程序性能有很大的帮助!本章我们将要系统的对Java IO做个分析,通过理论加实践,希望能真正彻底的理解并且掌握了它。
一、简介
IO操作面临很多问题,信息量的巨大,网络的环境等等,因为IO不仅仅是对本地文件、目录的操作,有时对二进制流、还有一部分是网络方面的资源,所以多种原因直接造成IO操作无疑是耗时且复杂多变的。Java对IO的支持是个不断的演变过程,经过了很多的优化,直到JDK1.4以后,才趋于稳定,在JDK1.4中,加入了nio类,解决了很多性能问题,虽然我们有足够的理由不去了解关于Java IO以前的情况,但是为了学好现在的类,我们还是打算去研究下,通过掌握类的优化情况来彻底理解IO的机制!Java IO主要主要在java.io包下,分为四大块近80个类:
1、基于字节操作的I/O接口:InputStream和OutputStream
2、基于字符操作的I/O接口:Writer和Reader
3、基于磁盘操作的I/O接口:File
4、基于网络操作的I/O接口:Socket(不在java.io包下)
影响IO性能的无非就是两大因素:数据的格式及存储介质,前两类主要是数据格式方面的,后两个类是地址方面的:本地和网络。所以策划好这两个方面的活动,有助于我们合理使用IO。
二、基于字节的I/O操作(InputStream和OutputStream)
我们先来看看类图:
public abstract class InputStream extends Object implements Closeable
图1
图2
二者类似,我只详细讲解InputStream类,OutputStream留给大家自己去学习。InputStream类是个抽象类,里面核心的方法就是read()、read(byte b[])、read(byte b[], int off, int len),这三个方法是用于读取数据的底层的方法,他们可以用来读取以下这些类型的数据:
A. 字节数、B. String对象、C. 文件、D. 管道,从一端进入,从另一端输出、E. 流、F. internet资源
每一种数据源都有相应的InputStream子类,因为InputStream是个处于顶层的类,用来处理各种数据源的类都继承了InputStream类,我们来看看这些类:
ByteArrayInputStream:处理字节数组的类,允许将内存的缓冲区当做InputStream使用。
StringBufferInputStream:将String转换成InputStream,内部实现用的是StringBuffer。
FileInputStream:从文件中读取数据。
PipedInputStream:用于从管道中读取数据。
SequenceInputStream:将多个流对象转化成一个InputStream。
FilterInputStream:装饰器类,为其它InputStream类提供功能。
做过关于IO操作的读者知道,我们很少单独使用哪个类来实现IO操作,平时都是几个类合起来使用,这其实体现了一种装饰器模式(详见:http://blog.csdn.net/zhangerqing)的思想,在后面的分析中我们会详细的分析。从上面的图1中我们可以看出,FilterInputStream虽说是Inputstream的子类,但它依然是BufferedInputStream、DataInputStream、LineNumberInputStream、PushbackInputStream类的父类,这四个类分别提供了最贴近我们程序员使用的方法,如:readInt() 、readLine()、readChar()等等。对于IO操作,不管是磁盘还是网络,最终都是对字节的操作,而我们平时写的程序都是字符形式的,所以在传输的过程中需要进行转换。在字符到字节的转换过程中,我们需要用到一个类:InputStreamReader。
三、基于字符的I/O操作(Writer和Reader)
图3
图4
Writer和Reader操作的目的就是操作字符不是字节,和InputStream和OutputStream配合增加IO效果。通过InputStreamReader和OutputStreamReader可以进行字节和字符的转换,设计Writer和Reader的目的是国际化,使IO操作支持16位的Unicode。
四、基于磁盘的I/O操作(File)
五、基于网络的I/O操作(Socket)
六、NIO
七、经典IO操作
Library:1、从本地字符流文件(绝对、相对)地址读取文件
import java.io.BufferedReader; import java.io.FileReader; import java.io.StringReader; class InputStreamTest { public static String read(String filename) throws Exception { BufferedReader br = new BufferedReader(new FileReader(filename)); //Reader实例 String s; StringBuffer sb = new StringBuffer(); while ((s = br.readLine()) != null) { sb.append(s + "\n"); } br.close(); return sb.toString(); } }//sb就是文件的字符串,下面将其一个一个读出 public class MemoryInput { public static void main(String[] args) throws Exception { StringReader in = new StringReader( InputStreamTest.read("../ReaderStream/wwww.txt")); int c; while ((c = in.read()) != -1) System.out.print((char) c+" "); } }2、System.in、System.out
System.in返回的是未经包装的InputStream对象,所以需要进行装饰,经InputStreamReader转换为Reader对象,放入BufferedReader的构造方法中。除此之外,System.out和System.err都是直接的PriintStream对象,可直接使用。
public final class System { public final static InputStream in = null; public final static PrintStream out = null; public final static PrintStream err = null; private static volatile SecurityManager security = null; public abstract class InputStream implements Closeable { public class PrintStream extends FilterOutputStream implements Appendable, Closeable { public void println() { newLine(); } public void print(int i) { write(String.valueOf(i)); //class Writer.writer(String) write(str, 0, str.length()); } private void newLine() { try { synchronized (this) {
也可以使用java.util包下的Scanner类来实现上述程序;
3、读取二进制文件
public class BinaryFile { /* the parameter is a file */ public static byte[] read(File file) throws IOException { BufferedInputStream bf = new BufferedInputStream(new FileInputStream( file)); try { byte[] data = new byte[bf.available()]; bf.read(data); return data; } finally { bf.close(); } } /* the param is the path of a file */ public static byte[] read(String file) throws IOException { return read(new File(file).getAbsoluteFile()); } public static void main(String[] args) throws IOException{ byte[] a=BinaryFile.read("E:/jsL/20130415161705906.jpg"); String s=new String(a); System.out.println(s+a.length); } } 读出来的都是乱码
4、单个文件复制(边读编写)
public class CopyBinaryFile{ //private static final int MAX_SKIP_BUFFER_SIZE = 2048; public static void copyFile(String oldPath,String newPath) throws IOException{ File oldfile=new File(oldPath); if(oldfile.exists()){ FileInputStream inf=new FileInputStream(oldPath); FileOutputStream outf=new FileOutputStream(newPath); byte[] b=new byte[1024]; int length=0; while((length=inf.read(b))>0){ outf.write(b, 0, length); //边读边写 } inf.close(); outf.close(); } } public static void main(String...args) throws IOException{ String oldPath="E:/jsL/20130415161705906.jpg"; String newPath = "e:/jsl/sb.jpg"; copyFile(oldPath,newPath); } }
5、文件目录复制(太慢)
package springc; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class CopyBinaryFolder { public static void copyFolder(String oldPath,String newPath) { try{ new File(newPath).mkdirs(); //新建文件目录(会自行判断是否存在) File oldfile=new File(oldPath); String[] context=oldfile.list(); File temp=null; for(int x=0;x<context.length;x++){ if(oldPath.endsWith("/")){ temp=new File(oldPath+context[x]); }else{ temp=new File(oldPath+"/"+context[x]); } if(temp.isFile()){ FileInputStream inf=new FileInputStream(temp); FileOutputStream outf=new FileOutputStream(newPath+"/"+temp.getName().toString()); byte[] buffer=new byte[1024*5]; int l=0; while((x=inf.read(buffer))>0){ outf.write(l); } inf.close(); outf.close(); }else if(temp.isDirectory()){ copyFolder(oldPath+"/"+context[x], newPath+"/"+context[x]); } } } catch(Exception e){ System.out.println("复制出现异常"); try { throw e; } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } public static void main(String...strings){ System.out.println("复制中。。。"); copyFolder("E:/jsL/new1/","E:/jsL/new2"); System.out.println("复制完成!"); } }
6、文件管道复制(较快)
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; public class CopyChannelFile { public static void fileChannelCopy(String oldfile,String newfile) { FileInputStream fi=null; FileOutputStream fo =null; FileChannel in = null; FileChannel out = null; try { fi = new FileInputStream(new File(oldfile)); fo = new FileOutputStream(new File(newfile)); in = fi.getChannel();//得到对应的文件通道 out =fo.getChannel();//得到对应的文件通道 in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道 } catch (IOException e) { e.printStackTrace(); } finally { try { fi.close(); in.close(); fo.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } static void exeChannel(String oldfile,String newfile) throws InterruptedException{ long start,end; start=System.currentTimeMillis(); System.out.println(start); fileChannelCopy(oldfile,newfile); end=System.currentTimeMillis(); System.out.println("管道耗时:"+(end-start)+"ms"); //没有打印,不过很快 } static void exeStream(String oldfile,String newfile) throws IOException{ long start,end; CopyBinaryFile f=new CopyBinaryFile(); start=System.currentTimeMillis(); f.copyFile(oldfile, newfile); end=System.currentTimeMillis(); System.out.println("输出流耗时:"+(end-start)+"ms"); } public static void main(String...s) throws IOException{ fileChannelCopy("F:G/test.pdf","E:/jsL/new1/test.pdf"); //74M // exeStream("F:G/test.pdf","E:/jsL/new1/test.pdf"); } }
l
相关推荐
java IO教程,java IO教程,java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程,java IO教程,java IO教程,java IO...
在 Java 项目中,出现了 java.io.CharConversionException: isHexDigit 异常,导致项目无法运行。该异常通常发生在 URL 传值时,例如在 JSP 页面中加载 JS 文件时。在 URL 传值时,服务器端获取参数时出现问题,导致...
在深入探讨`java.io.Reader`与`java.io.InputStream`的具体差异之前,我们首先需要理解这两者在Java I/O操作中的基础角色。`java.io.Reader`和`java.io.InputStream`是Java标准库中处理输入数据的核心类,它们分别...
在Java中,IO操作主要通过`java.io`包来实现,这个包包含了用于文件读写、标准设备输出等操作的一系列类和接口。Java IO的主要特点是基于流的概念来进行数据的输入和输出。 #### 2. Java IO模型 Java的IO模型采用...
Java的IO流是Java编程语言中的重要组成部分,它主要用于数据的输入和输出操作。在Java中,IO流被设计为处理任何类型的数据,包括字符、字节甚至对象。本练习旨在帮助初学者理解和掌握Java IO流的基础知识。 一、IO...
Java 中的 IO 流详解 Java 中的 IO 流是指在 Java 语言中对输入输出操作的抽象,主要用于实现程序与外部设备和其他计算机之间的交流,尤其是对磁盘文件的操作。IO 流的概念是在 1984 年由 C 语言第一次引入的,后来...
Java 中文件 IO 流 Java 中文件 IO 流是指 Java 语言中对文件的输入输出操作,通过定义文件流来实现文件的读写操作。文件流是指在程序中用于文件输入输出的对象, Java 中提供了多种文件流类型,包括 InputStream ...
Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常基础的部分,在面试当中经常出现。对于初学者而言,IO 部分是容易忽略的内容,求职者一定要掌握该...
Java中的IO流是Java平台提供的一种处理输入输出数据的核心机制,广泛应用于文件读写、网络通信、数据转换等场景。IO流分为字节流(Byte Stream)和字符流(Character Stream),它们构成了Java IO系统的基础。 1. *...
Java 网络IO简介: bio nio aio
在Java中,IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节的数据,而字符流则处理Unicode字符集中的字符。`InputStreamReader`和`BufferedReader`是Java中处理字符流的两...
Java的IO系统是Java编程中的核心部分,它允许程序与外部世界进行数据交换,包括读取文件、写入文件、网络通信以及设备交互等。理解并掌握Java的IO系统对于任何Java开发者,尤其是新手,都是至关重要的。在这个实例...
例如,javaio.bmp和javaio2.bmp可能是两张展示IO框架图的图片,其中详细描绘了不同类之间的继承关系和使用场景,帮助开发者更好地理解和掌握Java IO系统。 总结一下,Java IO框架是Java平台不可或缺的一部分,它为...
Java IO系统是Java平台标准库中的一个重要组成部分,主要用于处理输入输出操作。Java IO系统主要包括两个包:`java.io`和`java.nio`(New IO),其中`java.io`提供了一系列基于流的I/O操作接口与实现类,而`java.nio...
Java中的IO(Input/Output,输入/输出)是Java编程中不可或缺的一部分,它主要用于处理数据的读取和写入。以下是对Java IO的详细整理: 首先,Java中的`File`类是操作文件和目录的基础,它提供了许多方法来创建、...
java 中文件的操作,适合基本入门的 ,
JavaIO流详解归纳 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...
在这个“java小项目练习IO实现”中,我们将探讨如何利用Java的IO流来实现本地数据的序列化与反序列化,以及如何将这些概念应用到实际项目中,比如“Olymplic Games Project(IO版)”。 首先,让我们理解什么是序列化...
Java IO(输入输出)是Java平台中的核心概念,主要用于数据的读取和写入操作。在Java SE中,IO框架提供了丰富的类库,使得开发者能够处理各种类型的数据流,包括文件、网络、内存等。本资源"java_IO.rar"包含了关于...
Java中IO系统总结[整理].pdf