」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 隨機存取文件

隨機存取文件

發佈於2024-08-01
瀏覽:789

Java 提供了 RandomAccessFile 類,允許在檔案中的任何位置讀取和寫入資料。到目前為止您使用過的所有流都稱為 只讀只寫 流。這些流稱為順序流。使用順序流開啟的檔案稱為順序存取檔案。順序存取文件的內容無法更新。然而,經常需要修改文件。 Java 提供了 RandomAccessFile 類別來允許在檔案中的任何位置讀取和寫入資料。使用 RandomAccessFile 類別開啟的檔案稱為 隨機存取檔案

RandomAccessFile類別實作了DataInputDataOutput接口,如下圖所示。 DataInput 介面定義了讀取原始型別值和字串的方法(例如,readIntreadDoublereadChar readBooleanreadUTF)和DataOutput 介面定義了寫入原始型別值和字串的方法(例如,writeIntwriteDouble, writeChar, writeBoolean, writeUTF).

Image description

建立RandomAccessFile時,您可以指定兩種模式之一:rrw。模式r表示該流是唯讀的,模式rw表示該流允許讀和寫。例如,以下語句建立一個新流 raf,允許程式讀取和寫入檔案 test.dat:

RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");

如果test.dat已經存在,則創建raf來存取它;如果test.dat不存在,則建立一個名為 test.dat的新文件,並建立raf來存取新文件。 raf.length() 方法傳回任意給定時間 test.dat 中的位元組數。如果將新資料追加到文件中,raf.length() 會增加。

如果不想修改該文件,請使用r模式開啟它。這可以防止無意中修改文件。

隨機存取檔案由位元組序列組成。稱為 檔案指標 的特殊標記位於這些位元組之一。讀取或寫入操作發生在文件指標的位置。開啟檔案時,檔案指標會設定在檔案的開頭。當您向檔案讀取或寫入資料時,檔案指標會向前移動到下一個資料項目。例如,如果使用readInt() 讀取int 值,則JVM 從檔案指標讀取4 位元組,現在檔案指標為比上一個位置提前4字節,如下圖所示。

Image description

對於RandomAccessFile raf,可以使用raf.seek(position)方法將檔案指標移到指定位置。 raf.seek(0) 將其移至文件開頭,raf.seek(raf.length()) 將其移至文件末尾。下面的程式碼示範了 RandomAccessFile.

package demo;
import java.io.*;

public class TestRandomAccessFile {

    public static void main(String[] args) throws IOException {
        try( // Create a random access file
            RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw");
        ) {
            // Clear the file to destroy the old contents if exists
            inout.setLength(0);

            // Write new integers to the file
            for(int i = 0; i 



目前文件長度為800
第一個數字是 0
第二個數字是 1
第十個數字是 9
新的長度是804
第11個數字是555

A RandomAccessFile 是為名為inout.dat 的文件創建的,模式為rw,以允許第8 行中的讀取和寫入操作。

inout.setLength(0) 將長度設定為第 11 行中的 0。這實際上會破壞文件的舊內容。

for循環將200 int值從0199寫入文件第14行和第15行。 &&&]int 值需要4 位元組,從inout.length() 傳回的檔案總長度現在是800(第18 行),如範例輸出所示。

第 21 行呼叫

inout.seek(0) 將檔案指標設定為檔案開頭。 inout.readInt() 讀取第 22 行中的第一個值,並將檔案指標移到下一個數字。第二個數字在第 26 行讀取。

inout.seek(9 * 4)(第 29 行)將文件指標移到第十個數字。 inout.readInt() 讀取第十個數字並將檔案指標移到第 30 行中的第十一個數字。 inout.write(555) 在目前位置寫入新的第十一個數字 (第 33 行)。之前的第十一個數字被銷毀。

inout.seek(inout.length()) 將檔案指標移到檔案結尾(第 36 行)。 inout.writeInt(999)999 寫入檔案(第 37 行)。現在文件的長度增加了 4,因此 inout.length() 返回 804(第 40 行)。

inout.seek(10 * 4) 將檔案指標移到第 43 行中的第十一個數字。新的第十一個數字 555 顯示在第 44 行。

版本聲明 本文轉載於:https://dev.to/paulike/random-access-files-1464?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在java中的多個返回類型:一個誤解介紹,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但是,情況確實如此嗎? 通用方法:拆開神秘 [方法僅具有單一的返回類型。相反,它採用機制,如鑽石符號“ ”。 分解方法簽名: :本節定義了一個通用類型參數,E。它表示該方法接受了擴展foo類...
    程式設計 發佈於2025-02-06
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    [2明確擔心Microsoft Visual C(MSVC)在正確實現兩相模板實例化方面努力努力。該機制的哪些具體方面無法按預期運行? 背景:說明:的初始Syntax檢查在範圍中受到限制。它未能檢查是否存在聲明名稱的存在,導致名稱缺乏正確的聲明時會導致編譯問題。 為了說明這一點,請考慮以下示例:一個...
    程式設計 發佈於2025-02-06
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-02-06
  • 如何將自己的字體帶到我的網站?
    如何將自己的字體帶到我的網站?
    在Web 上擴展字體選項,而Web開發的字體選擇傳統上是有限的,最近的進步引入了創新的解決方案,以增強網站的視覺吸引力。 @font-face在CSS中: http://www.csss.3.info/preview/web-fonts-withs-with-font-font-face/ h...
    程式設計 發佈於2025-02-06
  • 為什麼我的Discord.py.py 2.0 bot命令儘管沒有錯誤?
    為什麼我的Discord.py.py 2.0 bot命令儘管沒有錯誤?
    命令不在discord.py.py 2.0中運行:沒有錯誤,而是在1.7.3 意圖:缺失的鏈接解決方案:啟用消息內容意圖訪問Discord Developer Portal並選擇您的應用程序。 導航到“ bot”部分。 在“權限”選項卡下,找到“消息內容意圖”部分,然後選中框以啟用它。 使用這些...
    程式設計 發佈於2025-02-06
  • JQuery.click()與OnClick:您應該選擇哪個點擊事件處理程序?
    JQuery.click()與OnClick:您應該選擇哪個點擊事件處理程序?
    jquery.click()它遵循使用AddeventListener或attachEvent的W3C DOM事件註冊模型,可確保與其他庫更好地互操作性。 多個事件偵聽器:允許為同一目標註冊多個事件處理程序。在任何DOM元素上都可以使用:可以在任何DOM元素上使用,包括非HTML元素。 覆蓋:...
    程式設計 發佈於2025-02-06
  • 抽像類可以有構造函數嗎?
    抽像類可以有構造函數嗎?
    抽象構造函數通過確保子類遵守某些規則或提供對像初始化所需的最小字段來強制約束。 indialition firtiation of Fields:允許抽像類來初始化共享字段,這些字段是初始化的共享字段,這些字段是初始化的共享字段,這些字段是子類繼承和利用。 Overloading:抽象構造函數...
    程式設計 發佈於2025-02-06
  • 如何從C#中的非UI線程安全地更新UI元素?
    如何從C#中的非UI線程安全地更新UI元素?
    避免跨線程錯誤:安全地從非 UI 線程更新 UI 元素 在從非 UI 線程(例如串口數據接收事件生成的線程)與 UI 元素交互時,必須處理線程安全問題以避免跨線程錯誤。 在C# 代碼中,錯誤“跨線程操作無效:從創建控件'textBox1' 的線程以外的線程訪問控件'tex...
    程式設計 發佈於2025-02-06
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式界面中實現垂直滾動元素的CSS高度限制 考慮一個佈局,其中我們具有與可滾動的映射div一起移動的subollable map div用戶的垂直滾動,同時保持其與固定側邊欄的對齊方式。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 可以限制地圖的滾動,我們可以利用CS...
    程式設計 發佈於2025-02-06
  • 'exec()
    'exec()
    Exec對本地變量的影響: exec function,python staple,用於動態代碼執行的python staple,提出一個有趣的Query:它可以在函數中更新局部變量嗎? python 3 Dialemma 在Python 3中,以下代碼shippet無法更新本地變量,因為人...
    程式設計 發佈於2025-02-06
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    如何為JavaScript對像變量創建動態鍵,嘗試為JavaScript對象創建動態鍵,使用此Syntax jsObj['key' i] = 'example' 1;將不起作用。正確的方法採用方括號:他們維持一個長度屬性,該屬性反映了數字屬性(索引)和一個數字屬性的數量。標準對像沒有模仿這...
    程式設計 發佈於2025-02-06
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    </main> <section> ,但无法使其正常工作,如您所见。任何洞察力都将不胜感激! display:grid; { position:sticky; top:1em; z-index:1 1 ; { { { pos...
    程式設計 發佈於2025-02-06
  • 立即吸引用戶:在您的React Spa中嵌入交互式演示
    立即吸引用戶:在您的React Spa中嵌入交互式演示
    如果圖片值得一千個單詞,那麼一個交互式演示必須值得...一百萬? 您喜歡通過流行語滾動以了解應用程序的目的嗎?可能不是。而且我不在乎為我的最新激情項目Wanna寫所有這些泡沫。因此,我追求了一個更有趣的解決方案:將我的應用程序嵌入其自己的著陸頁中供用戶探索! [2 這個GIF具有263幀,所以我想...
    程式設計 發佈於2025-02-06
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月份)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP...
    程式設計 發佈於2025-02-06
  • 重新切片在Go Slices中的基礎陣列如何表現?
    重新切片在Go Slices中的基礎陣列如何表現?
    在GO中重新切割切片:混淆和澄清在GO中,切片是表示代表數據數組的強大而有效的方法。但是,了解他們的複雜性對於初學者來說可能具有挑戰性。這樣一個方面就是重新切割切片的概念。 考慮以下代碼: int,5) printslice(“ a”,a) B:= make([] int,0,5)...
    程式設計 發佈於2025-02-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3