Java多種寫文件方式

寫文件在開發(fā)小工具時常用到魔招,比如爬取某些網(wǎng)站的信息五辽,數(shù)據(jù)量不是很大杆逗,保存到本地即可。當(dāng)然如果會一些額外的技能蠕蚜,比如多線程悔橄,網(wǎng)絡(luò)之類的腺毫,小工具會更加有意思拴曲。

這里看下Java不同的寫文件方式:

  • BufferedWriter
  • PrintWriter
  • FileOutputStream
  • DataOutputStream
  • RandomAccessFile
  • FileChannel
  • Files

BufferedWriter

把類中定義的方法信息凛忿,寫入文件

    static String fileName = "/Users/aihe/tmp/writeFileDemo.txt";
    static void writeFileWithBufferedWriter() throws IOException {
        Method[] methods = WriteFileDemo.class.getDeclaredMethods();
        String str = Arrays.toString(methods);
        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        writer.write(str);
        writer.close();
    }
image-20190326081928256

追加信息到已經(jīng)存在的文件:

    static void appendFileWithBufferedWriter() throws IOException {
        // FileWriter的第二個參數(shù)代表是否追加
        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName,true));
        writer.append("追加信息");
        writer.close();
    }
image-20190326082146211

PrintWriter

PrintWriter可以輸出格式化的信息到文件中店溢。

    static void writingFileWithPrintWriter()
            throws IOException {
        Method[] methods = WriteFileDemo.class.getDeclaredMethods();
        String str = Arrays.toString(methods);
        // 可以使用FileWriter,BufferedWriter
        FileWriter fileWriter = new FileWriter(fileName);
        PrintWriter printWriter = new PrintWriter(fileWriter);
        printWriter.printf("當(dāng)前類的方法信息: %s \n方法的個數(shù):%d \n", str, methods.length);
        printWriter.close();
    }
image-20190326082536781

FileOutputStream

用來寫入二進制數(shù)據(jù)到文件中床牧,需要將String轉(zhuǎn)換為bytes戈咳。

    static void writingFileWithFileOutputStream()
            throws IOException {
        Method[] methods = WriteFileDemo.class.getDeclaredMethods();
        String str = Arrays.toString(methods);

        FileOutputStream outputStream = new FileOutputStream(fileName);
        // 需要將String轉(zhuǎn)換為bytes
        byte[] strToBytes = str.getBytes();
        outputStream.write(strToBytes);

        outputStream.close();
    }
image-20190326083040667

DataOutputStream

寫法如上

   static void writingFileWithDataOutputStream()
            throws IOException {
        Method[] methods = WriteFileDemo.class.getDeclaredMethods();
        String str = Arrays.toString(methods);

        FileOutputStream fos = new FileOutputStream(fileName);
        DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
        outStream.writeUTF(str);
        outStream.close();

        // verify the results
        String result;
        FileInputStream fis = new FileInputStream(fileName);
        DataInputStream reader = new DataInputStream(fis);
        result = reader.readUTF();
        reader.close();

        System.out.println(result.equals(str));
    }

RandomAccessFile

想要寫入或者編輯一個已經(jīng)存在的文件著蛙,而不是寫入一個全新的文件或者單純的追加,那么我們可以使用RandomAccessFile猎唁。這個類可以讓我們寫入特定的位置顷蟆,如下:

寫入中文的時候使用writeUTF方法,不然可能會亂碼

    static void writeToPositionWithRAF(String filename, long position)
            throws IOException {
        RandomAccessFile writer = new RandomAccessFile(filename, "rw");
        writer.seek(position);
        //寫入中文的時候防止亂碼
        writer.writeUTF("新內(nèi)容");
        writer.close();
    }
image-20190326084711766

FileChannel

在處理大文件的時候,F(xiàn)ileChannel會比標(biāo)準(zhǔn)的io更快削樊。

static void writeWithFileChannel() throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();

    String value = WriteFileDemo.class.getSimpleName();
    byte[] strBytes = value.getBytes();
    ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
    buffer.put(strBytes);
    buffer.flip();
    channel.write(buffer);

    stream.close();
    channel.close();

}
image-20190326085329071

Files

Files是Java7引入的工具類豁生,通過它,我們可以創(chuàng)建嫉父,移動沛硅,刪除眼刃,復(fù)制文件绕辖。目錄也是一種特殊的文件,對目錄也適用擂红。當(dāng)然也可以用于讀寫文件


    static void writeWithFiles()
            throws IOException {
        String str = "Hello";

        Path path = Paths.get(fileName);
        byte[] strToBytes = str.getBytes();

        Files.write(path, strToBytes);

        String read = Files.readAllLines(path).get(0);

        System.out.println(str.equals(read));
    }
image-20190326085644551

最后

操作文件的時候記得要關(guān)閉文件流仪际,也可以使用java7的try-with-resource語法围小。

  • BufferedWriter 提供高效的讀寫字符树碱,字符串肯适,數(shù)組。

  • PrintWriter 寫入格式化文字

  • FileOutputStream 寫入二進制流

  • DataOutputStream 寫primary類型

  • RandomAccessFile 隨機讀寫文件成榜,在指定的位置編輯文件

  • FileChannel 寫入大文件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末框舔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赎婚,更是在濱河造成了極大的恐慌刘绣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挣输,死亡現(xiàn)場離奇詭異纬凤,居然都是意外死亡,警方通過查閱死者的電腦和手機撩嚼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門停士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人完丽,你說我怎么就攤上這事恋技。” “怎么了逻族?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵猖任,是天一觀的道長。 經(jīng)常有香客問我瓷耙,道長朱躺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任搁痛,我火速辦了婚禮长搀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸡典。我一直安慰自己源请,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布彻况。 她就那樣靜靜地躺著谁尸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纽甘。 梳的紋絲不亂的頭發(fā)上良蛮,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音悍赢,去河邊找鬼决瞳。 笑死货徙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皮胡。 我是一名探鬼主播痴颊,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屡贺!你這毒婦竟也來了蠢棱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤甩栈,失蹤者是張志新(化名)和其女友劉穎裳扯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谤职,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡饰豺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了允蜈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冤吨。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饶套,靈堂內(nèi)的尸體忽然破棺而出漩蟆,到底是詐尸還是另有隱情,我是刑警寧澤妓蛮,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布怠李,位于F島的核電站,受9級特大地震影響蛤克,放射性物質(zhì)發(fā)生泄漏捺癞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一构挤、第九天 我趴在偏房一處隱蔽的房頂上張望髓介。 院中可真熱鬧,春花似錦筋现、人聲如沸唐础。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽一膨。三九已至,卻和暖如春洒沦,著一層夾襖步出監(jiān)牢的瞬間豹绪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工微谓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留森篷,地道東北人输钩。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓豺型,卻偏偏與公主長得像仲智,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姻氨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一钓辆、基礎(chǔ)知識:1、JVM肴焊、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,369評論 0 4
  • 本文內(nèi)容非原創(chuàng)前联,你可以點擊此處查看內(nèi)容來源聲明 輸入/輸出流 在Java API中,可以從其中讀出一個字節(jié)序列的對...
    _gitignore閱讀 2,545評論 0 0
  • 創(chuàng)建一個好的輸入/輸出(I/O)系統(tǒng)是一項艱難的任務(wù)娶眷。挑戰(zhàn)似乎來自于要涵蓋所有的可能性似嗤。不僅存在各種I/O源端和想...
    王偵閱讀 1,151評論 0 2
  • 五、IO流 1届宠、IO流概述 (1)用來處理設(shè)備(硬盤烁落,控制臺,內(nèi)存)間的數(shù)據(jù)豌注。(2)java中對數(shù)據(jù)的操作都是通過...
    佘大將軍閱讀 505評論 0 0
  • 是什么讓自己的情緒如此的波動 每每看到她那讓人惡心的嘴臉 我就沒有辦法控制住自己的情緒 像瘋狗一般 見人就撲 撲上...
    做自己的女皇閱讀 270評論 0 0