随机访问文件流及字节数组流

随机访问文件流及字节数组流,第1张

 1.随机访问文件流
  • 随机流(RandomAccessFile):此类的实例支持对随机访问文件的读取和写入

  • 位于java.io包

  • 特点

    • 该对象即能读也能写,一个对象就搞定

    • 该对象内部维护了一个大型 byte 数组,光标或索引在该数组任意位置读取或写入任意数据

    • 可以通过getFilePointer方法获得光标的位置和通过seek方法设置光标位置

    • 该对象将字节输入流和输出流进行了封装

    • 该对象源或目的,只能文件,通过下面的构造方法就可以看出

构造方法

随机流的方法有很多

 

案例:
package random_access_file;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.RandomAccess;

public class RandomAccessFileTest {
    public static void main(String[] args) {
        //utf-8 1个中文字符代表3个字节
         RandomAccessFile randomAccessFile=null;

        try {
            //创建RandomAccessFile对象
            //构造方法参数,第一个参数文件名称,第二个参数 模式,r表示读,w表示写,rw表示读写
            randomAccessFile=new RandomAccessFile("data.txt","rw");//我在大国很安全
            //seek 把指针移动到指定位置
            //utf-8中文编码 一个汉字3个字节
            //略过前四个汉字
            randomAccessFile.seek(3*4);
            //定义缓存数组
            byte[] buffer=new byte[50];
            //read 从指定位置开始读取数据到byte[] buffer数组中
            //读取12字节(4个汉字)到buffer中
            randomAccessFile.read(buffer,0,12);
            //把buffer数组中数据转换成字符串
            String str=new String(buffer,0,12);
            //打印字符串
            System.out.println(str);

            //seek再把指针移动到指定位置
            //略过两个汉字
            randomAccessFile.seek(2*3);
            //写入数据,覆盖对应的位置数据
            //字符串”大“所在的文件RandomAccessFileTest.java比如是utf-8编码--》“大”.getBytes("utf-8"),没有问题
            //字符串”大“所在的文件RandomAccessFileTest.java比如是gbk编码--》“大”.getBytes("gbk"),没有问题
            randomAccessFile.write("大".getBytes());

            //重新获取指针位置,不获取,指针默认0是国
            randomAccessFile.seek(2*3);
            randomAccessFile.read(buffer,0,18);
            String str1=new String(buffer,0,18);
            System.out.println(str1);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭流
                randomAccessFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  2.字节数组流
  • 字节数组流:提供了针对于字符数组 byte [] 的标准的IO *** 作方式

  • 位于java.io包

  • ByteArrayInputStream 和 ByteArrayOutputStream

    • ByteArrayInputStream将会给一个byte buf[] 提供标准的IO *** 作方式

    • ByteArrayOutputStream则是将数据写入到内部的字节数组中

 

  • ByteArrayInputStream 和 ByteArrayOutputStream

  • ByteArrayOutputStream 写入的是自己内部的字节数组,属于内存数据,不涉及任何资源,所以不需要close

 

 案例:
package byte_array_stream;

import com.sun.org.apache.xml.internal.utils.StringToStringTable;

import java.io.*;
import java.util.function.DoubleToIntFunction;

public class TestByteArrayOutpuAndInputStream {
    public static void main(String[] args) {
        byte[] buffer = getBuffer();
        printBuffer(buffer);
    }
    private static byte[] getBuffer(){
        byte[] buffer = null;
        ByteArrayOutputStream baos = null;
        BufferedOutputStream bos = null;
        try {
            //实例化ByteArrayOutputStream字节数组输出流对象
            baos = new ByteArrayOutputStream();
            //实例化BufferedOutputStream缓存字节输出流对象
            bos = new BufferedOutputStream(baos);
            //写入数据到ByteArrayOutputStream对象中baos中(内存中)
            bos.write("Hello".getBytes());
            //刷新
            bos.flush();
            //baos转换成数据赋值给数据buffer存储中
            buffer = baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭输出流
            try {
                if (bos != null) {
                    bos.close();
                }
                if (baos != null) {
                    baos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return buffer;
    }

    private static void printBuffer(byte[] buffer){
        ByteArrayInputStream bais = null;
        BufferedInputStream bis = null;
        byte[] b = new byte[buffer.length];
        try {
            //根据数组buffer值实例化ByteArrayInputStream字符数组输入流对象
            bais = new ByteArrayInputStream(buffer);
            //实例化BufferedInputStream数据输入流对象
            bis = new BufferedInputStream(bais);
            //读取数据到b数组中
            bis.read(b);
            String str=new String(buffer);
            System.out.println(str);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭流
            try {
                bis.close();
                bais.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/724206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存