内存流
在流的操作中除了进行文件的输入与输出操作之外,也可以针对于内存进行同样的操作。假设说现在某一种应用,需要进行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();
}
}