1. 程式人生 > >使用RandomAccessFile讀寫資料

使用RandomAccessFile讀寫資料

------------siwuxie095

工程名:TestRandomAccessFile

包名:com.siwuxie095.file

類名:MultiWriteFile.java(主類)、WriteFile.java

工程結構目錄如下:

WriteFile.java:

package com.siwuxie095.file;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

//WriteFile繼承自 Thread,作為一個執行緒

//RandomAccessFile

//在寫入時,可以為每一個執行緒指定一個固定的寫入區域,

//這可以用於多執行緒的下載,以及多執行緒的檔案傳輸

//在讀取時,也可以指定RandomAccessFile來讀取檔案中的特定內容

public class WriteFileextends Thread {

//宣告三個本地變數

File file;

int block;

int L=100;

/**

*如:將一個檔案均勻劃分成 5個區域,每一個區域都是一個塊 block

*每個block的長度設為100位元組

*構造方法中傳入的block數值是幾,就從哪個塊開始讀寫

*

* 1         2         3         4         5

* |---------|---------|---------|---------|---------|

* 0xL       1xL       2xL

*

* @param f

* @param b

*/

//先為執行緒建立一個構造方法,傳入兩個引數

//一個是要寫的檔案,另一個是當前執行緒所負責的寫入檔案的區塊

public WriteFile(File f,int b) {

this.file=f;

this.block=b;

}

//在當前類中覆蓋 Thread run()方法,並重寫

@Override

publicvoid run() {

try {

//建立一個 RandomAccessFile 隨機讀寫檔案,並指定操作的檔案物件和操作模式

//操作模式有4種:(一般情況下都使用 rw)

//(1)r只讀

//(2)rw可讀可寫

//(3)rws可讀可寫,還要求對"檔案的內容"或"元資料"的每個更新都同步寫入到基礎儲存裝置

//(4)rwd可讀可寫,還要求對"檔案的內容"的每個更新都同步寫入到基礎儲存裝置

//有異常丟擲,需要用 try catch 捕獲

RandomAccessFile raf=new RandomAccessFile(file,"rw");

//通過隨機讀寫檔案,可以讀取到或寫入到當前檔案的任何一個位置

/*如:一個檔案物件,有頭和尾,中間是檔案內容

*

*如果想從(1)處寫入檔案資料,可以將 RandomAccessFile 的指標移動到(1)處,

*直接開始寫入,以後的資料依次從(1)處向後寫入

*

*如果想從(2)處寫入3個加號,同理,3個加號就出現在(2)

*

*如果想從某個位置讀取資料,同樣要移動檔案的指標到該位置,

*然後開始讀取相應數量的資料

*

*      (1)           (2)

*       |***          |+++

* |------***-----------+++--------------------|

*檔案頭                                                                              檔案尾

*/

//呼叫 RandomAccessFile seek()方法設定檔案的指標

//通過檔案自身的指標,設定讀取或寫入的偏移量,

//然後指標自動向後偏移。

//對於每一個檔案,根據傳入的block值來確定讀寫的位置

//block是從1開始的,但檔案的指標是從0開始的

//使用(block-1)*L

//這樣就將檔案的指標指定到當前執行緒所負責的區域的頭部

raf.seek((block-1)*L);

//呼叫 writeBytes() 方法寫入檔案:傳入字串,會自動

//將字串轉換成位元組寫入到檔案當中

//這裡的 block 雖然是整型,但會自動轉換為String

raf.writeBytes("This is block "+block);

//再輸出20個短橫

for (int i =0; i < 20; i++) {

raf.writeBytes("-");

}

//關閉RandomAccessFile

raf.close();

}catch (FileNotFoundException e) {

e.printStackTrace();

}catch (IOException e) {

e.printStackTrace();

}

}

}

MultiWriteFile.java:

package com.siwuxie095.file;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

public class MultiWriteFile {

//先在主類中建立一個靜態檔案物件,使用相對路徑

static File file=new File("test.txt");

public staticvoid main(String[] args) {

//判斷檔案是否存在

if (file.exists()) {

//如果存在就先將檔案刪除掉,保證每次寫入,當前檔案都是一個新檔案

//不會被之前的檔案版本所影響

//這裡不必擔心當前的執行緒無法向該檔案寫入資料

//因為在 RandomAccessFile 寫入檔案時,檔案不存在,它會自動把檔案創建出來

file.delete();

}

//寫入檔案:

//建立WriteFile,指定不同執行緒寫入不同的區塊,並開啟執行緒

//寫入檔案的順序與執行緒的先後建立順序無關,嚴格按照指定的區塊去寫

new WriteFile(file,5).start();

new WriteFile(file,3).start();

new WriteFile(file,1).start();

new WriteFile(file,4).start();

new WriteFile(file,2).start();

try {

//讀取檔案:

RandomAccessFile raf=new RandomAccessFile(file,"r");

//這裡要讀取第5個區塊,即指標從400開始

raf.seek(400);

//呼叫 read()方法時要傳入一個位元組型的陣列,並指定讀取的長度

byte input[]=newbyte[20];

raf.read(input);

//建立String,傳入位元組型陣列input

String inputString=new String(input);

System.out.println(inputString);

raf.close();

}catch (FileNotFoundException e) {

e.printStackTrace();

}catch (IOException e) {

e.printStackTrace();

}

}

}

執行一覽:

讀取第 5個區塊的 20個位元組:

test.txt 的內容:



test.txt 共 435 位元組:4x100+35

(最後35個位元組即 This is block 5--------------------)

執行後,工程結構目錄一覽:

【made by siwuxie095】

相關推薦

使用RandomAccessFile資料

------------siwuxie095 工程名:TestRandomAccessFile 包名:com.siwuxie095.file 類名:MultiWriteFile.java(

golang 從opentsdb 資料

  package main import ( "bufio" "bytes" "encoding/json" "fmt" "io/ioutil" "log" "net" "net/http" "runtime"

用json資料

''' import json filename='username1.json' try: with open(filename) as f_obj: username=json.load(f_obj) except FileNotFoundError:

Jmeter Redis外掛開發 -- 資料

大神的原文地址 背景 最近一段時間在接觸效能壓測,遇到一個棘手的問題。效能需求在30KQPS,要求進行單介面壓測,介面之間依賴不可避免(下一個介面發壓資料需要使用上一介面的返回),還不能通過做資料的方式準備。只能將上一介面返回的資料,儲存起來,用於下一介面的引數。 在一開始的時候,犯了一

Python使用xlrd和xlwt向Excel資料

一、從Excel讀資料 下圖是我的url.xlsx內容,此處我以讀取B列(即第2列)URL資料為例 import xlrd data = xlrd.open_workbook('C:\\Users\\Administrator\\Desktop\\url.xlsx') #開啟工

tensorflow-資料tf.data(1)

模組:tf.data定義在tensorflow/_api/v1/data/init.py輸入管道的tf.data.Dataset API 模組實驗模組:構建輸入管道的實驗API。類class Dataset:可能是大型的元素集。class FixedLengthRecordDataset: 來自一個或多個二進

tensorflow-資料tf.data(2)

從簡單的、可重用的部分構建複雜的輸入管道。 例如,影象模型的管道可以聚合分散式檔案系統中檔案中的資料,對每個影象應用隨機擾動,並將隨機選擇的影象合併成一批進行訓練。文字模型的管道可能包括從原始文字資料中提取符號,將它們轉換為嵌入查詢表的識別符號,以及將不同長度的序列批處理在一起。 tf.data API使

Linux Kernel 裝置驅動之I2C之client資料API

傳送資料 int i2c_master_send(const struct i2c_client *client, const char *buf, int count) 接收資料 int i2c_master_recv(const struct i2c_client *c

hbase 資料流程----文字簡介

hbase讀取資料流程 0、client發出請求 1、訪問zk 2、zookeeper返回-ROOT-表所在的資訊,返回的是位置資訊 -ROOT-表中儲存了.META表的元資料資訊 .META表儲存了Region的元資料 -ROOT-:只對應一個region,不能切分,通過-ROOT-表可以

Java使用RandomAccessFile檔案

Java RandomAccessFile RandomAccessFile是用來訪問那些儲存資料記錄的檔案的,你就可以用seek( )方法來訪問記錄,並進行讀寫了。這些記錄的大小不必相同;但是其大小和位置必須是可知的。但是該類僅限於操作檔案。 Ra

tensorflow-資料最佳程式碼組合方式

最佳組合程式碼模式為: # Create the graph, etc. init_op = tf.global_variables_initializer() # Create a session for running operations in the Graph. sess = tf.Sessio

[原始碼和文件分享]程式設計實現對硬碟全盤資料進行資料擦除

背景 在 XP 系統下下,我們可以直接呼叫 WirteFile 函式對磁碟寫入資料,但到了 Windows 7 以及 Windows 7 版本以上的系統,就已經開始變得不那麼簡單了。 在 Windows 7 及以上版本中,對檔案系統和儲存堆疊進行的更改,限制對磁碟和卷的直接訪問,但是,在以下

java資料總結

對於資料的讀寫java提供了專門的讀寫流DataInputStream和DataOutputStream形式進行讀寫,可以進行各種基本資料型別和字串以及UTF格式的陣列或者單個元素的讀寫。 ------------------------------------------

在安卓系統中資料

0.安卓儲存空間: 目錄結構在FileExplorer中檢視,可通過Windows/Show View/Others/FileExplorer開啟 內部儲存空間(internal storage):自帶的,必須有的 RAM記憶體:執行記憶體(電腦記憶體) ROM記憶體:儲存空間(電腦

C語言隨機資料檔案(二)

int fseek(FILE * fp, long offset, int fromWhere):設定檔案位置標記,方法引數說明: fp:FILE型別指標,該指標對應的檔案即是檔案位置標記所標記的檔案; offset:偏移量; fromWhere:偏移起始點,其值可以為SEEK_SET、SEEK

C語言隨機資料檔案(一)

void rewind(FILE * fp):將檔案位置標記重新指向檔案開頭,該函式沒有返回值; 【例子】計算機D盤根目錄有一個存放學生資訊的stud.dat檔案,請先講檔案資訊顯示在控制檯,然後在將資料複製到F盤stud.dat檔案中。 #include <stdio.h> #

如何往伺服器中資料

本次專案,我用apache-tomcat將自己的計算機弄成了一個小伺服器,然後對裡面的jsp型別的檔案進行讀寫。 首先,如何弄伺服器呢?工程檔案:點選開啟連結 1.下載一個apache-tomcat,這裡我給大家提供一個apache-tomcat-6.0.37的下載地址:點

RandomAccessFile檔案字元

我本來寫了個可以存入資訊的地址簿,使用RandomAccessFile類來隨機讀寫.當然可以使用GUI檢視.反正說也說不清了.我就直接說下下面的一個測試程式來說明我的問題: Java code ? 1 2 3 4 5 6 7 8 9 10 11

RandomAccessFile 檔案內容,去除亂碼

一、開發過程中遇到問題: (1)檔案內容只能等長替換,如果檔案內容少了就會亂行。 解決辦法:我主要是進行xml檔案內容解析的,用新增隨機字串的方式進行了解決,這樣既不影響檔案內容解析,也把問題解決了。 二、程式碼: public class FileUtils {

stm32 備份暫存器 資料

1. 首先 檢查RTC電池是否裝載,沒電池的話,裝置掉電也儲存不了資料。  備份暫存器就是普通的RAM,需要配合外接電池使用,如果沒有電池,就不能掉電保持資料。 因為是普通RAM,所以不存在寫入次數的問題,理論上是無限次的。 其次在RCC_Configuration();