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

 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();
            }
        }
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要根据绝对路径随机读取某文件夹下的一个文件,可以使用 Java 的 `RandomAccessFile` 类,该类提供了在文件随机访问数据的功能。以下是一个示例代码: ```java import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class RandomAccessFileExample { public static void main(String[] args) throws IOException { String filePath = "/absolute/path/to/folder/file.txt"; // 要读取的文件的绝对路径 File file = new File(filePath); if (!file.exists()) { System.out.println("File not found."); return; } long fileLength = file.length(); RandomAccessFile raf = new RandomAccessFile(file, "r"); long randomFilePointer = (long) (Math.random() * fileLength); raf.seek(randomFilePointer); byte[] buffer = new byte[1024]; int bytesRead = raf.read(buffer); while (bytesRead != -1) { // 处理读取到的数据 System.out.write(buffer, 0, bytesRead); bytesRead = raf.read(buffer); } raf.close(); } } ``` 在这个示例中,我们首先使用文件的绝对路径创建一个 `File` 对象,并检查该文件是否存在。然后,我们获取文件的长度,并创建一个 `RandomAccessFile` 对象,以只读模式打开该文件。 接下来,我们随机生成一个文件指针的位置,并使用 `seek` 方法将文件指针移动到该位置。然后,我们创建一个字节数组缓存区,并使用 `read` 方法从文件中读取数据,并将其存储到缓存区中。我们循环读取文件中的数据,直到读取到文件末尾。 最后,我们关闭 `RandomAccessFile` 对象,释放资源。请注意,这里使用了 try-with-resources 语句,以确保在处理完文件后,对象会被自动关闭并释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值