什么是内存流
熟知的有文件流,也就是对文件进行IO处理,但IO操作也可在内存中,这种流称为内存操作流。
文件流是以文件为操作终端,会产生文件(不论文件数据是否保存),但是内存流是以内存为操作终端,不会产生文件。
内存流分为2类:
1.字节内存流:ByteArrayInputStream、ByteArrayOutputStream
2.字符内存流:CharArrayReader、CharArrayWriter
//字节内存流继承关系
public class ByteArrayInputStream extends InputStream ;
public class ByteArrayOutputStream extends OutputStream;
//字符内存流继承关系:
public class CharArrayReader extends Reader;
public class CharArrayWriter extends Writer;
在文件流中,会创建一个File终端对象,因为不知道要操作哪个文件,但是在内存流中,要操作的终端只有一个内存,所以不用手动创建内存终端对象。
用内存流实现大小写转换:
package CODE.JavaIo;
import java.io.*;
public class Mem {
public static void main(String[] args) throws IOException {
String str="hello pick";
//输入输出流:
ByteArrayInputStream in=new ByteArrayInputStream(str.getBytes());//输入流,要输入的数据保存到内存中
ByteArrayOutputStream out =new ByteArrayOutputStream(); //输出流
//输入输出数据
int len=0;
//一次读取一个字节,将读取到的数据大写然后写入内存
while((len=in.read())!=-1)
{
out.write(Character.toUpperCase(len));
}
System.out.println(out); //HELLO PICK
out.close();
in.close();
}
}
发生了IO操作,但是没有文件产生,可以理解为一个临时文件处理。
打印流
OutputStream的write只能接受字节数组,打印流是为了可以接收很多类型数据(int double String等),但核心依然是OutputStream。
简单设计一个打印流:
package CODE.JavaIo;
import java.io.*;
//设计一个简单的打印流
class PrintUtil
{
private OutputStream out;
//类外部传入输出流
public PrintUtil(OutputStream out)
{
this.out=out;
}
//核心方法
public void print(String str)
{
try {
out.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
public void println(String str)
{
print(str+"\r\n");
}
public void print(int n)
{
print(String.valueOf(n));
}
public void println(int n)
{
println(String.valueOf(n));
}
public void print(double d)
{
print(String.valueOf(d));
}
public void println(double d)
{
println(String.valueOf(d));
}
public void close()
{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class printStream {
public static void main(String[] args) throws Exception {
File file=new File("C:"+File.separator+"Users"+
File.separator+ "lenovo"+File.separator+"Desktop"+
File.separator+"Test.txt");
OutputStream out=new FileOutputStream(file);
PrintUtil printUtil=new PrintUtil(out);
printUtil.print("姓名:");
printUtil.println("pick");
printUtil.print("年龄");
printUtil.println(18);
printUtil.close();
}
}
系统提供的打印流
1.字节打印流:PrintStream
2.字符打印流:PrintWriter
系统提供的字节打印流
public class printStream {
public static void main(String[] args) throws Exception {
File file=new File("C:"+File.separator+"Users"+
File.separator+ "lenovo"+File.separator+"Desktop"+
File.separator+"Test.txt");
OutputStream out=new FileOutputStream(file);
PrintStream printUtil=new PrintStream(out);
printUtil.print("姓名:");
printUtil.println("pick");
printUtil.print("年龄");
printUtil.println(18);
printUtil.close();
}
}
打印流应用的是装饰设计模式(基于抽象类的设计模式),核心依然是某个类(OutputStream)的功能(write()),但是为了得到更好的效果,让其支持的功能更多。
可以很方便的扩展装饰类,装饰类不同,功能不同。
优点:扩展功能方便,需要不同的功能,只需要更换装饰类。
缺点:类结构复杂。
字节打印流格式化输出
在JDK1.5后,有了格式化输出。
public PrintStream printf(String format, Object ... args)
例:
系统提供的字节打印流
public class printStream {
public static void main(String[] args) throws Exception {
File file=new File("C:"+File.separator+"Users"+
File.separator+ "lenovo"+File.separator+"Desktop"+
File.separator+"Test.txt");
OutputStream out=new FileOutputStream(file);
PrintStream printUtil=new PrintStream(out);
printUtil.printf("姓名:%s 年龄:%d","pick",18);
}
}
String的格式化输出
//静态方法
public static String format(String format, Object... args)
String的格式化输出
public class printStream {
public static void main(String[] args) throws Exception {
String str=String.format("姓名:%s 年龄:%d","pick",18);
System.out.println(str);
}
}