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