流的来源或目的地不一定是文件,也可以是内存中的一个空间,例如一个位数组。java.io.ByteArrayInputStream和java.io.ByteArrayIOutputStream类便是将位数组当作流输入来源、输出目的地的类。

     ByteArrayInputStream可以将一个数组当作流输入的来源,而ByteArrayIOutputStream则可以将一个位数组当作流输出的目的地。下面是一个关于这两个类的示例,通过这两个类将文本文件里的相应字符改变,具体作法是通过ByteArrayInputStream将此文本文件中的内容读入数组,而后指定数组索引修改元素,最后再重新将数组用ByteArrayOutputStream存回文件。

Java代码 ByteArrayInputStream和ByteArrayOutputStream类_stream
  1. package ysu.hxy;   
  2.   
  3. import java.io.*;   
  4. import java.util.*;   
  5.   
  6. public class ByteArrayStreamDemo   
  7. {   
  8.     public static void main(String[] args)    
  9.     {   
  10.         try  
  11.         {   
  12.             File file = new File(args[0]);   
  13.   
  14.             BufferedInputStream bufInputStream = new BufferedInputStream(new FileInputStream(file));   
  15.   
  16.             ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();   
  17.   
  18.             byte[] bytes = new byte[1];   
  19.   
  20.             //将文件内容写入位数组流   
  21.             while(bufInputStream.read(bytes)!=-1)   
  22.             {   
  23.                 arrayOutputStream.write(bytes);   
  24.             }   
  25.             arrayOutputStream.close();   
  26.             bufInputStream.close();   
  27.   
  28.             //以字符方式显示位数组内容   
  29.             bytes = arrayOutputStream.toByteArray();   
  30.             for(int i=0;i<bytes.length;i++)   
  31.             {   
  32.                 System.out.print((char)bytes[i]);   
  33.             }   
  34.             System.out.println();   
  35.   
  36.             //让使用者输入位置与字符修改位数组内容   
  37.             Scanner scanner = new Scanner(System.in);   
  38.   
  39.             System.out.print("请输入修改位置:");   
  40.             int pos = scanner.nextInt();   
  41.             System.out.println("输入修改字符");   
  42.             //修改数组中对应的字符   
  43.             bytes[pos-1] = (byte)scanner.next().charAt(0);   
  44.   
  45.             //将位数组内容存回文件   
  46.             ByteArrayInputStream byteArrayInputStream =    
  47.                 new ByteArrayInputStream(bytes);   
  48.             BufferedOutputStream bufOutputStream =    
  49.                 new BufferedOutputStream(new FileOutputStream(file));   
  50.             byte[] tmp = new byte[1];   
  51.             while(byteArrayInputStream.read(tmp)!=-1)   
  52.                 bufOutputStream.write(tmp);   
  53.             byteArrayInputStream.close();   
  54.             bufOutputStream.flush();   
  55.             bufOutputStream.close();   
  56.         }   
  57.         catch(ArrayIndexOutOfBoundsException e)   
  58.         {   
  59.             System.out.println("请指定文件名称");   
  60.         }   
  61.         catch(IOException e)   
  62.         {   
  63.             e.printStackTrace();   
  64.         }   
  65.     }   
  66. }  

 

运行结果:

D:\hxy>java ysu.hxy.ByteArrayStreamDemo test.txt
abcdefg
请输入修改位置:2
输入修改字符
y

再次打开test.txt时,字符串变为aycdefg.

字符在Java中使用Unicode,是两个位组长度,所以这个范例只能用于修改ASCII字符(因为Unicode的前128位与ASCII兼容)。以后会介绍可以修改汉字字符与ASCII字符的程序。