时间:2021-07-01 10:21:17 帮助过:18人阅读
内存流主要用来操作内存
BytearrayInputStream和ByteArrayOutputStream输入和输出可以把文件作为数据源,也可以把内存作为数据源
(1)ByteArrayInputStream主要完成将内容从内存读入到程序中,而ByteArrayOutputStream的主要功能是是将数据写入到内存中
(2)注意:因为这两个流没有使用系统资源,所以不用关闭,也不需要抛出异常
内存操作示意图
(1)从程序中读:程序<—ByteArrayInputStream<—内存数据
(2)向内存中写:程序—>ByteArrayOutputStream<—内存数据
ByteArrayOutputStream获取数据的方式
(1)public byte[] toByteAarray():创建一个新分配的字节数组,它的大小 是这个输出流的当前大小和缓冲区的有效内容的副本
(2)public Stirng toString():使用该平台默认的字符集将缓冲区的内容的转换为字符串
例1(利用内存流复制图片):
package bytestream;
import java.io.*;
public class ByteOutputStreamDemo {
public static void main(String[] args) {
File srcFile = new File("d:" + File.separator + "1TX761XVUM10.jpg");// 源文件地址
File destFile = new File("e:" + File.separator + srcFile.getName());// 目标文件地址
InputStream input = null;// 输入流
OutputStream out = null;// 输出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();// 内存流
try {
input = new FileInputStream(srcFile);// 对象用于读取源文件
out = new FileOutputStream(destFile);// 对象用于写入目标文件
byte[] b = new byte[1024];
int len = 0;
// 边读编写
System.out.println("开始复制文件!");
while ((len = input.read(b)) != -1) {
bos.write(b, 0, len);
}
byte[] date = bos.toByteArray();// 创建一个新的字节数组,他的大小是这个输出流的当前大小,和缓冲区的有效 内容的副本
out.write(date);// 讲缓冲区中的内容一次性写入到目标文件中
System.out.println("文件复制完毕......");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭资源
out.close();
input.close();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:开始复制文件!
文件复制完毕.....
例2(以byteArrayInputStream为例):
package bytestream;
import java.io.*;
public class ByteArrayInputStreamDemo {
public static void main(String[] args) {
String date="世界,你好!!!!";
/**
* 内存输入流中传入的参数为要读取的字节数组,故将date
* 转化为字节数组date.getBytes(),再传入内存流中
*/
ByteArrayInputStream bis = new ByteArrayInputStream(date.getBytes());
byte[] b=new byte[1024];//自定义缓存区
int len=0;
try {
len=bis.read(b);
System.out.println("读取到的内容是:"+new String(b,0,len));
} catch (IOException e) {
e.printStackTrace();
}
//数据存于缓存区中,缓存流不用关闭
}
}
运行结果:读取到的内容是:世界,你好!!!!
二.打印流
打印流提供了打印方法,可以将各种数据类型原样打印,可以操作输出流和文件
PrintStream:
(1)提供操作字节功能
(2)如果包装的是缓冲流可自动设置flush
(3)可设置字符集
PrintWriter:
(1)没有操作字节功能
(2)内部有缓冲区,即使自动刷新设置为true
(3)可设置字符集
打印流的构造方法
<1>PrintStream的构造方法
(1)public PrintStream(File file)
(2)public PrintStream(OutputStream out)
<2>PrintWriter的构造方法
(1)public PrintWriter(File file)
(2)Public PrintWriter(Writer out)
(3)Public PrintWriter(OutputStream out)
例1(写入一首诗到C盘文件下):
package print;
import java.io.*;
public class PrintStreamDemo {
public static void main(String[] args) {
File f=new File("C:"+File.separator+"静夜诗.txt");
PrintStream ps=null;
try {
ps=new PrintStream(f);
ps.println("\t床前明月光");
ps.println("\t疑是地上霜");
ps.println("\t举头望明月");
ps.println("\t低头思故乡");
ps.println("\t\t\t作者:李白");
System.out.println("打印成功...");
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
ps.close();
}
}
}
运行结果:打印成功...
例2(PrintStream若包装缓冲流可设置flush):
package print;
import java.io.*;
public class PrintStreamDemo2 {
public static void main(String[] args) {
File f=new File("c:"+File.separator+"兵法.txt");
PrintStream ps=null;
OutputStream out=null;
try {
out=new FileOutputStream(f);
BufferedOutputStream bos= new BufferedOutputStream(out);
ps=new PrintStream(bos);
ps.println("战武七经:");
ps.println("1.孙子兵法");
ps.println("2.六韬.三略");
ps.println("3.吴子");
ps.println("4.司马法");
ps.println("5.孙膑兵法");
ps.flush();//将缓冲流中的数据刷入文件中
System.out.println("打印成功....");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果:打印成功....
三.对象流,序列化与反序列化
相关类
(1