摘要:類的使用該類默認(rèn)的寫操作是覆蓋操作。例如原來(lái)的文件內(nèi)容是,我們將文件指針移向位置,即覆蓋的位置在字符之后,我們寫入個(gè)字符文件就變成了。具體思路是將目標(biāo)文件分塊,每個(gè)線程負(fù)責(zé)寫入一個(gè)數(shù)據(jù)塊。因此,全部線程執(zhí)行完畢之后,文件的大小是。
RandomAccessFile類的使用
該類默認(rèn)的寫操作是覆蓋操作。例如原來(lái)的文件內(nèi)容是“abcde”,我們將文件指針移向2位置(seek(2),即覆蓋的位置在b字符之后),我們寫入3個(gè)字符:raf.write("xxx".getBytes());文件就變成了"abxxe"。如果我們要將xxx插入到b和c字符之間,默認(rèn)的RandomAccessFile是無(wú)法實(shí)現(xiàn)的。
/** * 向文本文件的特定位置插入字符串 */ public static void insertStringToTxtFile(File f,String content,int pos) throws IOException{ RandomAccessFile raf = new RandomAccessFile(f, "rw"); raf.seek(pos); // 暫存插入點(diǎn)后的字符串 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)); } // 此時(shí)FP已經(jīng)移動(dòng)到了EOF,需要重新回到插入點(diǎn)寫入字符串 raf.seek(pos); raf.write(content.getBytes()); raf.write(sb.toString().getBytes()); raf.close(); }
以上的代碼中最關(guān)鍵的代碼是將文件指針之后的內(nèi)容暫存起來(lái),使用到了StringBuilder容器,讀取的時(shí)候采用的是讀取到字節(jié)數(shù)組(因?yàn)橐淮巫x取一行可能會(huì)產(chǎn)生換行的問(wèn)題)。
該類用于隨機(jī)讀取文件,利用該類我們可以實(shí)現(xiàn)多線程寫文件的操作。具體思路是將目標(biāo)文件分塊,每個(gè)線程負(fù)責(zé)寫入一個(gè)數(shù)據(jù)塊。例如:
public class WriteFile implements Runnable{ private int block; // 數(shù)據(jù)塊標(biāo)號(hào) private File descFile; // 目標(biāo)文件 private static final int SIZE_PER_BLOCK = 20; // 每個(gè)數(shù)據(jù)塊大小 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個(gè)線程向data.txt文件中寫入數(shù)據(jù),每個(gè)線程負(fù)責(zé)寫入一個(gè)數(shù)據(jù)塊的數(shù)據(jù),我們要寫入的字符串的長(zhǎng)度是16個(gè)字節(jié),沒(méi)有完全占用1個(gè)數(shù)據(jù)塊,但是第二個(gè)線程寫入數(shù)據(jù)的時(shí)候?qū)⑽募羔樢苿?dòng)到了20,從20開始寫入,前面的4個(gè)字節(jié)是沒(méi)有數(shù)據(jù)的。因此,全部線程執(zhí)行完畢之后,文件的大小是 4 * 20 + 16 = 96bytes。
apache commons IO庫(kù)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("文本文件內(nèi)容:" + 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協(xié)議,即本地計(jì)算機(jī))中得到文件資源 file = FileUtils.toFile(new URL("file:///E:/tmp/%E7%84%A6%E7%82%B9%E5%9B%BE.html")); System.out.println("本地文件:" + file); // 將文件拷貝到指定目錄(目錄不存在,創(chuàng)建之) FileUtils.copyFileToDirectory(file, new File("E:/tmp/demo")); // 拷貝一個(gè)目錄(及其文件和子目錄)到另一個(gè)目錄 FileUtils.copyDirectoryToDirectory(new File("E:/tmp"), new File("E:/demo")); // 下載遠(yuǎn)程資源到本地 FileUtils.copyURLToFile(new URL("http://www.knowsky.com/384261.html"), new File("tmp.html"), 3000, 3000); // 刪除目錄中的內(nèi)容 FileUtils.deleteDirectory(new File("E:/demo")); // 移動(dòng)文件(rename) FileUtils.moveFile(new File("test.txt"), new File("ok.txt")); }
commons io參考文檔
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64437.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄业哪繕?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:的選擇器允許單個(gè)線程監(jiān)視多個(gè)輸入通道。一旦執(zhí)行的線程已經(jīng)超過(guò)讀取代碼中的某個(gè)數(shù)據(jù)片段,該線程就不會(huì)在數(shù)據(jù)中向后移動(dòng)通常不會(huì)。 1、引言 很多初涉網(wǎng)絡(luò)編程的程序員,在研究Java NIO(即異步IO)和經(jīng)典IO(也就是常說(shuō)的阻塞式IO)的API時(shí),很快就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題:我什么時(shí)候應(yīng)該使用經(jīng)典IO,什么時(shí)候應(yīng)該使用NIO? 在本文中,將嘗試用簡(jiǎn)明扼要的文字,闡明Java NIO和經(jīng)典IO之...
摘要:知識(shí)點(diǎn)總結(jié)字節(jié)流知識(shí)點(diǎn)總結(jié)字節(jié)流在程序中所有的數(shù)據(jù)都是以流的方式進(jìn)行傳輸或保存的,程序需要數(shù)據(jù)時(shí)要使用輸入流讀取數(shù)據(jù),而當(dāng)程序需要將一些數(shù)據(jù)保存起來(lái)時(shí),就要使用輸出流。字節(jié)流主要操作類型數(shù)據(jù),以數(shù)組為準(zhǔn),主要操作類是類和類。 Java知識(shí)點(diǎn)總結(jié)(JavaIO-字節(jié)流) @(Java知識(shí)點(diǎn)總結(jié))[Java, JavaIO] [toc] 字節(jié)流 在程序中所有的數(shù)據(jù)都是以流的方式進(jìn)行傳輸或保...
摘要:入門,第一個(gè)這是一門很新的語(yǔ)言,年前后正式公布,算起來(lái)是比較年輕的編程語(yǔ)言了,更重要的是它是面向程序員的函數(shù)式編程語(yǔ)言,它的代碼運(yùn)行在之上。它通過(guò)編輯類工具,帶來(lái)了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語(yǔ)言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來(lái)了,總結(jié)過(guò)去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個(gè)這是一門很新的語(yǔ)言,年前后正式公布,算起來(lái)是比較年輕的編程語(yǔ)言了,更重要的是它是面向程序員的函數(shù)式編程語(yǔ)言,它的代碼運(yùn)行在之上。它通過(guò)編輯類工具,帶來(lái)了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語(yǔ)言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來(lái)了,總結(jié)過(guò)去的 2017,相信小伙們一定有很多收獲...
閱讀 1327·2021-10-27 14:14
閱讀 3581·2021-09-29 09:34
閱讀 2486·2019-08-30 15:44
閱讀 1732·2019-08-29 17:13
閱讀 2577·2019-08-29 13:07
閱讀 877·2019-08-26 18:26
閱讀 3350·2019-08-26 13:44
閱讀 3215·2019-08-26 13:37