2019-08-14 Day14 Java文件的寫入與輸出


目的

學(xué)習(xí)操作Java文件漫玄,實(shí)現(xiàn)對其寫入與輸出數(shù)據(jù)坦冠,掌握其相關(guān)操作


File文件操作

文件操作無外乎就是讀和寫算吩,但是這里面的方法方式又有很多種。主要是從文件格式岁钓,文件的存儲介質(zhì)方面來看的升略。文件是一種持久存儲的方式,要查找一個文件甜紫,就要找到其相對應(yīng)的路徑降宅,而路徑又分為相對路徑和絕對路徑,絕對路徑就是指文件的完整路徑囚霸,相對路徑是部分路徑(當(dāng)前路徑下的子路徑)

Java文件的寫入與輸出腰根,可以用流這個概念來表示;而流的方向是參考自己的內(nèi)存空間拓型,輸出流是從內(nèi)存空間將數(shù)據(jù)寫到外部設(shè)備(磁盤\硬盤\光盤)额嘿,而輸入流是將外部數(shù)據(jù)寫到內(nèi)存中;其實(shí)流也是統(tǒng)一管理數(shù)據(jù)的寫入和讀取劣挫,輸出流是開發(fā)者只需要將內(nèi)存里面的數(shù)據(jù)寫到流里面册养,而輸入流是從流里面讀取數(shù)據(jù)

而流也分為兩種——字符流和字節(jié)流

字節(jié)流,顧名思義压固,是以字節(jié)為單位進(jìn)行IO操作球拦;而它最大的兩個父類是InputStream和OutputStream,這兩者都是抽象類帐我,需要通過多態(tài)坎炼,初始化具體實(shí)現(xiàn)的子類來進(jìn)行讀寫操作;實(shí)際操作的子類為
FileOutputStream/FileInputStream
ObjectOutputStream/ObjectInputStream

字符流拦键,顧名思義谣光,是以字符為單位進(jìn)行IO操作的,而一個字符為兩個字節(jié)芬为;其最大的兩個父類為Writer和Reader這兩個抽象類萄金,多通過FileWriter/FileReader這兩個具體實(shí)現(xiàn)的子類來進(jìn)行操作

如果是音頻蟀悦、圖片、歌曲氧敢,就使用字節(jié)流日戈;如果是文本的,使用字符流

注意:I/O對象不屬于對象福稳,需要自己關(guān)閉

1.png

具體操作

創(chuàng)建文件

        // 創(chuàng)建文件 完整路徑
        String path = "E:/JavaCourse/day1/src/main/java/day9";
        // path/1.txt
        File file = new File(path.concat("/1.txt"));

        //判斷是否存在
        if (file.exists() == false){
            //不存在就創(chuàng)建
            file.createNewFile();
        }

向文件中寫入字節(jié)流

// 向文件寫入數(shù)據(jù)
        // 1.創(chuàng)建文件輸出對象
        FileOutputStream fos = new FileOutputStream(file);

        // 2.調(diào)用write方法寫入
        byte[] text = {'1','2','3','4'};
        fos.write(text);

        // 3.操作完畢需要關(guān)閉stream對象
        fos.close();

讀取字節(jié)流

        //讀取內(nèi)容
        FileInputStream fis = new FileInputStream(file);

        byte[] name = new byte[12];
        int count  = fis.read(name);

        fis.close();

        System.out.println(count+" "+new String(name));

向文件中寫入字符流

        // 向文件寫入數(shù)據(jù)-字符流
        FileWriter fw = new FileWriter(file);

        char[] name = {'安','卓','開','發(fā)'};
        fw.write(name);

        fw.close();

讀取字符流

        FileReader fr = new FileReader(file);

        char[] book = new char[4];
        count = fr.read(book);

        fr.close();
        System.out.println(count+""+new String(book));

文件中保存對象

向文件里面存一個對象涎拉,保存對象必須實(shí)現(xiàn)序列化即Serializable接口;如果對象內(nèi)部還有屬性變量是其他類的對象的圆,這個類也必須實(shí)現(xiàn)接口

import java.io.Serializable;

public class Person implements Serializable {
    public String name;
    public int age;

    public Dog dog;
}

class Dog implements Serializable{
    public String name;
}
        Dog wc = new Dog();
        wc.name = "旺財";
        Person xw = new Person();
        xw.name = "小王";
        xw.age = 20;
        xw.dog = wc;

        OutputStream os = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(xw);

        oos.close();

從文件中讀取對象

        // 從文件里面讀取一個對象
        InputStream is = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(is);
        Person xw = (Person) ois.readObject();

        ois.close();

        System.out.println(xw.name+" "+xw.age+" "+xw.dog.name);

將一個文件拷貝到另一個位置

// 1.源文件的路徑
        String sourcePath = "C:\\Users\\管理員\\Desktop\\1.png";

        // 2.目標(biāo)文件的路徑
        String desPath = "E:\\JavaCourse\\day1\\src\\main\\java\\day9\\1.png";

        // 3.圖片鼓拧、視頻、音頻 字節(jié)
        FileInputStream fis = new FileInputStream(sourcePath);
        FileOutputStream fos = new FileOutputStream(desPath);

        byte[] in = new byte[1024];

        while(true) {
            int count = fis.read(in);
            if (count != -1){
                // 讀取到內(nèi)容了
                // 將這一次讀取的內(nèi)容寫入目標(biāo)文件
                fos.write(in,0,count);
            }else{
                break;
            }
        }

        fis.close();
        fos.close();

使用BufferedInputStream和BufferedOutputStream提高讀寫的速度

long start = System.currentTimeMillis();

        String sourcePath = "C:\\Users\\管理員\\Desktop\\1.png";
        String desPath = "E:\\JavaCourse\\day1\\src\\main\\java\\day9\\1.png";

        // 輸入流
        InputStream is = new FileInputStream(sourcePath);
        BufferedInputStream bis = new BufferedInputStream(is);

        // 輸出流
        OutputStream os = new FileOutputStream(desPath);
        BufferedOutputStream bos = new BufferedOutputStream(os);

        byte[] in = new byte[1024];
        int count = 0;
        while ((count = bis.read(in)) != -1){
            bos.write(in,0,count);
        }

        bis.close();
        bos.close();

        long end = System.currentTimeMillis();

        System.out.println(end - start);

密碼解鎖demo

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOperation {
    //文件的路徑
    public static final String PATH = "E:\\JavaCourse\\day1\\src\\main\\java\\Secert\\pas.txt";

    //保存密碼
    String password;

    //單例
    public static final FileOperation instance = new FileOperation();

    //私有化構(gòu)造方法
    private FileOperation(){
        try {
            load();
        }catch (IOException e){
            System.out.println("io異常");
        }
    }

    //加載密碼
    public void load() throws IOException {
        FileInputStream fis = new FileInputStream(PATH);

        byte[] pwd = new byte[4];

        int count = fis.read(pwd);

        if (count == -1){
            password = null;
        }else{
            password = new String(pwd);
        }

        fis.close();
    }

    //將密碼保存到文件中
    public void save(String password){
        try {
            FileOutputStream fos = new FileOutputStream(PATH);
            fos.write(password.getBytes());
            fos.close();
        }catch (IOException e){
            System.out.println("io異常");
        }

    }
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Secert {
    public static void main(String[] args) throws IOException {
        boolean logined = false;

        // 判斷是否登錄
        String password = FileOperation.instance.password;
        if (password.length() > 0){
            logined = true;
        }

        //提示用戶操作
        String alert;
        if (logined){
            alert = "請輸入密碼:";
        }else{
            alert = "請?jiān)O(shè)置密碼:";
        }
        System.out.println(alert);

        String firt = null;
        int wrongTime = 3;
        while (wrongTime > 0) {
            //接收用戶輸入
            Scanner scanner = new Scanner(System.in);
            String inputPassword = scanner.next();

            //判斷操作
            if (logined) {
                //已經(jīng)登陸過 直接比較
                if (password.equals(inputPassword)) {
                    System.out.println("解鎖成功");
                    break;
                } else {
                    System.out.println("解鎖失敗");
                    wrongTime--;
                }
            }else{
                //沒有登錄過 設(shè)置密碼
                //判斷是設(shè)置密碼的第一次還是第二次
                if (firt == null){
                    //第一次 保存第一次輸入的密碼
                    firt = inputPassword;
                    System.out.println("請確認(rèn)密碼:");
                }else{
                    //第二次 比較兩次輸入的密碼是否相同
                    if (firt.equals(inputPassword)){
                        System.out.println("設(shè)置密碼成功");
                        //保存設(shè)置的密碼
                        FileOperation.instance.save(firt);
                        break;
                    }else{
                        System.out.println("密碼不一致");
                        firt = null;
                        wrongTime--;
                    }
                }
            }
            scanner.nextLine();
        }
    }
}

心得體會

對于新學(xué)習(xí)的東西越妈,還是十分不熟悉季俩,要多謝謝,才能熟練掌握

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梅掠,一起剝皮案震驚了整個濱河市酌住,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阎抒,老刑警劉巖酪我,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異且叁,居然都是意外死亡都哭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門逞带,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺矫,“玉大人,你說我怎么就攤上這事展氓∧屡浚” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵遇汞,是天一觀的道長未妹。 經(jīng)常有香客問我,道長空入,這世上最難降的妖魔是什么教寂? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮执庐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘导梆。我一直安慰自己轨淌,他們只是感情好迂烁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著递鹉,像睡著了一般盟步。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躏结,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天却盘,我揣著相機(jī)與錄音,去河邊找鬼媳拴。 笑死黄橘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屈溉。 我是一名探鬼主播塞关,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼子巾!你這毒婦竟也來了帆赢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤线梗,失蹤者是張志新(化名)和其女友劉穎椰于,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仪搔,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘾婿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僻造。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憋他。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖髓削,靈堂內(nèi)的尸體忽然破棺而出竹挡,到底是詐尸還是另有隱情,我是刑警寧澤立膛,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布揪罕,位于F島的核電站,受9級特大地震影響宝泵,放射性物質(zhì)發(fā)生泄漏好啰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一儿奶、第九天 我趴在偏房一處隱蔽的房頂上張望框往。 院中可真熱鬧,春花似錦闯捎、人聲如沸椰弊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉版。三九已至贤重,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間清焕,已是汗流浹背并蝗。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秸妥,地道東北人滚停。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像筛峭,于是被迫代替她去往敵國和親铐刘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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

  • 一影晓、基礎(chǔ)知識:1镰吵、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,378評論 0 4
  • 五挂签、IO流 1疤祭、IO流概述 (1)用來處理設(shè)備(硬盤,控制臺饵婆,內(nèi)存)間的數(shù)據(jù)勺馆。(2)java中對數(shù)據(jù)的操作都是通過...
    佘大將軍閱讀 508評論 0 0
  • 1、IO流 1.1侨核、概述 之前學(xué)習(xí)的File類它只能操作文件或文件夾草穆,并不能去操作文件中的數(shù)據(jù)。真正保存數(shù)據(jù)的是文...
    Villain丶Cc閱讀 2,670評論 0 5
  • 本文內(nèi)容非原創(chuàng)搓译,你可以點(diǎn)擊此處查看內(nèi)容來源聲明 輸入/輸出流 在Java API中悲柱,可以從其中讀出一個字節(jié)序列的對...
    _gitignore閱讀 2,560評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32