内存操作流(内存流操作)
一、什么是内存操作流
内存操作流可以实现两个文件的合并处理(文件量不大时),内存操作流的核心部分就是将所有的Outputstream输出的数据保存在程序里面,所以通过此特征进行一些特殊处理。
首先在D盘中新建两个文件:
data-a.txt、data-b.txt文件,在data-a.txt中写入Hello word!,在data-b.tx中写入 你好 世界!,此时要将两个文件合并成Hello(你好) word!(世界!),
如下写入:
public static string readfile(File file)
在读取文件操作时写入File类对象,这个对象会包含完整的路径,如果只传文件名称,那就要再写入常量标注一个目录,相比而言传File类对象更加方便,
然后返回文件内容:
public static string readfile(File file) throws Exception {
if(file.exists()){
InputStresm input=newFileInputStresm(file)
byte data[] = new byte [10]
}
return null;
}
此时定义的数据量为10。
二、如何完成内存流的使用
在数据量巨大时可应用内存流读数据,当我们无法确定数组大小,只能随机开辟一个数组大小如byte10,但所需的并非10个字节碎片,需要全部数据,此时就开辟一个内存流,当我们需要执行IO操作,又不想产生临时文件,此时就可以向内存流内放,放到最后可以一次性的读出来,
我们在IO中找到BytearrayOutputStream中的toByteArray,
此方法为public byte[] toByteArray(),这个方法表示将所有读取到toByteArray的数据都变成字节数组返回。
如图:
按此流程实现读取:
public static string readfile(File file) throws Exception {
if(file.exists()){
InputStresm input=newFileInputStresm(file)
bytearrayOutputStream bos= new bytearrayOutputStream()
byte data[] = new byte [10]
}
return null;
}
bytearrayOutputStream bos= new bytearrayOutputStream()
并没有向上转型,因为toByteArray()属于子类扩充的方法,所以虽然没有看见向上转型,但实际是可以操作的,需要通过其他途径来完成。
接下来可以完成循环:
public static string readfile(File file) throws Exception {
if(file.exists()){
InputStresm input=newFileInputStresm(file)
bytearrayOutputStream bos= new bytearrayOutputStream()
byte data[] = new byte [10];
int temp=0;
while ((temp=input.read(data)) != -1) {
bos.weite(data,off,temp);
}
return null;
}
此时内容都在内存流,现在就要将所有读取的内容返回,在此时写入File对象:
public static void main(String[] arg)throws Exception{
File file[]=new File[] {
new File(“D:”+File.separator+ ”data-a.txt”),
new File(“D:”+File.separator+ ”data-b.txt”)
}
System.out.println(readfile(file[0]));
}
此时可将内容读一下,数据就进来了,在不超内存大小情况下,可不受长度的读取。
接下来进行组合:
public static void main(String[] arg)throws Exception{
File file[]=new File[] {
new File(“D:”+File.separator+ ”data-a.txt”),
new File(“D:”+File.separator+ ”data-b.txt”)
};
String data []=new String[2] ; //定义一个字符串的对象组
for (int x=0; x < file.length; x ++) {
data[x]=readfile(file[x]); //读取数据
}
stringBuffer buf=new stringBuffe(); //组合操作
string contentA[]=data[0].split(“ “); //根据空格拆分
string contentA[]=data[1].split(“ “); //根据空格拆分
outputstream output=new fileOutputstream(new File(“D:”+File.separator+ ”data.txt”))
for(int x=0;x < contentA.length; x ++) {
string str = contentA[x]+”(“contentB[x]+”)”;
buf.append(contentA[x]).append(“(“).append(contentB[x].append(“(“). append(“(“);
output.write(str.getBytes());
}
output.clpse();
Syteam.out.println(buf);
}
这时执行后之前的两个文件便合并成Hello(你好) word!(世界!),此时便发现如果只使用InputStream类,在进行数据完整读取时会有缺陷,结合内存流操作时会好很多,但如今已有很多新开发的类更加便捷,使用此方法与否在于自身选择,我们需要知道不同子类用同一种方法有不同功能。