`
twypx
  • 浏览: 14818 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java I/O 深入学习( 二)之数组类输入输出流

    博客分类:
  • J2EE
阅读更多

1. ByteArrayOutputStream

在实例化的时候会创建一个byte 类型的数组缓冲区,默认 32 个字节,可以无限增长。可以将内存中的对象读到该数组中。其中 write() 方法负责往数组中写数据。

实例化时的代码:

/**
     * Creates a new byte array output stream. The buffer capacity is 
     * initially 32 bytes, though its size increases if necessary. 
     */
    public ByteArrayOutputStream() {
	this(32);
    }

    /**
     * Creates a new byte array output stream, with a buffer capacity of 
     * the specified size, in bytes. 
     *
     * @param   size   the initial size.
     * @exception  IllegalArgumentException if size is negative.
     */
    public ByteArrayOutputStream(int size) {
        if (size < 0) {
            throw new IllegalArgumentException("Negative initial size: "
                                               + size);
        }
	buf = new byte[size];
    }

 写入数据时的代码:

/**
     * Writes the specified byte to this byte array output stream. 
     *
     * @param   b   the byte to be written.
     */
    public synchronized void write(int b) {
	int newcount = count + 1;
	if (newcount > buf.length) {
            buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
	}
	buf[count] = (byte)b;
	count = newcount;
    }

    /**
     * Writes <code>len</code> bytes from the specified byte array 
     * starting at offset <code>off</code> to this byte array output stream.
     *
     * @param   b     the data.
     * @param   off   the start offset in the data.
     * @param   len   the number of bytes to write.
     */
    public synchronized void write(byte b[], int off, int len) {
	if ((off < 0) || (off > b.length) || (len < 0) ||
            ((off + len) > b.length) || ((off + len) < 0)) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0) {
	    return;
	}
        int newcount = count + len;
        if (newcount > buf.length) {
            buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
        }
        System.arraycopy(b, off, buf, count, len);
        count = newcount;
    }

2.ByteArrayInputStream

负责把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作,因此在实例化时需要传入一个byte类型的数据。

实例化代码:

/**
     * Creates a <code>ByteArrayInputStream</code>
     * so that it  uses <code>buf</code> as its
     * buffer array. 
     * The buffer array is not copied. 
     * The initial value of <code>pos</code>
     * is <code>0</code> and the initial value
     * of  <code>count</code> is the length of
     * <code>buf</code>.
     *
     * @param   buf   the input buffer.
     */
    public ByteArrayInputStream(byte buf[]) {
	this.buf = buf;
        this.pos = 0;
	this.count = buf.length;
    }

    /**
     * Creates <code>ByteArrayInputStream</code>
     * that uses <code>buf</code> as its
     * buffer array. The initial value of <code>pos</code>
     * is <code>offset</code> and the initial value
     * of <code>count</code> is the minimum of <code>offset+length</code>
     * and <code>buf.length</code>.
     * The buffer array is not copied. The buffer's mark is
     * set to the specified offset.
     *
     * @param   buf      the input buffer.
     * @param   offset   the offset in the buffer of the first byte to read.
     * @param   length   the maximum number of bytes to read from the buffer.
     */
    public ByteArrayInputStream(byte buf[], int offset, int length) {
	this.buf = buf;
        this.pos = offset;
	this.count = Math.min(offset + length, buf.length);
        this.mark = offset;
    }

 一般情况下我们可以ByteArrayOutputStream和ByteArrayInputStream与ObjectInputStream/ObjectOutputStream或者DataInputStream/DataOutputStream结合使用,在读取对象或者数据类型数据时可以使用,例如以前在设计模式中讲过的原型模式中就有例子。

 

public User deepClone(){
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(this);
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bais);
			return (User)ois.readObject();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
分享到:
评论

相关推荐

    JavaI/O深入学习之输入和输出

    Java I/O 深入学习之输入和输出主要介绍了 Java I/O 深入学习之输入和输出,Java 类库中的 I/O 类分成输入和输出两部分,可以在 JDK 文档里的类层次结构中查看到。需要的朋友可以参考下前言编程语言的 I/O 类库中常...

    Java课程设计报告书-学生版-1_I/O流与文件课程设计_

    本课程设计报告书——“Java课程设计报告书-学生版-1_I/O流与文件课程设计_”旨在帮助学生深入理解并掌握如何在Java中进行文件操作,通过实际的实验案例来学习文件对象和流类的应用。 一、Java I/O流概述 Java的I/O...

    java_I/O流的教程

    Java I/O流是Java编程语言中的一个重要组成部分,用于在程序和外部资源(如磁盘、网络、内存等)之间传输数据。本教程涵盖了从基础到高级的Java流知识...通过深入学习和实践,你将能够熟练地处理各种数据输入输出场景。

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

    `Source` 和 `Sink` 分别代表了数据的读取和写入接口,它们抽象了不同类型的输入输出流,使得在不同类型的 I/O 源和接收端之间进行转换变得更加简单。 Okio 还引入了 `ByteString` 类,这是一个不可变的字节数组,...

    JAVA范例 七)输入/输出流---字符流

    在Java编程语言中,输入/输出流(Input/Output Stream,简称I/O流)是处理数据传输的基础。本文将深入探讨字符流的概念,包括它的作用、类型以及如何在实际编程中应用。首先,我们理解一下标题中的“字符流”:在...

    Java考试前总结(包含io输入输出流/线程/特殊for语句/文件读写的总结)

    总结来说,理解和掌握Java的I/O流可以帮助你有效地处理数据输入输出,线程管理则让你能够编写并发程序,特殊for语句简化了代码,而文件读写则是日常开发的基本技能。这些知识点的掌握程度直接影响到你在Java考试中的...

    第8章JavaIO第8章JavaIO第8章JavaIO第8章JavaIO第8章JavaIO第8章JavaIO

    Java I/O 系统是Java程序进行输入输出操作的核心部分,它允许程序与外部世界交换数据。本章主要围绕Java I/O展开,包括了输入/输出流、标准IO、正则表达式与IO、新IO、压缩以及对象序列化等多个重要主题。 8.1 Java...

    Java程序使用字符界面与系统输入/输出界面进行数据通信

    Java程序设计中,与系统输入/输出界面进行数据通信是通过输入输出流(I/O流)实现的。I/O流是Java的核心特性之一,允许程序读取数据源(如键盘、文件)并写入数据目标(如显示器、文件)。在Java 2中,这个过程尤其...

    java编程入门第八章输入与输出

    Java I/O主要包括字节流和字符流两大类,每类又分为输入流和输出流,进一步又可以分为节点流和处理流。节点流是直接作用于数据源或目标的,如FileInputStream和FileOutputStream;而处理流则建立在已存在的流之上,...

    java输入输出--java实例17例

    4. **文件输入输出流**:FileInputStream和FileOutputStream是最基本的文件读写流,用于读取和写入文件。示例可能会演示如何使用这两个类来实现简单的文件读写操作。 5. **字符流与转换流**:Reader和Writer用于...

    Java程序设计精编教程输入流与输出流学习教案.pptx

    Java程序设计中的输入流与输出流是Java I/O系统的核心组成部分,它们负责在程序与外部资源之间传输数据。本教程将深入讲解这些概念,并通过具体的类和方法来阐述其使用方式。 首先,输入流(InputStream)和输出流...

    java io 2nd

    在这一版中,作者深入探讨了Java的输入输出机制,包括流式I/O、数据源、过滤流、压缩流以及JAR归档等内容。读者可以通过本书理解Java I/O体系结构,并学会如何在实际开发中应用这些知识。 ### Java I/O基础 Java I...

    初级JAVA PPT教程,适用于初级学者。忘珍惜

    Java编程语言中的输入输出流(I/O流)是程序与外部设备交互的关键机制,包括从键盘、文件、网络等来源获取数据以及向显示器、打印机、文件等目标输出数据。本教程针对初级Java学者,旨在介绍Java I/O流的基础概念和...

    java_spliter.zip_java split_java spliter_分割文件

    这个小程序对理解Java的输入/输出(I/O)操作具有很好的学习价值。 首先,让我们深入了解一下Java中的I/O流。Java的I/O系统是基于流的,流可以理解为数据的双向通道,用于读取或写入数据。Java I/O库提供了许多类来...

    Java核心技术卷I和II(第八版)

    5. **输入/输出与NIO**:讲解Java的I/O流体系,包括字节流、字符流、对象序列化,以及非阻塞I/O(New I/O,NIO)框架的使用。 6. **多线程编程**:介绍线程的创建、同步、协作,以及线程池的使用。 7. **反射与...

    初一数学输入输出PPT学习教案.pptx

    而处理控制台交互时,标准输入输出流就非常实用。 总的来说,Java的输入输出体系是一个强大的工具,允许程序员高效地处理各种数据传输任务。掌握流的概念和使用,不仅可以帮助初学者更好地理解和解决数学问题,还能...

    java入门基础 李兴华教程

    例如,`java.util`包包含集合框架、日期和时间API,而`java.io`包则提供了输入/输出流相关的类。 3. **第12章:JAVA IO** Java I/O(输入/输出)系统是处理数据传输的关键部分。它包括字符流和字节流,以及缓冲、...

    外文翻译—Java(译文+英文).doc

    在深入学习Java的I/O系统时,你需要掌握如InputStream和OutputStream基础类,它们用于处理字节流;Reader和Writer类,用于处理字符流;以及更高级的类,如FileInputStream、FileOutputStream、FileReader和...

Global site tag (gtag.js) - Google Analytics