`
k_lb
  • 浏览: 834075 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

JAVA 内存操作流

 
阅读更多

JAVA 通过 OutputStream InputStream 实现文件复制功能


package org.iodemo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class Copy {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception { //所有异常抛出
		// TODO Auto-generated method stub
		if (args.length != 2){ //参数不是两个
			System.out.println("输入的参数不正确");
			System.exit(1); //系统退出
		}
		
		if (args[0].equals(args[1])){
			System.out.println("输入的是同一个文件");
			System.exit(1); //系统退出
		}
		
		
		File file1 = new File(args[0]); //找到第一个文件的File 对象
		if (file1.exists()){
			File file2 = new File(args[1]); // 找到目标文件路径
			InputStream input = new FileInputStream(file1); //输入流
			OutputStream output = new FileOutputStream(file2); //输出流
			int temp = 0; 定义一个整数表示接收的内容
			while ((temp = input.read()) != -1 ){ //表示还有内容可以继续读
				output.write(temp); //写入数据
			}
                        System.out.println("文件复制成功");
                       input.close();
			output.close();
		}else{
			System.out.println("文件不存在");
		}
	}

}



内存操作流


在之前讲解FileInputStream 和 FileOutputStream 的时候所有的操作的目标是文件,那么如果现在假设有一些临时的信息要求通过IO操作的话,那么如果将这些临时的信息保存在文件之中则肯定很不合理,因为操作的最后还要把文件再删除掉,所以此时的IO中就提供了一个内存的操作流,通过内存操作流输入和输出的目标是内存。


使用ByteArrayOutputStream 和 ByteArrayInputStream 完成内存的操作流

在内存操作流中所有的输入和输出都是以内存为操作的源头

ByteArrayOutputStream 是用于从内存向程序输出的

ByteArrayInputStream 是用于从程序向内存写入的

ByteArrayInputStream 的构造方法: public ByteArrayInputStream(byte[] buf)

表示把内容向内存之中写入

ByteArrayOutputStream来讲,其基本的作用就是与OutputStream一样,一个个的读取数据。

范例:使用内存操作流,完成一个字符串小写小母变为大写字每的操作


package org.bytearrarydemo;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;

public class ByteArrayDemo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str ="helloworld"; //定义字符串,全部由小写字母组成
		ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes());  //内存输入流 将内容存在内存之中
		ByteArrayOutputStream output = new ByteArrayOutputStream();		//内存输出流
		int temp = 0; 
		while ((temp = input.read()) != -1){ //依次读取
			char c = (char)temp; //接收字符
			output.write(Character.toUpperCase(c)); //输出
		}
		String stra = output.toString(); //取出内存输出的内容
		System.out.println(stra);
	}

}


内存操作流现在在Java SE阶段是感觉不出有什么作用,但是在学习Java WEB 中的AJAX技术的时候,会结合XML解析和JavaScript、AJAX完成一些动态效果的使用


String newStr = output.toString(); //取出内存输出的内容

管道流


管道流就是进行两个线程间通讯的。使用PipedOutputStream 和 PipedInputStream 两个类完成。但是,这两个类使用的时候基本上都跟OutputStream 和InputStream类似,唯一区别的的是在于连接管道的操作上。


public void connect(PipedInputStream snk) throws IOException

范例:进行管道流的操作


package org.pipedinputdemo;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

class Send implements Runnable{ //发送数据的线程
	private PipedOutputStream out = null;
	
	public Send(){
		this.out = new PipedOutputStream();
	}
	
	public PipedOutputStream getPipedOutputStream(){
		return this.out;
	}
	
	public void run(){
		String str = "Hello World"; //要发送的数据
		try {
			this.out.write(str.getBytes()); //发送
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			this.out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

class Recives implements Runnable{ //接收数据的线程
	
	private PipedInputStream input = null;
	
	public Recives(){
		this.input = new PipedInputStream();
	}
	
	public PipedInputStream getPipedInputStream(){
		return this.input;
	}
	
	public void run(){
		byte b[] = new byte[1024]; //接收内容
		int len = 0;
		try {
			len = input.read(b); //内容读取
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			input.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(new String(b,0,len));
	}
}

public class PipedInputDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Send send = new Send();
		Recives rec = new Recives();
		send.getPipedOutputStream().connect(rec.getPipedInputStream()); //进行管道连接
		new Thread(send).start(); //启动线程
		new Thread(rec).start(); //启动线程
	}

}


打印流


使用OutputStream 可以完成数据的输出,但是现在如果有一个float 型数据好输出吗?

也就是说虽然现在提供了输出流的操作类,但是这个类本身的输出的支持功能并不是十分的强大,所以,如果现在要想进行更方便的输出操作,则可以使用打印流。


打印流分两种:PrintStream、PrintWriter

观察打印流的定义:


public class PrintStream

extends FilterOutputstream

implements Appendable,Closeable


PrintStream 是 OutputStream 的子类,继续观察其构造方法


public PrintStream(OutputStream out)

在此就去中要接收OutputStream 子类的引用

实际上PrintStream 属于装饰。也就是说根据实例化 PrintStream 类对象的不同,输出的位置也不同


package org.printoutputdemo;

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

public class PrintOutputDemo {

	/**
	 * @param args
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub
		File file = new File ("D:"+File.separator+"demo.txt");
		PrintStream output = new PrintStream(new FileOutputStream(file));
		output.print("Hello");
		output.print(" World");
		output.println("abco");
		output.println(1.0);
		output.close();
	}

}

得出结论,使用打印流输出最为方便,所以建议以后在输出的时候就使用打印流完成

在JDK1.5之后对打印流进行了更新,可以使用格式化输出


public PrintStream printf(String format,Object .... args)


可以设置格式和多个参数


package org.printoutputdemo;

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

public class PrintStreamDemo01 {

	/**
	 * @param args
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub
		File file = new File ("D:"+File.separator+"demo.txt");
		PrintStream output = new PrintStream(new FileOutputStream(file));
		String name = "张三";
		int age = 20;
		double score =  99.1;
		char sex ='M';
		output.printf("姓名:%s 年龄:%d 分数:%5.2f 性别:%c",name,age,score,sex);
		output.close();
	}

}


在打印流中一定要始终记住以下的原则:根据实例化其子类的不同,完成的打印输出也不同


分享到:
评论

相关推荐

    JAVA_内存流

    理解并熟练使用Java内存流是成为一名优秀Java开发者的关键技能之一。通过实际编写代码例子,你可以更好地掌握这些类的用法,例如创建一个简单的程序,将一个字节数组写入 ByteArrayOutputStream,然后从 ...

    内存操作流

    内存操作流是Java I/O系统的一个关键组件,它允许程序高效地在内存和外部存储之间移动数据。本文将深入探讨Java中的内存操作流,并以`ByteInp.java`这个文件为例进行讲解。 Java I/O库提供了多种流类型,包括字节流...

    java学习笔记(java 反射机制 流 内存管理)

    Java内存管理主要涉及到堆内存和栈内存的分配与回收。堆内存主要用于存储对象实例,由垃圾收集器自动管理。垃圾收集器通过可达性分析判断对象是否可被访问,不可达的对象将被回收。JVM提供了几种不同的垃圾收集算法...

    Java内存机制学习和使用

    在深入理解Java内存机制之前,我们需要了解底层硬件和操作系统的限制。 **硬件限制**:计算机硬件的限制决定了物理内存的可用性。例如,处理器的寄存器大小和物理地址大小共同决定了处理器能够直接寻址的内存范围。...

    java文件与流操作code

    在Java中,I/O(输入/输出)系统是通过流(Stream)的概念来设计的,流是数据传输的抽象表示,可以是文件、网络连接、内存缓冲区等。下面将详细解释Java中的文件操作和流技术。 1. **Java I/O基础** - Java的I/O库...

    java内存模型.pdf

    Java内存模型(JMM)是Java虚拟机(JVM)的一部分,它定义了程序中不同变量如何交互,特别是在多线程环境下。JMM确保了在各种硬件和操作系统平台上,Java程序的行为具有一致性和可预测性。Java内存模型的主要目标是...

    Java 输入与输出流操作

    流可以是向文件、内存、网络连接等地方读写数据。Java中的流分为字节流和字符流,字节流处理单个字节的数据,而字符流处理Unicode字符。 2. **字节流**: - **InputStream** 和 **OutputStream** 是所有字节输入流...

    IO流 javaio java 流

    - 字节数组流(ByteArrayInputStream/ByteArrayOutputStream):在内存中操作字节数据。 - 对象流(ObjectInputStream/ObjectOutputStream):用于序列化和反序列化Java对象。 2. 字符流: - 字符输入流(Reader...

    JAVA 文件常用流操作.zip

    这个名为"JAVA 文件常用流操作.zip"的压缩包可能包含了各种关于Java中文件流使用的示例和教程。让我们深入探讨一下Java中的文件流操作。 首先,Java中的文件操作主要通过IO(Input/Output)流来实现。IO流分为两大...

    java实现流媒体播放

    为了确保流畅的播放体验,Java程序需要实现缓冲机制,即预先加载一部分数据到内存,以防网络延迟导致播放中断。同时,由于网络传输速度可能不稳定,程序还需要处理数据包的同步问题,确保音频和视频数据能正确匹配。...

    完美解决java读取excel内存溢出问题.rar

    通过这些方法,我们可以有效地处理大Excel文件,避免Java内存溢出。在实践中,可能需要结合多种策略,根据具体项目需求进行调整和优化。 示例代码: ```java import org.apache.poi.xssf.streaming.SXSSFWorkbook;...

    Java 内存模型

    Java内存模型(Java Memory Model,JMM)是Java平台中的一种规范,它定义了线程如何访问和修改共享变量,以及在多线程环境中如何保证数据一致性。JMM的主要目标是解决多线程环境下的可见性、有序性和原子性问题。 ...

    java内存分配 内存泄漏

    理解Java内存分配和JVM工作原理对于开发高效、健壮的Java应用至关重要。开发者应避免内存泄漏,合理使用内存,充分利用JVM的垃圾收集机制,同时理解JIT编译的优化策略,以提高程序的运行性能。在开发过程中,使用...

    java IO流操作详解源代码下载

    Java IO流操作是Java编程中不可或缺的一部分,它用于在程序和外部资源(如磁盘、网络、内存等)之间传输数据。在这个详细的源代码下载中,我们可以通过四篇相关的CSDN博客文章来深入理解Java IO流的工作原理和实际...

    java 内存泄漏

    ### Java内存泄漏详解 #### JVM内存管理概览 在探讨Java内存泄漏之前,我们先简要回顾一下JVM(Java虚拟机)的基本架构及其内存管理机制。这有助于更好地理解内存泄漏的发生原因及其解决方法。 ##### 类装载子...

    Java字符流和字节流

    在Java中,I/O流主要用于处理输入输出操作,包括文件读写等。根据处理数据类型的不同,Java I/O流主要分为字节流和字符流两大类。字节流处理的是8位的字节数据,而字符流处理的是16位的Unicode字符。这两种流都有...

    java输入输出流,电子课件

    这些接口有多个实现类,覆盖了对文件、网络、内存缓冲区等多种数据源的读写操作。 9.1.1 输入输出流基本概念 输入流通常用于读取数据,而输出流用于写入数据。Java中,所有的输入流都继承自InputStream或Reader,...

    Java内存分析工具ji

    Java内存分析工具ji Java内存分析工具ji是Java程序员不可或缺的工具之一,它可以帮助开发者快速地排查和解决Java内存泄漏问题。在本文中,我们将详细介绍Java内存泄漏的定义、原因、排查方法、解决方案,并提供一个...

    《JAVA_IO流学习总结》

    总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...

    java io 流,文件读取操作

    Java IO 流、文件读取操作 Java IO 流是 Java 语言中的一种基本输入/输出机制,它提供了多种方式来处理输入/输出操作。在 Java 中,IO 流可以分为两大类:字节流和字符流。字节流主要用于处理二进制数据,而字符流...

Global site tag (gtag.js) - Google Analytics