`

Java优化编程--核心类与性能 I/O流

    博客分类:
  • j2se
阅读更多

Java 的I/O流给我的感觉就是:要用到的时候用得很多,不用到的时候一点都不沾。Java 的I/O流作为最基本的输入输出系统,我想没多少人不会用到。然而许多人应该都只是使用其最方便的调用方式,而不会去加多一层缓冲。而其实加多一层缓冲区,只是一个很简单的工作却能使其性能有巨大的提高。
      Java的I/O类:
            基本输入/输出流:InputStream/OutputStream
            文件输入/输出流:FileInputStream/FileOutputStream
            对象输入/输出流:ObjectInputStream/ObjectOutputStream
            字符数据的输入/输出流:Reader/Writer
      在Java的一般输入/输出流中都是采用单字节的读取方法,每次只读取一个字节的数据,效率低。如果在读取与写入时增加一个临时缓冲区,每次便可读取一个缓冲区大小的数据块,提高效率。
mark--1:系统缓冲流提高性能
      ......//方式一
      InputStream in = null;
      OutputStream out = null;
      try{
            in = new FileInputStream( "D:/fileFrom.err" ); 
            out = new FileOutputStream( "D:/fileTo.err" );
            while( true ){
                  int bytedata = in.read();
                  if( bytedata == 1 )
                        break;
                  out.write(bytedata );
            }
      }finally{......}
      ......//方式二
      InputStream inBuffer = null;
      OutputStream outBuffer = null;
      try{
            InputStream in = new FileInputStream( "D:/fileFrom.err" ); 
            inBuffer = new BufferedInputSteam(in);                              //系统缓冲
            OutputStream out = new FileOutputStream( "D:/fileTo.err" );
            inBuffer = new BufferedInputSteam(out);                              //系统缓冲
            while( true ){
                  int bytedata = in.read();
                  if( bytedata == 1 )
                        break;
                  out.write(bytedata );
            }
      }finally{......}
      文件763KB下:
      方式一是直接读取与写入的,耗时:4844ms
      方式二是系统缓冲区类读取与写入,耗时:3156ms

mark--2:自定义缓冲区提高I/O操作效率
      自定义缓冲区其实就是自己创建一个数组来担当缓冲区的角色。
      
      在利用数组做缓冲区之前先了解下数组读取与写入的方法与单字节的区别:
      单字节读取与写入:
      FileInputStream.read();
      FileOutputStream.write( int b );
      数组读取与写入:
      InputStream.read(byte[] b);
      InputStream.read(byte[] b, int off, int length );
      FileOutputStream.write(byte[] b );
      FileOutputStream.write(byte[] b, int off, int length );
      除此之外系统缓冲区类也有同样的方法:(也就是将参数改成和上面的一样)
      BufferInputStream.read(byte[] b, int off, int length );
      BufferOutputSteam.write(byte[] b, int off, int length );

      现在使用自定义数组来作缓冲区,看看时间效率如何。
       ......
      InputStream in = null;
      OutputStream out = null;
      try{
            in = new FileInputStream( "D:/fileFrom.err" ); 
            out = new FileOutputStream( "D:/fileTo.err" );
            int availableLength = in.avialable();
            byte[] totalBytes = new byte[availableLength ];
            int bytedata = in.read(totalBytes);
            out.write(totalBytes);
      }finally{......}
      同mark--1同样的文件,此时耗时109ms。此时需要注意的就是,由于此时的缓冲区是自定义的,大少也由你来决定。这便要你选择恰当大小的缓冲区,不然如果你的缓冲区过大,而运行的PC的内存又太小的话,可想而知这必将影响系统速度。另外如果文件很小而选取一个很大的缓冲区也将会造成浪费。

mark--3:字符输入/输出流类的缓冲区
      ......//方式一
      Reader reader = new FileReader( "D:/filefrom.err" );
      int c = 0;
      while( (c = reader.read() ) != -1 ){}
      ......//方式二,使用缓冲区
      reader = new FileReader( "D:/filefrom.err" );
      reader = new BufferedReader( reader );
      ......
      运行效率比较: 方式一:361ms  方式二:26ms

mark--4:压缩文件拷贝性能的提高--压缩流
      压缩流位置:
      java.util.Zip.ZipInputStream
      java.util.Zip.ZipOutputStream
      
      ......
      ZipOutPutStream zipoutputstream = new ZipOutPutStream ( new java.io.FileOutputStream( "D:/fileto.err" ) );     
      zipoutputstream.setMethod( ZipOutPutStream.DEFLATED );
      File file = new File( "D:/filefrom.err" );
      byte[] rgb = new byte[1000];
      int n;
      //创建一个ZIP entry
      ZipEntry zipentry = new ZipEntry( "D:/fileto.err" );
      //添加ZIP entry 与相关数据
      zipoutputsteam.putNextEntry( zipentry );
      FileInputStream fileInputstream = new FileInputStream( file );
      while( (n = fileInputstream.read(rgb) ) > -1 ){
            zipoutputstream.write(rgb, 0, n);
      }
      ......
      与直接通过文件输入输出流读写文件相比,压缩流耗时78ms,直接读写耗时172ms。

分享到:
评论

相关推荐

    Java I/O 过滤流-带格式的读写操作

    在Java编程语言中,输入/输出(I/O)是处理数据传输的核心部分。过滤流(Filter Stream)是Java I/O框架中的一个重要概念,它提供了一种优雅的方式来进行数据的读写操作,同时允许我们添加额外的功能,如字符编码...

    Java I/O, 2nd Edition

    7. **性能优化**:书中还涉及了如何通过缓冲、管道、异步I/O等技术来提高Java I/O的性能。 8. **案例研究**:提供了一些实际应用示例,帮助读者理解如何在实际项目中应用Java I/O技术。 9. **错误处理和调试**:...

    Java I/O层次结构详解

    本文将深入探讨Java I/O层次结构,包括核心类、接口和它们的关系,以及常见用法。 1. **基础概念** - **流(Stream)**:Java I/O中的流分为字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节...

    Java编程课程-Java核心基础

    5. **输入/输出(I/O)**:学习如何读写文件,使用流进行数据传输,以及如何进行网络通信,这些都是Java应用开发中的常见任务。 6. **线程与并发**:Java提供了强大的线程支持,课程会讲解线程的基本操作,同步机制...

    java程序性能优化-pdf+源码

    通过学习这本书,开发者不仅可以掌握Java性能优化的核心技术,还能培养出良好的编程习惯,使程序运行得更快、更稳定,为企业的系统性能提供有力保障。同时,对于个人技能提升和职业发展,这本书也具有很高的价值。

    NIO与I/O的区别

    标题“NIO与I/O的区别”涉及到的是Java编程中关于输入/输出(I/O)模型与新I/O(New I/O,NIO)模型的对比。这两种模型在处理数据流时有不同的特性和适用场景,理解它们的区别对于优化Java程序的性能至关重要。 I/O...

    Java高级编程

    Java高级编程涵盖了许多关键主题,其中包括Java输入/输出(I/O)系统,非阻塞I/O(NIO),以及基于Java的Netty框架。这些领域是Java开发人员深入理解和优化应用程序性能的重要部分。 首先,Java I/O是Java平台的...

    JAVA核心编程 卷2 源代码

    5. **Java I/O系统**:Java的I/O流体系结构提供了读写文件、处理输入输出流的能力。源代码会涵盖FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等类的使用,以及NIO(New I/O)框架,包括...

    java-program-optimization.rar_java性能

    Java程序性能优化是Java开发者关注的核心议题之一,它涉及到如何编写高效、运行流畅的代码,以提高应用程序的响应速度和整体效率。在这个领域,我们主要关注内存管理、并发处理、算法选择、I/O操作以及垃圾收集等多...

    Java网编程原理与JSP.Web开发核心技术

    考虑到给定的信息,我们将不包含重复的“每日书籍更新收藏必备***”这一部分内容,我们将专注于阐述“Java网编程原理与JSP.Web开发核心技术”这一主题的知识点。 首先,“Java网编程原理”涉及的是一系列基于Java...

    JAVA 核心编程第八版

    Java NIO(New IO)在Java 1.4引入,提供了非阻塞I/O,提高了并发性能。书中会对比讲解两者,指导开发者如何选择合适的IO模型。 6. **多线程**:Java提供了强大的多线程支持。书中会讲述线程的创建、同步、通信,...

    Java核心编程第九版(英文)

    《Java核心编程第九版》是Java开发者的重要参考资料,它涵盖了Java语言和开发的深度内容。本书分为两卷,Volume I主要关注基础知识,而Volume II则深入到高级特性。以下是这两卷书中涉及的主要知识点: **Volume I-...

    TCP-JAVA网络编程(PPT)

    - **多路复用I/O(Multiplexing I/O)**:Java NIO的Selector机制,允许多个套接字的事件被单一线程轮询,提高并发性能。 4. **TCP连接管理** - **连接池**:为优化性能,Java应用通常使用连接池来复用TCP连接,...

    Java核心编程技术

    5. **输入/输出(I/O)**:包括文件操作、流的概念、序列化与反序列化,以及NIO(非阻塞I/O)的理解和应用。 6. **多线程编程**:掌握线程的创建、同步与通信,如synchronized关键字、wait()、notify()和notifyAll()...

    java网络编程第四版pdf

    第二章“流”是Java网络编程的核心概念。Java中的I/O流提供了处理输入和输出的强大工具,无论是处理文件、网络连接还是其他资源,流都扮演着关键角色。本章详细阐述了字节流和字符流的区别,以及如何使用InputStream...

    java网络编程精讲

    - Java NIO (New I/O) API提供了非阻塞I/O的支持,主要包括`Selector`、`Channel`和`Buffer`等核心组件。 3. **网络编程安全性**: - 在网络通信过程中,数据的安全性非常重要。 - 可以使用SSL/TLS协议来加密...

    okio,面向java的现代i/o api.zip

    Okio 是一个面向 Java 的现代 I/O API,它由 Square 公司开发并维护,作为一个开源项目,...通过深入研究 Okio 的设计和实现,开发者可以学习到更多关于 I/O 缓存、并发处理和性能优化的知识,从而提升自己的编程技能。

    java网络编程技术与实践 杜佳荣 等

    《Java网络编程技术与实践》是由杜佳荣等人编著的一本深入讲解Java网络编程的书籍。这本书通过详细的实例和理论结合,旨在帮助读者掌握Java在网络编程中的应用。虽然提供的压缩包只包含了第一至第十章的部分源代码,...

    java-1.8.0-openjdk-1.8.0.275-1.b01.dev.redhat.windows.x86_64.zip

    2. **Java类库**: 这些是Java编程语言的核心API,包括基础类如集合框架、I/O流、网络编程、多线程等。Java SE(标准版)类库提供了一个广泛的接口和类,供开发者使用。 3. **编译器**: OpenJDK 包含了javac,这是...

    java高级编程.zip

    Java高级编程是一个涵盖广泛的主题,包括但不限于多线程、网络编程、I/O流、集合框架、反射、注解、设计模式、JVM优化等多个方面。这份"java高级编程.zip"的压缩包文件很可能是为了帮助Java开发者深入理解这些概念而...

Global site tag (gtag.js) - Google Analytics