`
samy_3
  • 浏览: 17360 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【原创】java.io.InputStream优化

阅读更多
今天无聊看java源码时发现 java.io.InputStream类用于移动文件指针的skip()方法可以再优化一下:

源码:
public long skip(long n) throws IOException {

	long remaining = n;
	int nr;
	if (skipBuffer == null)
	    skipBuffer = new byte[SKIP_BUFFER_SIZE];   

	byte[] localSkipBuffer = skipBuffer;
		
	if (n <= 0) {
	    return 0;
	}

	while (remaining > 0) {
	    nr = read(localSkipBuffer, 0,
		      (int) Math.min(SKIP_BUFFER_SIZE, remaining));
	    if (nr < 0) {
		break;
	    }
	    remaining -= nr;
	}
	
	return n - remaining;
    }


可以优化为:
public long skip(long n) throws IOException {
		if (n <= 0) {
		    return 0;
		}
		
		int i=0;
		while ( read() != -1 && i < n) {
		    i++;
		}
		
		return i;
	}



这样即节省了skipBuffer 2048个空间,代码也更简单;
继续看了一下子类的代码,都覆盖了这个方法。但优化后的方法总比优化前强!
分享到:
评论
3 楼 samy_3 2008-02-29  
引用
jsyx 19 小时前
人家原来是一块一块的读
你给改成了一个字节一个字节的读
。。。。。。。。。


nr = read(localSkipBuffer, 0,  (int) Math.min(SKIP_BUFFER_SIZE, remaining));  
这个方法的内部实现也是一个一个读的,这里它里面的代码:

public int read(byte b[], int off, int len) throws IOException {
	if (b == null) {
	    throw new NullPointerException();
	} else if ((off < 0) || (off > b.length) || (len < 0) ||
		   ((off + len) > b.length) || ((off + len) < 0)) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0) {
	    return 0;
	}

	int c = read();
	if (c == -1) {
	    return -1;
	}
	b[off] = (byte)c;

	int i = 1;
	try {
	    for (; i < len ; i++) {
		c = read();
		if (c == -1) {
		    break;
		}
		if (b != null) {
		    b[off + i] = (byte)c;
		}
	    }
	} catch (IOException ee) {
	}
	return i;
    }


如果从硬盘读数据是一块一块读的,如果内存中读数据的话,比如数组的copy,肯定先申请一段空间,然后是一个一个读的和写。
2 楼 jsyx 2008-02-28  
人家原来是一块一块的读
你给改成了一个字节一个字节的读
。。。。。。。。。
1 楼 抛出异常的爱 2008-02-28  

瀑布汗.....

相关推荐

    java.io.Reader 和 java.io.InputStream 的区别

    ### Java.io.Reader与Java.io.InputStream的关键差异解析 在深入探讨`java.io.Reader`与`java.io.InputStream`的具体差异之前,我们首先需要理解这两者在Java I/O操作中的基础角色。`java.io.Reader`和`java.io....

    Java.nio 与Java.io比较

    在探讨Java.nio与Java.io之间的比较时,我们首先需要理解这两个包在Java编程语言中的核心作用和它们各自的优势。Java.io和Java.nio是Java中处理输入/输出操作的两个主要框架,它们各自拥有独特的特性和应用场景。 #...

    java.io的基础应用

    在Java中,IO操作主要分为字节流和字符流两大类,分别由`java.io.InputStream`和`java.io.OutputStream`以及`java.io.Reader`和`java.io.Writer`作为基类。字节流处理的是8位的字节,而字符流处理的是16位的Unicode...

    android 串口驱动

    import java.io.InputStream; import java.io.OutputStream; import android.util.Log; public class SerialPort { private static final String TAG = "SerialPort"; /* * Do not remove or rename the ...

    java.io包详细解说

    在Java IO中,Decorator模式主要体现在各种InputStream、OutputStream、Reader和Writer类的使用上。例如,当我们需要对一个InputStream进行缓冲操作时,可以使用BufferedInputStream,它包装了一个原始的InputStream...

    rxtx-2.1.7.jar串口通信gnu.io包不存在问题

    在Java编程环境中,进行串口通信时,常常会遇到一个问题:缺少`gnu.io`包,导致无法正常编译或运行程序。这个问题主要出现在使用RXTX库进行串口操作的项目中。RXTX是一个开源的Java库,它提供了与硬件进行串行通信的...

    xml2jsonjar包

    import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; ...

    java项目超市

    import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; ...

    JBuider第八章:Java.io包.rar

    Java.io包是Java编程语言中的核心包之一,它包含了用于输入/输出操作的类和接口。这个包在Java中扮演着至关重要的角色,因为它提供了处理数据流、字符流、对象序列化、文件读写以及与操作系统交互的各种工具。在本...

    java.io的吐血实用例子

    在Java编程语言中,`java.io`包是用于输入/输出(I/O)操作的基础部分,包含了许多类和接口,使得开发者能够处理数据流、字符流、对象序列化、磁盘文件以及网络连接等任务。本篇文章将深入探讨`java.io`包中的关键概念...

    ScalaJavaIoExtras:一些额外的集成使Scala中使用java.io更加容易

    java.io.InputStream集成 用法: import com . github . joshlemer . java_io_extras . _ import java . io . InputStream // get an InputStream from somewhere val inputStream : InputStream = ??? // convert ...

    使用JAVA.IO流线程的JAVA课设项目万年历记事本

    - Java.IO流库提供了处理输入和输出数据的类,允许程序读取和写入数据到各种源和目的地,如文件、网络连接、内存缓冲区等。 - **输入流**(InputStream)用于读取数据,而**输出流**(OutputStream)用于写入数据...

    org.apache.commons.io.FileUtils

    Apache Commons IO库中的`org.apache.commons.io.FileUtils`类是一个非常实用的工具类,它提供了大量方便、高效的方法,用于处理文件系统操作。这个类在Java开发中被广泛使用,尤其是在处理大量的文件读写和管理任务...

    javaimport、package作用与用法.doc

    java.io.InputStream 则是复姓 java.io,名字为 InputStream 的类别。Java 使用 package 这种机制的原因很简单,就是为了避免类别名称的冲突,全世界的 Java 类别数量非常多,如果类别不使用套件名称,那在用到相同...

    java常用的工具类整理28个

    19. **java.io.InputStream**和**java.io.OutputStream**:所有字节流的基类,提供了基本的读写操作。 20. **java.io.Reader**和**java.io.Writer**:所有字符流的基类,用于处理字符数据。 21. **java.io....

    计算机网络实验报告 获取MAC socket通信

    java.io.InputStream is = new java.io.DataInputStream( sk.getInputStream()); // 接受网络输入流 写入文件 int len = 0; byte[] buff = new byte[1024]; while((len=is.read(buff))!=-1){ fos....

    Java IO commons-io-2.5.jar

    相较于Java标准库中的`java.io.File`类提供的`copy()`方法,`commons-io`的`FileUtils.copyFile()`更简单易用,且异常处理更简洁。 总的来说,`commons-io-2.5.jar` 是Java开发者的强大工具,它极大地扩展了Java IO...

    java jdk io包类详解

    ### Java JDK IO包类详解 #### 概述 Java平台提供的`io`包为开发者提供了访问文件系统、对象序列化等功能...总之,`java.io`包是Java编程语言的重要组成部分,对于任何想要深入理解Java平台的开发者来说都至关重要。

    最最常用的 100 个 Java类分享

    7. `java.io.InputStream`:InputStream是所有字节输入流的基类,用于读取字节数据。 8. `java.util.Set`:Set接口表示不允许重复元素的集合。 9. `java.util.Arrays`:Arrays类提供了静态方法来操作数组,如排序...

Global site tag (gtag.js) - Google Analytics