摘要:類的使用該類默認的寫操作是覆蓋操作。例如原來的文件內容是,我們將文件指針移向位置,即覆蓋的位置在字符之后,我們寫入個字符文件就變成了。具體思路是將目標文件分塊,每個線程負責寫入一個數據塊。因此,全部線程執行完畢之后,文件的大小是。
RandomAccessFile類的使用
該類默認的寫操作是覆蓋操作。例如原來的文件內容是“abcde”,我們將文件指針移向2位置(seek(2),即覆蓋的位置在b字符之后),我們寫入3個字符:raf.write("xxx".getBytes());文件就變成了"abxxe"。如果我們要將xxx插入到b和c字符之間,默認的RandomAccessFile是無法實現的。
/** * 向文本文件的特定位置插入字符串 */ public static void insertStringToTxtFile(File f,String content,int pos) throws IOException{ RandomAccessFile raf = new RandomAccessFile(f, "rw"); raf.seek(pos); // 暫存插入點后的字符串 byte[] buf = new byte[1024]; int len = 0; StringBuilder sb = new StringBuilder(); while ((len = raf.read(buf)) != -1) { sb.append(new String(buf, 0, len)); } // 此時FP已經移動到了EOF,需要重新回到插入點寫入字符串 raf.seek(pos); raf.write(content.getBytes()); raf.write(sb.toString().getBytes()); raf.close(); }
以上的代碼中最關鍵的代碼是將文件指針之后的內容暫存起來,使用到了StringBuilder容器,讀取的時候采用的是讀取到字節數組(因為一次讀取一行可能會產生換行的問題)。
該類用于隨機讀取文件,利用該類我們可以實現多線程寫文件的操作。具體思路是將目標文件分塊,每個線程負責寫入一個數據塊。例如:
public class WriteFile implements Runnable{ private int block; // 數據塊標號 private File descFile; // 目標文件 private static final int SIZE_PER_BLOCK = 20; // 每個數據塊大小 public WriteFile(int block, File descFile) { super(); this.block = block; this.descFile = descFile; } @Override public void run() { try { RandomAccessFile raf = new RandomAccessFile(descFile, "rw"); raf.seek((block - 1) * SIZE_PER_BLOCK); raf.writeBytes("This is block " + block + " "); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
public class MultipleThreadWrite { static File file = new File("data.txt"); public static void main(String[] args) { for (int i = 1; i < 6; i++) { new Thread(new WriteFile(i, file)).start(); } } }
以上開啟了5個線程向data.txt文件中寫入數據,每個線程負責寫入一個數據塊的數據,我們要寫入的字符串的長度是16個字節,沒有完全占用1個數據塊,但是第二個線程寫入數據的時候將文件指針移動到了20,從20開始寫入,前面的4個字節是沒有數據的。因此,全部線程執行完畢之后,文件的大小是 4 * 20 + 16 = 96bytes。
apache commons IO庫maven依賴如下:
commons-io commons-io 2.4
常用方法如下:
@Test public void testFileUtils() throws Exception{ File file = new File("test.txt"); // 將文本文件讀取為字符串 String str = FileUtils.readFileToString(file, "utf-8"); System.out.println("文本文件內容:" + str); // 文件大小 System.out.println(FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(new File("F:/BaiduYunDownload/OS X Mavericks 10.9 (GM).iso")))); // 向文件中寫入字符串 FileUtils.writeStringToFile(new File("data.txt"), "你好hellodfd#$", "utf-8"); // 遍歷目錄及其子目錄下的所有文件 Iteratoriterator = FileUtils.iterateFilesAndDirs(new File("E:/tmp"), FileFileFilter.FILE, DirectoryFileFilter.DIRECTORY); while (iterator.hasNext()) { System.out.println(iterator.next()); } // 文件拷貝 File destFile = new File("test_copy.txt"); FileUtils.copyFile(file, destFile); // 從URL(必須是file協議,即本地計算機)中得到文件資源 file = FileUtils.toFile(new URL("file:///E:/tmp/%E7%84%A6%E7%82%B9%E5%9B%BE.html")); System.out.println("本地文件:" + file); // 將文件拷貝到指定目錄(目錄不存在,創建之) FileUtils.copyFileToDirectory(file, new File("E:/tmp/demo")); // 拷貝一個目錄(及其文件和子目錄)到另一個目錄 FileUtils.copyDirectoryToDirectory(new File("E:/tmp"), new File("E:/demo")); // 下載遠程資源到本地 FileUtils.copyURLToFile(new URL("http://www.knowsky.com/384261.html"), new File("tmp.html"), 3000, 3000); // 刪除目錄中的內容 FileUtils.deleteDirectory(new File("E:/demo")); // 移動文件(rename) FileUtils.moveFile(new File("test.txt"), new File("ok.txt")); }
commons io參考文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64437.html
摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:的選擇器允許單個線程監視多個輸入通道。一旦執行的線程已經超過讀取代碼中的某個數據片段,該線程就不會在數據中向后移動通常不會。 1、引言 很多初涉網絡編程的程序員,在研究Java NIO(即異步IO)和經典IO(也就是常說的阻塞式IO)的API時,很快就會發現一個問題:我什么時候應該使用經典IO,什么時候應該使用NIO? 在本文中,將嘗試用簡明扼要的文字,闡明Java NIO和經典IO之...
摘要:知識點總結字節流知識點總結字節流在程序中所有的數據都是以流的方式進行傳輸或保存的,程序需要數據時要使用輸入流讀取數據,而當程序需要將一些數據保存起來時,就要使用輸出流。字節流主要操作類型數據,以數組為準,主要操作類是類和類。 Java知識點總結(JavaIO-字節流) @(Java知識點總結)[Java, JavaIO] [toc] 字節流 在程序中所有的數據都是以流的方式進行傳輸或保...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
閱讀 1318·2021-10-27 14:14
閱讀 3574·2021-09-29 09:34
閱讀 2477·2019-08-30 15:44
閱讀 1716·2019-08-29 17:13
閱讀 2569·2019-08-29 13:07
閱讀 867·2019-08-26 18:26
閱讀 3342·2019-08-26 13:44
閱讀 3210·2019-08-26 13:37