Java 基础(IO流 类的常用方法)

特殊RandomAccessFile

RandomAccessFile不属于IO流,支持对文件的读取和写入随机访问

public class RandomAccessFile implements DataOutput,Datalnput, Closteable

        DataInput 接口中定义了基本数据类型的对操作,例如readlnt/readDouble等

        DataOuput 接口定义了基本数据类型的写操作,例如writelnt/writeDouble等

RandomAccessFile 是Java输入/输出流体系中功能最丰富的文件内容访问类,既可以读取文件内容,也可以向文件输出数据。

RandomAccessFile构造器

        RandomAccessFile类在创建对象时,除了指定文件本身,还需要指定一个mode参数指定         RandomAccessFile的访问模式,该参数有如下四个值:

r以只读方式打开指定文件。如果试图对该RandomAccessFile指定的文件执行写入方法则会抛出 IOException

rw以读取、写入方式打开指定文件。如果该文件不存在,则尝试创建文件

rws以读取、写入方式打开指定文件。相对于rw模式,还要求对文件的内容或元数据的每个更新都 同步写入到底层存储设备,默认情形下(rw模式下),是使用buffer的,只有cache满的或者使用 RandomAccessFile.close()关闭流的时候儿才真正的写到文件

rwd与rws类似,只是仅对文件的内容同步更新到磁盘,而不修改文件的元数据

RandomAccessFile写方法

RandomAccessFile raf=new RandomAccessFile("d:\\abc.data","rw");

raf.writeInt(1); raf.writeChars("zhangsan");

raf.writeDouble(123.4/56);

raf.close();

RandomAccessFile读方法

RandomAccessFile raf=new RandomAccessFile("d:/abc.data","r");

int id=raf.readInt();

int len=raf.readInt();

StringBuilder sb=new StringBuilder();

for(int i=0;i<len;i++)

        sb.append(raf.readChar());

String name=sb.toString();

double salary=raf.readDouble();

记录指针的特殊方法

与普通的输入/输出流不同的是: RandomAccessFile支持跳到文件任意位置读写数据, RandomAccessFile对象包含一个记录指针,用以标识当前读写处的位置,当程序创建一个新的 RandomAccessFile对象时,该对象的文件记录指针对于文件头(也就是0处),当读写n个字节后,文 件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针 RandomAccessFile包含两个方法来操作文件记录指针:文件指针是按照字节数进行统计,取值范围为 [0,file.length()]

long getFilePointer():返回文件记录指针的当前位置

void seek(long pos):将文件记录指针定位到pos位置

skipByte(int step); 相对当前位置跳过step个字节

如果文件中间的内容需要进行修改,注意新内容中的字串和原始文件内容的长度应该一致,否则可能会 导致修改数据后面的内容无法正常读取

常见方法

void close() 关闭操作

int read(byte[] b)将内容读取到一个byte数组之中

byte readByte()读取一个字节

int readInt()从文件中读取整型数据…

readDouble()等8种简单类型

String readLine()读取一行数据

void writeBytes(String s)将一个字符串写入到文件之中,按字节的方式处理。

writeChars void writeInt(int v)将一个int型数据写入文件,长度为4位。

…writeDouble等8种类型

创建文件读写学生就业信息

1、数据格式:学号(long没有任何含义,仅仅是一个编号)、姓名(String)、就业单位(String)、就业薪 资(double)

NIO

从JDK1.4开始Java引入了一系列改进的输入/输出处理的新功能,统称为NIO,即新IO,新增了许多用于 处理输入输出的类,新IO采用内存映射文件的方式处理输入输出,新IO将文件或文件的一段区域映射到 内存中,这样就可以像访问内存一样来访问文件,这种方式进行输入输出比传统的输入输出快的多

NIO基础

Channel通道和Buffer缓冲是NIO中的两个核心对象

Chanel是对传统输入输出系统的模拟,通过map方法可以将一块数据映射到内存中

Buffer本质是一个数组,发送到Channel中的所有对象都必须先放到Buffer中,而从Channel中读 取的数据必须先放到Buffer中

NIO和多路复用的区别

IO模型

同步阻塞IO(Blocking IO):即传统的IO模型

同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置 为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库

多路复用IO(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的 Selector和Linux中的epoll都是这种模型

异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

java NIO就是采用多路复用IO模式

在多路复用IO模型中,会有一个线程(Java中的Selector)不断去轮询多个socket的状态,只有当 socket真正有读写事件时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个 线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只 有在真正有socket读写事件进行时,才会使用IO资源,所以它大大减少了资源占用。

Buffer的使用

Buffer是一个抽象类,主要作用是用于装入数据,然后输出数据

        最常见的子类ByteBuffer可以在底层字节数组上进行get/set操作

        其它基本数据类型都有对应的Buffer类:CharBuffer、 ShortBuffer、 IntBuffer、 LongBuffer、 FloatBuffer、 DoubleBuffer

静态方法static XxxBuffer allocate(int capacity)创建一个容量为capacity的XxxBuffer对象

Buffer中有3个重要概念:容量capacity、界限limit和位置position

        容量capacity表示该Buffer的最大数据容量,创建后则不能改变

        界限limit,位于limit后的数据既不可被读,也不可被写

        位置position用于指明下一个可以被读出的或者写入缓冲区的位置索引

        标记mark位置

        Buffer的position为0,limit为capacity,程序可以通过put方法向Buffer写入一些数据,每放入一些数 据,Buffer的position响应的向后移动。

写文件操作

String fileName = "nioFile";
try (FileOutputStream fos = new FileOutputStream(new File(fileName))) {
    FileChannel channel = fos.getChannel();
    ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode("你好你好..");
    int length = 0;
    while ((length = channel.write(byteBuffer)) != 0) {
    System.out.println("写入长度:" + length);
    }
} catch (IOException e) {
    e.printStackTrace();
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值