`

J2SE基础-IO-字节流(位流)-多目标源输出流自定义扩展

阅读更多
J2SE基础-IO-字节流(位流)-多目标源输出流自定义扩展

前一章节(J2SE基础-IO-字节流(位流))对字节流(位流)进行了说明,对于输入字节流InputStream/输出字节流OutputStream,我们可以根据业务的实际情况进行自定义的实现。

以下制作了一个多目标源输出流的扩展,作为前一章节的补充。

package com.core.common.file.stream;

import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import com.core.common.log.Log;

/**
 * 文件名称: MultiOutputStream.java
 * 类名: MultiOutputStream
 * 日期: 2012-12-22
 *
 * 功能描述:多目的源输出流,该对象同时将一个输入流写入多个输出流
 */
public class MultiOutputStream extends OutputStream {

	/** 多目的源输出流的保存对象*/
	private List<OutputStream> outputStreamList = null;

	/**
	 * 构造方法
	 * 功能描述:初始化多目的源输出流
	 *
	 * @param outputStreamList
	 * @throws IOException
	 */
	public MultiOutputStream(final List<OutputStream> outputStreamList) throws IOException {
		if(outputStreamList == null || outputStreamList.isEmpty()) {
			final String msg = "多源输出流对象为null,不能进行初始化操作,请检查!";
			Log.logDebug(msg);
			throw new IOException(msg);
		}
		int outputStreamListSize = outputStreamList.size();
		for (int i = outputStreamListSize - 1; 0 < i; i--) {
			OutputStream outputStream = outputStreamList.get(i);
			if(outputStream == null) {
				outputStreamList.remove(i);
				Log.logDebug("多源输出流对象中发现第[{}]个是null,该输出源已从输出列表中删除,请检查!", i);
			}
		}
		this.outputStreamList = outputStreamList;
	}

	/**
	 * 重写write方法
	 * 重载方法(non-Javadoc)
	 * @see java.io.OutputStream#write(int)
	 */
	@Override
	public void write(final int b) throws IOException {
		if(this.outputStreamList != null) {
			for (OutputStream outputStream : this.outputStreamList) {
				outputStream.write(b);
			}
		}
	}

	/**
	 * 重写write方法
	 * 重载方法(non-Javadoc)
	 * @see java.io.OutputStream#write(byte[], int, int)
	 */
	@Override
	public void write(final byte[] data, final int offset, final int length) throws IOException {
		if(this.outputStreamList != null) {
			for (OutputStream outputStream : this.outputStreamList) {
				outputStream.write(data, offset, length);
			}
		}
	}

	/**
	 * 重写flush方法
	 * 重载方法(non-Javadoc)
	 * @see java.io.OutputStream#flush()
	 */
	@Override
	public void flush() throws IOException {
		if(this.outputStreamList != null) {
			for (OutputStream outputStream : this.outputStreamList) {
				outputStream.flush();
			}
		}
	}

	/**
	 * 重写close方法
	 * 重载方法(non-Javadoc)
	 * @see java.io.OutputStream#close()
	 */
	@Override
	public void close() throws IOException {
		if(this.outputStreamList != null) {
			for (OutputStream outputStream : this.outputStreamList) {
				outputStream.close();
			}
		}
	}
}


以上扩展出MultiOutputStream对象,该对象继承于OutputStream,重写了其中的write/flush/close方法,主要思想是传入一个多源输出流,按照多目标源逐一进行write/flush/close,以下是使用本对象的例子:


	/**
	 * 方法名称: copyToMultiOutput
	 * 功能描述: 将输入流拷贝至多输出源
	 *
	 * @version 1.0
	 *
	 * @param inputStream InputStream 输入流
	 * @param outputStream OutputStream 多目的源输出流
	 * @throws IOException
	 *
	 * @update [日期YYYY-MM-DD] [更改人姓名] [变更描述]
	 */
	public void copyToMultiOutput(final InputStream inputStream,
		final List<OutputStream> outputStreamList) throws IOException {

		MultiOutputStream multiOut = new MultiOutputStream(outputStreamList);
		copy(inputStream, multiOut);
	}

	/**
	 * 方法名称: copy
	 * 功能描述: 该方法实现输出源输出
	 *
	 * @version 1.0
	 *
	 * @param inputStream InputStream 输入流
	 * @param outputStream OutputStream 多目的源输出流
	 * @throws IOException
	 *
	 * @update [日期YYYY-MM-DD] [更改人姓名] [变更描述]
	 */
	private static void copy(final InputStream inputStream, final OutputStream outputStream) throws IOException {
		if(inputStream == null) {
			throw new IOException("没有输入流,拷贝操作停止!");
		}
		if(outputStream == null) {
			throw new IOException("没有输出源,拷贝操作停止!");
		}
		// 缓冲流
		BufferedInputStream bin = new BufferedInputStream(inputStream);
		BufferedOutputStream bout = new BufferedOutputStream(outputStream);
		while (true) {
			int datum = bin.read();
			if(datum == -1) {
				break;
			}
			bout.write(datum);
		}
		// 刷新缓冲区
		bout.flush();
		bout.close();
		return;
	}


以上是一个扩展OutputStream的例子,如有不正之处,欢迎指正,谢谢!
  • 大小: 44.6 KB
  • 大小: 35.3 KB
0
0
分享到:
评论
2 楼 stef831018 2013-01-06  
zj304292653 写道
        for (int i = 0; i < outputStreamListSize; i++) {  
            OutputStream outputStream = outputStreamList.get(i);  
            if(outputStream == null) {  
                outputStreamList.remove(i); //这里直接remove的话会导致忽略一个检查,甚至是导致IndexOutOfBounds异常
                Log.logDebug("多源输出流对象中发现第[{}]个是null,该输出源已从输出列表中删除,请检查!", i);  
            }  
        }  


您好,感谢您的指正,是我写错了,已经修改完毕:
        for (int i = outputStreamListSize - 1; 0 < i; i--) { 
            OutputStream outputStream = outputStreamList.get(i); 
            if(outputStream == null) { 
                outputStreamList.remove(i); 
                Log.logDebug("多源输出流对象中发现第[{}]个是null,该输出源已从输出列表中删除,请检查!", i); 
            } 

再次感谢!
1 楼 zj304292653 2012-12-27  
        for (int i = 0; i < outputStreamListSize; i++) {  
            OutputStream outputStream = outputStreamList.get(i);  
            if(outputStream == null) {  
                outputStreamList.remove(i); //这里直接remove的话会导致忽略一个检查,甚至是导致IndexOutOfBounds异常
                Log.logDebug("多源输出流对象中发现第[{}]个是null,该输出源已从输出列表中删除,请检查!", i);  
            }  
        }  

相关推荐

    J2SE-IO.ppt

    Java中的IO流是Java平台标准版(J2SE)的核心特性之一,用于处理输入和输出操作。在Java中,流是一组数据的有序传输,可以是字节或字符。流的分类、节点流与处理流的概念,以及各种流类的使用方法是理解Java IO系统...

    J2SE6.0-API(中文)-冷冻大雪.chm和java api1.6中文文档.chm

    例如,学习集合框架有助于理解数据结构和算法,多线程和并发处理可以提升程序的性能,而I/O流和网络编程则是实现系统间通信的基础。此外,反射机制允许动态访问和修改对象,异常处理则保证了程序的健壮性,JDBC用于...

    J2SE基础知识大全

    J2SE基础知识是每一个Java开发者必须掌握的核心技能。以下将详细阐述J2SE中的关键概念和技术。 1. **Java语言基础** - **语法**:包括变量声明、数据类型(基本类型和引用类型)、运算符、流程控制(如if语句、for...

    J2SE基础源代码

    5. **I/O流**:Java的I/O流模型非常强大,涵盖了字符流和字节流,以及输入流、输出流、缓冲流和转换流等。源代码会展示如何进行文件读写、网络通信等操作。 6. **集合框架**:`java.util`包中的ArrayList、...

    j2se总结-一个学习java的总结笔记j2se部分

    ### J2SE总结知识点 #### 一、Java基础语法与数据类型 1. **源文件与公共类**:在Java中,如果一个类被声明为`public`,那么该类所在的源文件必须与该类名相同,并且一个源文件中只能有一个`public`类。 - 示例:...

    J2SE 5.0- Java安全及网络计算的最新技术

    J2SE 5.0的安全特性建立在一个稳固的基础之上,包括强类型语言特性、字节码验证、运行时类型安全检查以及动态类加载器。这些特性共同确保了平台的基础安全,防止了常见的编程错误可能导致的安全漏洞。动态且可扩展的...

    JAVA基础知识点,J2SE部分内容

    一个字符可以是1个字节,也可以是2个或多个字节 一个字节就是8个位,也就是对同一数据源的操作用字符流可能效率更高 3-6.字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以...

    Java-J2se、J2ee开发全程视频教程和源码(87集)

    资源名称:Java-J2se、J2ee开发全程视频教程和源码(87集)资源目录:【】Java-J2se-J2ee全程教程(01-10)【】Java-J2se-J2ee全程教程(11-20)【】Java-J2se-J2ee全程教程(21-30)【】Java-J2se-J2ee全程教程(31...

    java J2SE api -index.html

    J2SE 的API ,分享一下,希望各位兄弟喜欢

    j2se-doc-cn java的API文档,有助于你写JAVA程序

    `java.io`包则包含输入/输出流相关的类,如`FileInputStream`、`FileOutputStream`、`BufferedReader`和`PrintWriter`,这些类支持文件操作和数据传输。而`java.nio`包提供了一种更高效、更面向缓冲区的I/O模型。 ...

    J2SE6.0 API 中文版(冷冬大雪)

    Java Standard Edition (J2SE) 6.0 API 是Java编程语言的核心库,它包含了大量预定义的类和接口,供开发者使用以构建各种应用程序。这个API文档的中文版是针对初学者和经验丰富的程序员的一个极其有用的资源,因为它...

    J2SE基础,内容是JAVA

    这个平台包含了Java语言的基础类库,如集合、多线程、网络编程、I/O操作等核心功能。在J2SE中,开发者可以编写控制台应用和GUI应用,例如通过Swing或SWT库创建图形用户界面。 标题中提到的"J2SE基础",意味着这份...

    (java)J2SE_核心技术基础

    学习IO流需要理解字节流和字符流的区别,以及缓冲区、过滤流的概念。 六、多线程 Java内置了对多线程的支持,通过Thread类或Runnable接口可以创建并运行线程。理解线程的同步和互斥机制,如synchronized关键字和...

    jaxmpp-j2se-3.0.0.jar(XMPP/Tigase开发,java代码类型客户端使用的jar包)

    jaxmpp-j2se-3.0.0.jar(XMPP/Tigase开发,java代码类型客户端使用的jar包) 需要的朋友自己下载,一个朋友让我帮他找的,就顺便发出来给更多需要的朋友吧

    core-2.3.0 + QRCode + zxing-1.6-core + zxing-j2se-1.7

    总结来说,"core-2.3.0 + QRCode + zxing-1.6-core + zxing-j2se-1.7"这个组合提供了Java开发中处理二维码所需的基础工具,涵盖了从核心库到具体二维码处理库的各个方面。开发者可以根据项目需求,利用这些库来实现...

    j2se基础课程资源

    本资源包是一套全面的J2SE(Java Standard Edition)基础教程,适合初学者深入学习Java编程。它包含了从基本语法到高级特性的多个主题,帮助初学者逐步掌握Java编程的核心知识。 1. **第二章 Java语法基础**:这...

    j2se 小程序源代码

    分为字节流和字符流,以及输入流和输出流,还有缓冲流、转换流和对象流等。 8. **多线程**:Java内置了对多线程的支持,可以使用`Thread`类或实现`Runnable`接口创建线程。线程同步和互斥是多线程编程中的关键概念...

    Java J2SE基础篇各章习题汇总

    Java J2SE基础篇各章习题汇总

    core-3.3.3 + javase-3.3.3+ zxing-1.7-core + zxing-j2se-1.7

    本文将深入探讨在给定的压缩包中涉及的几个关键组件:`core-3.3.3`, `javase-3.3.3`, `zxing-1.7-core` 和 `zxing-j2se-1.7`,以及与之相关的JDK版本,包括JDK1.7和JDK1.8。这些组件主要用于二维码生成和处理,对于...

Global site tag (gtag.js) - Google Analytics