Java笔记(14)-字节数组(ByteArray)流

与之前的文件流不同,之前的所有文件流,读取文件的位置,也就是源,其实都是在磁盘之中,Java无法直接访问,是需要通过操作系统的帮助才行;但是ByteArray不一样,他就叫字节数组,就只是一个地方的某个内存数据而已,Java可以直接访问;

jvm虚拟机只能访问内存数据,字节数组就是一些重要的内存数据(二进制),使用Java操作这一组二进制流时,就是使用字节数组流的方式操作;更重要的是数据(如字符串等)都可以转化成字节数组,有利于以后从服务器提取数据,方便进行网络的传输;

注意点

  1. 转化成字节数组的量要小,否则内存很容易过多;
  2. 字节数组流不需要关闭;
  3. 任何数据都可以转化成字节数组;

1. ByteArrayInputStream和ByteArrayOutputStream的基础使用

以下就是详细的介绍;
虽然说和之前的文件流有些区别,但是总的来说使用的步骤还是差不多的;第一步先找到源(这里的源不是指文件);第二步定义流;第三步执行操作;第四步在这里不需要
1. ByteArrayInputStream的基础使用

public class TextByteArrayIn {
    public static void main(String[] args) {
        InputStream bais = null;
        String s = null;
        int len = -1;
        //定义一个源,这个源不再是文件,可以暂时使用数据代替;
        byte[] msg = "我的博客".getBytes();
        //生成一个对象,使用ByteArrayInputStream的构造方法;
        bais = new ByteArrayInputStream(msg);
        //在底下定義一個字节数组,大小为3,也就是每次取三个字节;(这是UTF-8)
        byte[] data = new byte[3];
         try{
             //循环,知道字节全部取完;
           while ((len=bais.read(data))!=-1) {
               //使用String类的构造方法,将字节直接转化成字符串;
               s = new String(data,0,len);
               System.out.println(s);
            }

        }catch(IOException e){
             e.printStackTrace();
         }
    }
}

2. ByteArrayOutputStream的基础使用

public class FileByteArrayOut {
    public static void main(String[] args) {
        ByteArrayOutputStream out = null;
        int len = -1;
        //定义一个源(当然这个源不是文件),以后也可以是从输入流中得到;
        byte[] msg = "神秘的天".getBytes();
        //定义流
        out = new ByteArrayOutputStream();
        //在这里写入使用write
        out.write(msg,0,msg.length);
        byte[] b= out.toByteArray();
        //由于前面out已经调用了write方法写入了数据,所以最后输出out里面的数据就可以了;
        System.out.println(out.toString());
        System.out.println(b.length);
    }
}

2.怎么通过ByteArrayInputStream和ByteArrayOutputStream复制文件

感觉使用这个方法来复制文件有些,多此一举;不过要明白它不止可以复制文件,最重要的是可以直接复制内存中的数据;作为一名新手,我觉得很好;可以用来练习,以便熟练掌握这些基础技能;还是要多练啊;

//这个方法想写一个通过字节数组来进行文件的复制,当然其中还是要使用到基础字节流;
public class FileByteCopy {
    //先写一个从文件读取数据到字节数组;
    public byte[] FileToArray(String src) {
        int len = -1;
        //确定一个流;
        File file = new File(src);
        ByteArrayOutputStream baout = null;
        InputStream in = null;
        //定义一个流
        baout = new ByteArrayOutputStream();
        try {
            in = new FileInputStream(file);
            //定义一个字节数组;
            byte[] arr = new byte[1024 * 10];
            while ((len = in.read(arr)) != -1) {
                baout.write(arr, 0, len);//第一个变量byte数组;第二个起始位置;第三个总长度;
            }
            return baout.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return new byte[0];
    }

    //这个方法则是将字节数组的值再写入到文件里面;
    public void ArrayToFile(byte[] arr,String din) {
        //定义一个源
        File file = new File(din);
        int len = -1;
        OutputStream outs = null;
        ByteArrayInputStream bain = null;
        //定义流
        try {
            bain = new ByteArrayInputStream(arr);
            outs = new FileOutputStream(file);
            while ((len = bain.read()) != -1) {
                outs.write(arr, 0, len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outs.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        FileByteCopy f = new FileByteCopy();
        byte[] brr = f.FileToArray("./src/Ucopy.jpg");
        f.ArrayToFile(brr,"d.jpg");
    }
}

你可能感兴趣的:(Java)