内存流和打印流

内存流

      在流的操作中除了进行文件的输入与输出操作之外,也可以针对于内存进行同样的操作。假设说现在某一种应用,需要进行IO操作,但是又不希望在磁盘上产生一些文件的时候,就可以将内存当作一个临时文件进行操作。在Java中,针对于内存操作提供有两组类:

    Ø  字节内存流:ByteArrayInputStream(内存字节输入流)、ByteArrayOutputStream(内存字节输出流);

    Ø  字符内存流:CharArrayReader(内存字符输入流)、CharArrayWriter(内存字符输出流)。

实现一个小写字母转大写字母的操作

public class TestDemo {
	public static void main(String[] args) throws Exception { // 此处直接抛出
		String str = "ww&dd"; // 要求被转换的字符串
		// 本次将通过内存操作流实现转换。先将数据保存在内存流里面,而后从里面取出每一个数据
		// 将所有要读取的数据设置到内存输入流之中,本次利用向上转型为InputStream类实例化
		InputStream input = new ByteArrayInputStream(str.getBytes());
		// 为了能够将所有的内存流数据取出,可以使用ByteArrayOutputStream
		OutputStream output = new ByteArrayOutputStream();
		int temp = 0; 	// 读取每一个字节数据
		// 经过此次循环之后,所有的数据都将保存在内存输出流对象之中 
		while ((temp = input.read()) != -1) { 	// 每次读取一个数据
			// 将读取进来的数据转换为大写字母,利用Character.toUpperCase()可以保证只转换字母
			output.write(Character.toUpperCase(temp));		// 字节输出流
		}
		System.out.println(output); // 调用toString()方法
		input.close();	// 关闭输入流
		output.close();		// 关闭输出流
	}
}

实现文件的合并读取


public class TestDemo {
	public static void main(String[] args) throws Exception { // 异常简化处理
		File fileA = new File("D:" + File.separator + "infoa.txt");// 文件路径
		File fileB = new File("D:" + File.separator + "infob.txt");// 文件路径
		InputStream inputA = new FileInputStream(fileA);// 字节输入流
		InputStream inputB = new FileInputStream(fileB);// 字节输入流
		ByteArrayOutputStream output = new ByteArrayOutputStream();// 内存输出流
		int temp = 0; 		// 每次读取一个字节
		while ((temp = inputA.read()) != -1) {// 循环读取数据
			output.write(temp);	// 将数据保存到输出流
		}
		while ((temp = inputB.read()) != -1) {// 循环读取数据
			output.write(temp);	// 将数据保存到输出流
		}// 现在所有的内容都保存在了内存输出流里面,所有的内容变为字节数组取出
		byte data[] = output.toByteArray();// 取出全部数据
		output.close();// 关闭输出流
		inputA.close();// 关闭输入流
		inputB.close();// 关闭输入流
		System.out.println(new String(data));// 字节转换为字符串输出
	}
}

打印流

      在java.io包中OutputStream是进行输出操作的最核心控制类,但是利用OutputStream会存在有一个问题:所有的输出数据必须以字节类型的数据为主。也就是说如果现在要输出的数据是int(Integer)、double(Double)、java.util.Date等常用类型都需要将其转换为字节后才可以输出。为了解决这样的矛盾问题,在java.io包中又专门提供了一组打印流(字节打印流:PrintStream、字符打印流:PrintWriter)方便用户的输出操作。

打印流实现思想

    java.io.OutputStream类主要是进行数据输出,所以如果要设计更加合适的打印流操作类,那么就必须可以解决OutputStream输出数据类型有限(只有byte类型)的问题,这个时候可以采用一种包装设计的模式,即:将OutputStream类利用其它类进行包装,并且在这个类中提供有各种常见数据类型的输出操作,这样用户在进行输出操作时就可以回避掉字节数据的操作

 

PrintStream类的常用操作方法

No.

方法

类型

描述

1

public PrintStream(OutputStream out)

构造

通过已有OutputStream确定输出目标

2

public void print(数据类型 参数名称)

普通

输出各种常见数据类型

3

public void println(数据类型 参数名称)

普通

输出各种常见数据类型,并追加一个换行


使用PrintStream类实现输出

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class TestDemo {
	public static void main(String[] args) throws Exception { // 此处直接抛出
		// 实例化PrintStream类对象,本次利用FileOutputStream类实例化PrintStream类对象
		PrintStream pu = new PrintStream(new FileOutputStream(new File("d:"
				+ File.separator + "yootk.txt")));
		pu.print("优拓教育:");
		pu.println("www.yootk.com");
		pu.println(1 + 1);
		pu.println(1.1 + 1.1);
		pu.close();
	}
}

PrintStream类的改进

      rintStram类在最初设计时主要是为了弥补OutputStream输出类的功能不足,但是从JDK 1.5开始,为PrintStream增加了格式化输出的支持方法:public PrintStream printf(String format, Object... args)。利用这些方法可以使用像C语言那样的数据标记实现内容填充,常见的输出标记为:整数(%d)、字符串(%s)、小数(%m.nf)、字符(%c)。

格式化输出

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class TestDemo {
	public static void main(String[] args) throws Exception { // 此处直接抛出
		String name = "李兴华";
		int age = 19;
		double score = 59.95891023456;
		PrintStream pu = new PrintStream(new FileOutputStream(new File("d:"
				+ File.separator + "yootk.txt")));
		pu.printf("姓名:%s,年龄:%d,成绩:%5.2f", name, age, score);
		pu.close();
	}
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值