Java I/O流之随机流详解,包含随机流读写数据时编码格式问题!

Java I/O流中众多流,都有各自的优点。那么今天所讲解的随机流又是怎样的一种读写操作呢?往下看:

随机流:

通过前面的讲解,我们已经知道,如果要对一个文件读取、写入内容我们需要创建两个流,一个输入流一个输出流。那有没有一种方法能够创建一个流就可以进行读取和写入操作呢?当然有了,这就是我们的随机流(RandomAccessFile类)。
RandomAccessFile类所创建的流就称为随机流。这种流的指向既可以作为流的源,也可以作为流的目的地。

能明白不?说明白点吧,就是创建这一个流既能读取文件中的内容,也能通过这个流写入文件中内容。不需要像之前一样,创建了输入流又要创建输出流。

要点一: 构造方法:

RandomAccessFile(String name,String mode);

参数name用来指定文件名,也就是指定流的源同时也是目的地。参数mode可以取r(只读)或者rw(可读写),这是决定流对文件的访问权利。

RandomAccessFile(File file,String mode);

参数file是传入一个File类的对象,也是用来指定流的源和目的地用的。参数mode与上面一样。

特别需要注意的是:RandomAccessFile流指向文件时,不刷新文件。所以即使文件中有内容,再往里添加内容,之前的内容也不会消失。

要点二: 我们通过构造方法创建好流之后,接着就是需要用方法来对文件进行读写操作了。
在RandomAccessFile类中方法有多种,下面我将给出常用方法以及对应的描述:

方法				描述
getFilePointer()	获取当前读写的位置
length()			获取文件的长度
close()				关闭文件
read()				从文件中读取一个字节的数据
readBoolean()		从文件中读取一个布尔值,0代表false,其他值代表true
readByte()			从文件中读取一个字节
readChar()			从文件中读取一个字符(2个字节)
readDouble()		从文件中读取一个双精度浮点值(8个字节)
readFloat()			从文件中读取一个单精度浮点值(4个字节)
readFully(byte b[])	读b.length个字节放入数组b中,完全填满该数组
readInt()			从文件中读取一个int值(4个字节)
readLine()			从文件中读取一个文本行
readLong()			从文件中读取一个长整型(8个字节)
readShort()			从文件中读取一个短整型(2个字节)
readUnsignedByte()	从文件中读取一个无符号字节(1个字节)
readUnsignedShort()	从文件中读取一个无符号短型值(2个字节)
readUTF()			从文件中读取一个UTF字符串
seek(long position)	定位读写位置
setLength(long newlength)设置文件的长度
skipBytes(int n)	在文件中跳过给定数量的字节
write(byte b[])		写b.length个字节到文件中
writeBoolean(boolean v)把一个布尔值作为单位字节值写入文件
writeByte(int v)	向文件写入一个字节
writeBytes(String s)向文件写入一个字符串
writeChar(char c)	向文件写入一个字符
writeChars(String s)向文件写入一个作为字符数据的字符串
writeDouble(double v)向文件写入一个双精度浮点值
writeFloat(float v)	向文件写入一个单精度浮点值
writeInt(int v)		向文件写入一个intwriteLong(long v)	向文件写入一个长型intwriteShort(int v)	向文件写入一个短型intwriteUTF(String s)	向文件写入一个UTF字符串

下面我拿其中的几个方法来做个示例:


import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

public class Main{
	public static void main(String[] args) throws IOException {
		File file = new File("E:\\Java\\read.txt");
		try {
			RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
			int len = (int) randomAccessFile.length();
			byte[]a = new byte[len];
			for (int i = 0; i < a.length; i++) {
				a[i] = randomAccessFile.readByte();
			}
			randomAccessFile.close();
//			String str = new String(a,"utf-8");
//			System.out.println(str);
			RandomAccessFile writeAccessFile = new RandomAccessFile("E:\\Java\\writer.txt", "rw");
			for (int i = 0; i < a.length; i++) {
				writeAccessFile.writeByte(a[i]);
			}
			
			System.out.println("数据成功复制到另一文件中。");
			System.out.print("请输入要追加的内容:");
			String input = new Scanner(System.in).nextLine();
			byte b[] = input.getBytes("utf-8");  //把输入的内容转编码格式到byte数组里面,切记,数组设置编码只能是byte类型数组
			for (int i = 0; i < b.length; i++) {
				writeAccessFile.writeByte(b[i]);
			}
			
//			writeAccessFile.writeUTF(input);
			writeAccessFile.close();
			System.out.println("追加成功!");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聂大哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值