109java内存操作流(内存流操作)

5 阅读3分钟

内存操作流(内存流操作)

一、什么是内存操作流

内存操作流可以实现两个文件的合并处理(文件量不大时),内存操作流的核心部分就是将所有的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类,在进行数据完整读取时会有缺陷,结合内存流操作时会好很多,但如今已有很多新开发的类更加便捷,使用此方法与否在于自身选择,我们需要知道不同子类用同一种方法有不同功能。