使用randomaccessfile类将一个文本文件中的内容逆序输出_Java IO2:RandomAccessFile
RandomAccessFile
RandomAccessFile類可以說是Java語(yǔ)言中功能最為豐富的文件訪問類,它提供了眾多的文件訪問方法。RandomAccessFile類支持"隨機(jī)訪問"方式,可以跳轉(zhuǎn)到文件的任意位置處讀寫數(shù)據(jù)。要訪問一個(gè)文件的時(shí)候,不想把文件從頭讀到尾,而是希望像訪問一個(gè)數(shù)據(jù)庫(kù)一樣地訪問一個(gè)文本文件,使用RandomAccessFile類是最佳選擇。
RandomAccessFile對(duì)象類中有個(gè)位置指示器,指向當(dāng)前讀寫處的位置,當(dāng)讀寫n個(gè)字節(jié)后,文件指示器將指向這n個(gè)字節(jié)后的下一個(gè)字節(jié)處。剛打開文件時(shí),文件指示器指向文件的開頭處,可以移動(dòng)文件指示器到新的位置,隨后的讀寫將從新的位置開始。
RandomAccessFile類在文件隨機(jī)(相對(duì)于順序)讀取時(shí)有很大的優(yōu)勢(shì),但該類僅限于操作文件,不能訪問其他得IO設(shè)備,如網(wǎng)絡(luò)、內(nèi)存映像等。
RandomAccessFile構(gòu)造方法
RandomAccessFile類為用戶提供了兩種構(gòu)造方法:
1、RandomAccessFile(File file, String mode)
2、RandomAccessFile(String name, String mode)
其實(shí)第二種構(gòu)造方法也是new一個(gè)File出來再調(diào)用第一種構(gòu)造方法,建議使用第一種構(gòu)造方法,因?yàn)榈谝黄恼戮驼f了File是IO的基礎(chǔ),有一個(gè)File不僅僅可以通過RandomAccessFile對(duì)文件進(jìn)行操作,也可以通過File對(duì)象對(duì)文件進(jìn)行操作。至于mode,Java給開發(fā)者提供了四種mode:
注意第二點(diǎn)"rw"模式,對(duì)rw模式的解釋意味著Java并不強(qiáng)求指定的路徑下一定存在某個(gè)文件,假如文件不存在,會(huì)自動(dòng)創(chuàng)建
RandomAccessFile中的方法
RandomAccessFile中有如下一些常用方法:
RandomAccessFile使用實(shí)例
先定義一個(gè)實(shí)體類:
public class Employee {private String name;private int age;private final static int LEN = 8;public Employee(){}public Employee(String name, int age){if (name.length() > LEN){name = name.substring(0, 8);}else{while (name.length() < LEN){name = name + "u0000";}}this.name = name;this.age = age;}public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;} }第一部分,寫文件,該文件在路徑下并沒有,所以Java會(huì)自動(dòng)幫我們創(chuàng)建:
Employee e1 = new Employee("zhangsan", 23); Employee e2 = new Employee("lisi", 24); Employee e3 = new Employee("wangwu", 25);RandomAccessFile raf0 = new RandomAccessFile("D:/employee.txt", "rw"); raf0.writeBytes(e1.getName()); raf0.writeInt(e1.getAge()); raf0.writeBytes(e2.getName()); raf0.writeInt(e2.getAge()); raf0.writeBytes(e3.getName()); raf0.writeInt(e3.getAge()); raf0.close();文件創(chuàng)建好了,D盤下也有該文件了,所以讀取一下,這里使用了一些小技巧來演示seek方法和skipBytes方法:
RandomAccessFile raf1 = new RandomAccessFile("D:/employee.txt", "r"); int len = 8; raf1.skipBytes(12); // 跳過第一個(gè)員工的信息,其姓名8字節(jié),年齡4字節(jié) System.out.println("第二個(gè)員工的信息:"); String str = ""; for (int i = 0; i < len; i++) {str = str + (char)raf1.readByte(); } System.out.println("name:" + str); System.out.println("age:" + raf1.readInt()); System.out.println("第一個(gè)員工的信息:"); raf1.seek(0); str = ""; for (int i = 0; i < len; i++) {str = str + (char)raf1.readByte(); } System.out.println("name:" + str); System.out.println("age:" + raf1.readInt()); System.out.println("第三個(gè)員工的信息:"); raf1.skipBytes(12); // 跳過第二個(gè)員工的信息 str = ""; for (int i = 0; i < len; i++) {str = str + (char)raf1.readByte(); } System.out.println("name:" + str.trim()); System.out.println("age:" + raf1.readInt()); raf1.close();看一下運(yùn)行結(jié)果:
第二個(gè)員工的信息: name:lisi age:24 第一個(gè)員工信息: name:zhangsan age:23 第三個(gè)員工信息: name:wangwu age:25可能有人奇怪,"zhangsan"加上一個(gè)int跳過12個(gè)字節(jié)可以理解,但是"lisi"、"wangwu"為什么加上int要跳過12個(gè)字節(jié)呢?明明"lisi"只有4個(gè)字節(jié),"wangwu"只有6個(gè)字節(jié)啊。這個(gè)就涉及到一個(gè)"字節(jié)對(duì)齊"的問題了,有興趣的可以了解一下。另外,再說一下,RandomAccessFile使用完一定要及時(shí)close()。
原作者:五月的倉(cāng)頡原文鏈接:Java IO2:RandomAccessFile
原出處:博客園
總結(jié)
以上是生活随笔為你收集整理的使用randomaccessfile类将一个文本文件中的内容逆序输出_Java IO2:RandomAccessFile的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【IIOT】欧姆龙PLC数采之NX/NJ
- 下一篇: 长链接转短链接java_长链接生成短链接