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

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

发布了89 篇原创文章 · 获赞 207 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43729943/article/details/105167010
今日推荐