Java IO(二)——RandomAccessFile

一、RandomAccessFile

RandomAccessFile類可以說是Java語言中功能最為豐富的文件訪問類,它提供了眾多的文件訪問方法。RandomAccessFile類支持"隨機訪問"方式,可以跳轉到文件的任意位置處讀寫數據。要訪問一個文件的時候,不想把文件從頭讀到尾,而是希望像訪問一個數據庫一樣地訪問一個文本文件,使用RandomAccessFile類是最佳選擇。

RandomAccessFile對象類中有個位置指示器,指向當前讀寫處的位置,當讀寫n個字節后,文件指示器將指向這n個字節后的下一個字節處。剛打開文件時,文件指示器指向文件的開頭處,可以移動文件指示器到新的位置,隨后的讀寫將從新的位置開始。

RandomAccessFile類在文件隨機(相對于順序)讀取時有很大的優勢,但該類僅限于操作文件,不能訪問其他得IO設備,如網絡、內存映像等。

二、RandomAccessFile構造方法

RandomAccessFile類為用戶提供了兩種構造方法:

1、RandomAccessFile(File file, String mode)

2、RandomAccessFile(String name, String mode)

其實第二種構造方法也是new一個File出來再調用第一種構造方法,建議使用第一種構造方法,因為第一篇文章就說了File是IO的基礎,有一個File不僅僅可以通過RandomAccessFile對文件進行操作,也可以通過File對象對文件進行操作。至于mode,Java給開發者提供了四種mode:

模??? 式作 ? ?用
r表示以只讀方式打開,調用結果對象的任何write方法都將導致拋出IOException
rw打開以便讀取和寫入,如果該文件尚不存在,則嘗試創建該文件
rws打開以便讀取和寫入,相對于"rw",還要求對文件內容或元數據的每個更新都同步寫入到底層存儲設備
rwd打開以便讀取和寫入,相對于"rw",還要求對文件內容的每個更新都同步寫入到底層存儲設備

?

?

?

?

?

注意第二點"rw"模式,對rw模式的解釋意味著Java并不強求指定的路徑下一定存在某個文件,假如文件不存在,會自動創建。

三、RandomAccessFile中的方法

RandomAccessFile中有如下一些常用方法:

方 ? ?法作 ? ?用
void close()重要,關閉此隨機訪問文件流并釋放與該流關聯的所有系統資源
FileChannel getChannel()返回與此文件關聯的唯一FileChannel對象,NIO用到
long getFilePointer()返回此文件中的當前偏移量
long length()返回此文件的長度
int read()從此文件中讀取一個數據字節
int read(byte[] b)將最多b.length個數據字節從此文件讀入byte數組,返回讀入的總字節數,如果由于已經達到文件末尾而不再有數據,則返回-1。在至少一個輸入字節可用前,此方法一直阻塞
int read(byte[] b, int off, int len)將最多len個數據字節從此文件的指定初始偏移量off讀入byte數組
boolean readBoolean()從此文件讀取一個boolean,其余readByte()、readChar()、readDouble()等類似
String readLine()從此文件讀取文本的下一行
void seek(long pos)重要,設置到此文件開頭測量到的文件指針偏移量,在該位置發生下一個讀取或寫入操作
int skipBytes(int n)重要,嘗試跳過輸入的n個字節以丟棄跳過的字節,返回跳過的字節數
void write(byte[] b)將b.length個字節從指定byte數組寫入到此文件中
void write(byte[] b, int off, int len)將len個字節從指定byte數組寫入到此文件,并從偏移量off處開始
void write(int b)向此文件寫入指定的字節
void writeBoolean(boolean v)按單字節值將boolean寫入該文件,其余writeByte(int v)、writeBytes(String s)、writeChar(int v)等都類似

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

三、RandomAccessFile使用實例

先定義一個實體類:

復制代碼
package com.demo.entity;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會自動幫我們創建:

復制代碼
/*** 寫文件*/
@Test
public void writeFile() throws IOException{Employee e1 = new Employee("zhangsan", 23);Employee e2 = new Employee("lisi", 24);Employee e3 = new Employee("wangwu", 25);RandomAccessFile raf0 = new RandomAccessFile("D:/Files/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();
}
復制代碼

文件創建好了,D盤下的Files文件夾也有該文件了,所以讀取一下,這里使用了一些小技巧來演示seek方法和skipBytes方法:

復制代碼
/*** 讀文件*/
@Test
public void ReadFile() throws IOException{RandomAccessFile raf1 = new RandomAccessFile("D:/Files/employee.txt", "r");int len = 8;raf1.skipBytes(12); // 跳過第一個員工的信息,其姓名8字節,年齡4字節System.out.println("第二個員工的信息:");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("第一個員工的信息:");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("第三個員工的信息:");raf1.skipBytes(12); // 跳過第二個員工的信息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();
}
復制代碼

看一下運行結果:

復制代碼
第二個員工的信息:
name:lisi
age:24
第一個員工的信息:
name:zhangsan
age:23
第三個員工的信息:
name:wangwu
age:25
復制代碼

可能有人奇怪,"zhangsan"加上一個int跳過12個字節可以理解,但是"lisi"、"wangwu"為什么加上int要跳過12個字節呢?明明"lisi"只有4個字節,"wangwu"只有6個字節啊。這個就涉及到一個"字節對齊"的問題了,有興趣的可以了解一下。另外,再說一下,RandomAccessFile使用完一定要及時close()。

轉載于:https://www.cnblogs.com/zhuyuewei/p/7263655.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252192.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

halcon select_shape_xld按區域大小描繪xld

常用與對xld進行以面積、長、寬進行XLD的選擇操作。 select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : ) XLD&#xff1a;需要選擇的xld SelectedXLD:選擇后的xld Features:面積、長、高等 Operation&#xff1a;and、or等 Min&#xff1a;最小值門…

工業三防手持終端如何選

物聯宇手持終端作為工業級的數據采集器&#xff0c;目前[]()已廣泛應用在物流快遞、生產制造、零售、醫療、公共事業等領域。由于工業環境的復雜性&#xff0c;手持終端在惡劣的環境下作業&#xff0c;在性能、穩定性、電池耐用性上的要求都較高&#xff0c;同時還必須采用一些…

centos7 安裝python3

1.查看是否已經安裝Python CentOS 7.2 默認安裝了python2.7.5 因為一些命令要用它比如yum 它使用的是python2.7.5。 使用 python -V 命令查看一下是否安裝Python 然后使用命令 which python 查看一下Python可執行文件的位置 可見執行文件在/usr/bin/ 目錄下&#xff0c;切換到該…

centos svn 的搭建

一. SVN 簡介 Subversion(SVN) 是一個開源的版本控制系統, 也就是說 Subversion 管理著隨時間改變的數據。 這些數據放置在一個中央資料檔案庫(repository) 中。 這個檔案庫很像一個普通的文件服務器, 不過它會記住每一次文件的變動。 這樣你就可以把檔案恢復到舊的版本, 或是瀏…

halcon邊緣提取和檢測常用方法

轉自&#xff1a;http://blog.csdn.net/Bob_qiuxu/article/details/46924969 一、邊緣提取 1、設置ROI興趣區域 2、快速二值化&#xff0c;并連接相鄰區域。 這樣做的目的是進一步減少目標區域&#xff0c;通過二值化將目標區域大概輪廓提取出來 3、提取最接近目標區域的輪廓…

oracle sqlplus常用命令

轉自&#xff1a;https://www.cnblogs.com/wdx8927304/p/7927613.html 一、sys用戶和system用戶Oracle安裝會自動的生成sys用戶和system用戶(1)、sys用戶是超級用戶&#xff0c;具有最高權限&#xff0c;具有sysdba角色&#xff0c;有create database的權限&#xff0c;該用戶默…

使用css繪制小三角

<div style"width:0;height:0;overflow: hidden;border-top:4px solid transparent;border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid red; "></div>轉載于:https://www.cnblogs.com/boonook/p/8570442.h…

C#與halcon聯合開發——內存溢出

1.對所以的局部零時變量HObject類的使用前后都加Dispose(); 2.對全局的HObject類變量進行如下定義 HObject liveImage null;HObject ExpGet_liveImage(){return liveImage;}void ExpSet_liveImage(HObject obj){if (liveImage ! null)liveImage.Dispose();liveImage obj.Cop…

點擊跳轉到QQ聊天界面

<!--//需要添加好友驗證--><a href"tencent://message/?uinQQ號碼&Site&Menuyes"><img src"需要點擊的圖片" width"80"/></a><!--不需要添加好友驗證--><a href"tencent://message/?Menuyes&am…

學習React的一知半解

① 初探 HMTL的渲染過程 ? 這個結構化文本就是 HTML 文本&#xff0c; HTML 中的每個元素都對應 DOM中某個節點&#xff0c;這樣&#xff0c;因為 HTML 元素的逐級包含關系&#xff0c; DOM 節點自然就構成了一個樹形結構&#xff0c;稱為 DOM 樹 。 ? 瀏覽器為了渲染 HTML 格…

DataTable 轉為ListT集合

public static List<T> HubbleTableToList<T>(this DataTable dt) where T:Class{List<T> _list new List<T>();if (dt null) return _list;T model;foreach (DataRow dr in dt.Rows)//進行循環dataTable行數據{model Activator.CreateInstance<…

工業相機與鏡頭分辨率匹配

// 轉自 奧普特講述工業相機與鏡頭分辨率匹配的技術方案 隨著機器視覺行業的發展&#xff0c;為了更好的滿足廣大客戶選配合適鏡頭的需求&#xff0c;奧普特自動化科技有限公司為您簡述工業相機如何選配合適的鏡頭&#xff0c;以及在相機與鏡頭的分辨率匹配方面的技術方案。 …

微信分享

<?php /*** Description of WxShare*微信分享* author xinjun*/ namespace Controller\Wx;use Controller\Home\HomeBase; use Model\Wx\UserModel; use Model\Wx\TokenModel; use Framework\Net\Request;class WxShare extends HomeBase {public function __construct(){p…

工業相機的靶面大小

在機器視覺中&#xff0c;工業相機是一種比較重要的配件。而在工業相機中&#xff0c;圖像傳感器又是最最關鍵核心的東西。而圖像傳感器的靶面的大小&#xff0c;往往直接關系到成像的質量。通常來講&#xff0c;圖像的成像質量與像素的大小成正比。這也就意味著&#xff0c;同…

軟件建模——第3章 項目前期

3.1 項目前期的主要工作 3.1.1 現狀分析 1.硬件分析 2.軟件分析 3.1.2 需求收集 3.1.3 粗略設計 1.體系結構設計 2.硬件&#xff08;網絡&#xff09;設計 3.應用系統設計 4.安全設計 5.配套設計 3.1.4 可行性分析 3.2 結構化的項目前期實例 3.2.1 組織分析&#xff08;自動化…

echarts_部分圖表配置_圖表click事件

額。。當然其他事件都是支持的&#xff0c;此文僅以click做簡單介紹&#xff1a; 請點擊“柱子”。。。 官方介紹&#xff1a;http://echarts.baidu.com/tutorial.html#ECharts%20%E4%B8%AD%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%92%8C%E8%A1%8C%E4%B8%BA 1 function bottom_z (thisI…

mysql 5.7.25 的安裝與 安裝錯誤修改 適用于5.7解壓版

1&#xff0c;根據自己的需求去官網下載 2.解壓到自己喜歡的路徑 其中date 和 my.ini 在5.7后面的版本 解壓后是沒有的&#xff0c;需要自己配置。 可以自己創建my.ini文件 &#xff0c;但是不能自己創建date文件夾。 其中my.ini文件的配置如下&#xff08;如果報錯要將目錄文件…

數據結構 最長公共子序列問題

例題: 51nod 1006 解析1:http://blog.csdn.net/yysdsyl/article/details/4226630/ 解析2:http://blog.csdn.net/hrn1216/article/details/51534607 轉載于:https://www.cnblogs.com/wenbo4399/p/8594586.html

解除服務器端口號占用及服務器端口號的修改

這幾天因為面試的原因把SSH的東西重新鞏固下&#xff0c;所以用的服務器是Tomcat。但是因為前一個項目用的服務器是Jboss&#xff0c;項目一期迭代完成&#xff0c;轉交測試組進行測試&#xff0c;提了很多bug&#xff0c;所以當改bug的時候發現我Jboss的服務器可以允許&#x…