`
=死神=
  • 浏览: 57979 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 位流处理3

    博客分类:
  • Java
阅读更多

SequenceInputStream

      若要将一个文件分割为数个文件,再将之组合还原 为一个文件,最基本的作法是使用数个FileInputStream来打开分割后的文件,然后一个一个文件的读取,并使用同一个 FileOutputStream实例写到同一个文件中。必须要自行判断每一个分割文件的读取是否完毕,如果完毕就读取下一个文件

 

     如果使 用java.io.SequenceInputStream就不用这么麻烦,SequenceInputStream可以看作是数个 InputStream对象的组合。当一个InputStream对象的内容读取完毕后,它就会取出下一个InputStream对象,直到所有的 InputStream对象都读取完毕为止

 

    SequenceInputStream的使用示范。可以将指定的文件进行分割,也可以将分割后的文件还原为一个文件

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;

public class SequenceInputStreamDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			switch (args[0].charAt(1)) {
			case 's':
				// args[1]:每个分割文件的大小
				int size = Integer.parseInt(args[1]);
				// args[2]:指定要被分割的文件名称
				seperate(args[2], size);
				break;
			case 'c':
				//args[1]:指定要被组合的文件个数
				int number = Integer.parseInt(args[1]);
				//args[2]:组合后的文件名称
				concatenate(args[2],number);
				break;
			}
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("Using: java UseSequenceStream [-s/-c]"+" (size/number) filename");
			System.out.println("-s: 分割文件\n-c: 组合文件");
		}catch(IOException e)
		{
			e.printStackTrace();
		}
	}

	// 分割文件
	public static void seperate(String filename, int size) throws IOException {

		FileInputStream fileInputStream = new FileInputStream(
				new File(filename));
		byte[] data = new byte[1];
		int count = 0;
		// 还原文件大小及指定分割的大小
		// 决定要分割为几个文件
		if (fileInputStream.available() % size == 0)
			count = fileInputStream.available() / size;
		else
			count = fileInputStream.available() / size + 1;

		for (int i = 0; i < count; i++) {
			int num = 0;
			// 分割的文件加上下划线与编号
			File file = new File(filename + "_" + i);
			BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
					new FileOutputStream(file));

			while (fileInputStream.read(data) != -1) {
				bufferedOutputStream.write(data);

				num++;

				if (num == size) {
					bufferedOutputStream.flush();
					bufferedOutputStream.close();
					break;
				}
			}

			if (num < size) {
				bufferedOutputStream.flush();
				bufferedOutputStream.close();
			}
		}
		System.out.println("分割为" + count + "个文件");
	}

	// 连接文件
	public static void concatenate(String filename, int number)
			throws IOException {
		// 收集文件用的list
		List<InputStream> list = new ArrayList<InputStream>();
		for (int i = 0; i < number; i++) {
			File file = new File(filename + "_" + i);
			list.add(i, new FileInputStream(file));
		}

		final Iterator<InputStream> iterator = list.iterator();

		// SequenceInputStream需要一个Enumeration对象来构建
		Enumeration<InputStream> enumeration = new Enumeration<InputStream>() {
			public boolean hasMoreElements() {
				return iterator.hasNext();
			}

			public InputStream nextElement() {
				return iterator.next();
			}
		};

		// 建立SequenceInputStream
		// 并使用BufferedInputStream
		BufferedInputStream bufInputStream = new BufferedInputStream(
				new SequenceInputStream(enumeration), 8192);

		BufferedOutputStream bufOutputStream = new BufferedOutputStream(
				new FileOutputStream(filename), 8192);
		byte[] data = new byte[1];
		// 读取所有文件数据并写入目的文件
		while (bufInputStream.read(data) != -1) {
			bufOutputStream.write(data);
		}
		bufInputStream.close();
		bufOutputStream.flush();
		bufOutputStream.close();

		System.out.println("组合" + number + "文件OK");
	}
}

 

 分割文件时必须指定-s和分割后的每个文件大小。执行的一个例子如下

java onlyfun.caterpillar.SequenceStreamDemo -s 1048576 test.zip

分割为6个文件

 

分割后的文件名是原文件名加上下划线与编号,例如test.zip_1、test.zip_2等。合并文件时必须要指定-c、合并的文件数与来源文件名称,例如将之前分割过后的文件合并为一个文件:

java onlyfun.caterpillar.SequenceStreamDemo -c 6 test.zip

组合6个文件 OK!!

 

PrintStream

     之前所 介绍过的OutputStream对象,都是直接将内存中的数据原封不变地写至目的地(例如一个文件)。举个例子来说,如果将int类型1使用之前介绍的 OutputStream对象输出至文件,则文件中所存储的是int类型1在内存中的值

import java.io.File;
import java.io.FileOutputStream;

public class StreamTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try
		{
		FileOutputStream file = new FileOutputStream(new File("d:\\test.txt"));
		file.write(1);
		file.close();
		}catch(Exception e)
		{
			e.printStackTrace();
		}
	}

}

 

     执行范例后会产生一个 test.txt文件,打开文件之后,不会看到显示1,而可能看到一个怪异的符号。由于使用write()方法,这会将1在内存中的值的低字节 0000001写入文件中,而纯文件文件在显示文件内容时,会以操作系统的默认编码显示对应的字符。如果使用文字编辑软件(像vi或UltraEdit) 观看test.txt的十六进制表示,其结果会显示 01(十六进制表示),

 

     有时所 想要存储的结果是数据转换为字符之后的结果,例如程序的执行结果是3.14159,您会希望使用3.14159等字符来存储,也就是俗称的存储为纯文本文 件。这样当使用简单的纯文字编辑器观看时,就可以直接看到以3.14159等字符显示的画面。在范例14.12中,若想使用纯文本文件看到 test.txt的显示结果是1,则必须先将内存中的整数1,也就是二进制00000000 00000000 00000000 00000001转换为对应的1字符编码,也就是0x31(十进制表示为49)并加以存储。

 

      使用java.io.PrintStream可以自动进行字符转换的动作,默认会使用操作系统的编码来处理对应的字符转换动作

 

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class PrintStreamDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			PrintStream printStream = new PrintStream(new FileOutputStream(
					new File("D:\\abc.txt")));
			printStream.print(1);
			printStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

      执行程序之后使用纯文字编辑器打开test.txt,其内容会是显示字符1了。print()或println()接受int、char、String、double等数据类型,println()会在输出之后加上换行字符,而print()则不会

 

ByteArrayInputStream和ByteArrayOutputStream

      流的来源或目的地不一定是文件,也可以是内存中的一个空间,例如一个位数组。java.io.ByteArrayInputStream、java.io.ByteArrayOutputStream即是将位数组当作流输入来源、输出目的地的类

 

      ByteArrayInputStream可以 将一个数组当作流输入的来源,而ByteArrayOutputStream则可以将一个位数组当作流输出的目的地。在这里举一个简单的文件位编辑程序作 为例子,您可以打开一个简单的文本文件,其中有简单的A、B、C、D、E、F、G等字符,在读取文件之后,可以直接以程序来指定文件中位的位置来修改所指 定的字符。作法是将文件读入数组中,指定数组索引修改元素,然后重新将数组存回文件

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class ByteArrayStreamDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			File file = new File(args[0]);
			BufferedInputStream bufferedInputStream = new BufferedInputStream(
					new FileInputStream(file));
			ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
			byte[] bytes = new byte[1];
			// 将文件内容写入位数组流

			while (bufferedInputStream.read(bytes) != -1) {
				arrayOutputStream.write(bytes);
			}

			arrayOutputStream.close();
			bufferedInputStream.close();

			// 以字符方式显示数组内容

			bytes = arrayOutputStream.toByteArray();
			for (int i = 0; i < bytes.length; i++) {
				System.out.println((char) bytes[i]);
			}

			System.out.println();

			// 让用户输入位置与字符修改数组内容
			Scanner scanner = new Scanner(System.in);

			System.out.println("输入修改位置:");
			int pos = scanner.nextInt();

			System.out.println("输入修改字符:");
			// 修改数组中的对应字符
			bytes[pos - 1] = (byte) scanner.next().charAt(0);

			// 将位数组内容存回文件
			ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
					bytes);
			BufferedOutputStream bufOutputStream = new BufferedOutputStream(
					new FileOutputStream(file));

			byte[] tmp = new byte[1];

			while (byteArrayInputStream.read(tmp) != -1)
				bufOutputStream.write(tmp);

			byteArrayInputStream.close();
			bufOutputStream.flush();
			bufOutputStream.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

 执行结果:

 java onlyfun.caterpillar.ByteArrayStreamDemo test.txt

 ABCDEFG

 输入修改位置:3

 输入修改字符:X

 

 源文件地址:http://hi.baidu.com/mdbing/blog/item/3c737a59356d922f2834f0fb.html

分享到:
评论

相关推荐

    基于Java的视频流处理(原创)

    在本项目中,"基于Java的视频流处理(原创)"是一个使用Java技术进行实时视频流处理的应用。这个项目的核心是实现一个基本的哈哈镜效果,并结合了第三方库来完成人脸检测以及对人脸的图像遮挡功能。在创新实践项目课...

    java零基础自学 之 JavaIO流处理

    字节流处理8位的字节,适用于二进制文件,如图片、音频等。 2. **IO类的分类** Java的IO类主要分为两大类:字符流(Reader和Writer)和字节流(InputStream和OutputStream)。Reader和Writer是字符流的基类,...

    Java字符流与字节流区别

    Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理...

    Java的异常处理和IO流

    Java的异常处理与IO流是Java编程中两个重要的概念,它们在软件开发中扮演着至关重要的角色。本文将深入探讨这两个主题,以便更好地理解和应用它们。 ### 一、Java异常处理 #### 1.1 什么是异常 异常是指在程序...

    java实现流媒体播放

    最后,Java流媒体播放程序应具备良好的错误处理机制,如网络中断后的恢复、媒体文件格式不支持时的提示等。同时,考虑到不同的操作系统和硬件环境,程序还需要考虑跨平台的兼容性。 总的来说,Java 实现流媒体播放...

    基于red5 dsj 的java 处理视频流和一些疑问

    标题 "基于red5 dsj 的java 处理视频流和一些疑问" 提示我们讨论的是一个使用Red5和DSJ(可能是指“Digital Signal Jockey”或某种特定工具)进行Java视频流处理的项目。Red5是一个开源的流媒体服务器,能够处理音频...

    java数据流总结

    java数据流总结,java io流总结,节点流和处理流 java数据流总结,java io流总结,节点流和处理流 java数据流总结,java io流总结,节点流和处理流

    java_io流的处理

    ### Java IO流处理详解 #### I/O流概述 在Java编程中,输入/输出(I/O)处理是一项核心技能,涉及从键盘读取数据、向屏幕输出数据、从文件读写数据以及在网络连接上进行读写操作。Java将这些不同的输入输出源抽象...

    Java中文件IO流.pdf

    Java 中文件 IO 流 Java 中文件 IO 流是指 Java 语言中对文件的输入输出操作,通过定义文件流来实现文件的读写...在 Java 中,文件 IO 流操作是非常重要的,掌握文件 IO 流操作可以帮助我们更好地处理文件相关的任务。

    java 视频流读写

    Java 视频流读写是Java编程中涉及多媒体处理的一部分,主要目的是为了在应用程序中处理、播放或存储视频数据。Java Media Framework (JMF) 是Java平台上的一个关键组件,用于处理音频、视频和流媒体内容。在这个"JMF...

    Java字符流和字节流

    字节流处理的是8位的字节数据,而字符流处理的是16位的Unicode字符。这两种流都有各自的特点和应用场景。 #### 二、字节流 字节流是最基本的数据传输方式,适用于任何类型的数据传输。在Java中,所有字节流类都是`...

    IO流 javaio java 流

    字符流处理单个字符,而字节流处理8位的字节序列。它们又可以进一步细分为输入流(InputStream/Reader)和输出流(OutputStream/Writer),分别用于数据的读取和写入。 1. 字节流: - 字节输入流(InputStream):...

    Java流(文件读写操作)

    ### Java流(文件读写操作) #### 一、流的分类 Java中处理文件和数据时,使用流的概念来进行操作。根据不同的标准,流可以分为几种类型。 ##### 1. 按数据流动方向 - **输入流**:主要用于从数据源读取数据。输入...

    JAVA IO流技术

    4. Java流的细分: - 流的方向:输入流用于从数据源读取数据,输出流用于向目标写入数据。 - 处理数据单元:字节流按字节进行读取(InputStream、OutputStream),字符流按字符进行读取(Reader、Writer)。 - ...

    java输入输出流与文件处理

    字节流适用于处理二进制数据,而字符流更擅长处理文本数据,两者的区别在于数据处理的基本单位,字节流处理的是8位的数据,而字符流处理的是16位的Unicode字符。 #### 总结 Java的输入输出流与文件处理机制为...

    JAVA对音频文件处理程序

    在Java编程语言中,处理音频文件是一项常见的任务,特别是在多媒体应用、游戏开发或者音视频处理系统中。本项目“JAVA对音频文件处理程序”聚焦于读取音频文件,执行降分贝操作,然后将处理后的音频保存为新的文件。...

    java_IO流的处理.ppt

    Java IO流处理是Java编程中一个非常重要的概念,它用于在不同数据源之间传输数据,如文件、网络、内存等。在Java中,IO流分为两大类:输入流(Input Stream)和输出流(Output Stream),它们分别用于数据的读取和...

    java数据流的概述

    字节流处理的是8位的字节数据,适用于所有类型的数据,包括图像、音频等二进制文件。而字符流处理的是16位的Unicode字符,更适合文本数据的处理。在Java.io包中,这两类流都提供了输入流和输出流接口,用于读取和...

    基于Java的流媒体视频直播服务器设计与实现

    本项目聚焦于“基于Java的流媒体视频直播服务器设计与实现”,这涉及到多个IT领域的知识,包括音视频处理、服务器架构、Java编程以及运维等。 首先,我们要理解流媒体的概念。流媒体是指在互联网上传输的连续多媒体...

Global site tag (gtag.js) - Google Analytics