JAVA-(文件I/O操作、密码解锁小demo)


心得体会

  • 如果有山的话,就有条越过它的路^^

今日所学

1.文件的相关操作

  • 1.如何创建文件
  • 2.I/O流
  • 3.文件中写入和读取字节流
  • 4.文件中写入和读取字符流
  • 5.文件中保存对象
  • 6.从文件中读取对象
  • 7.将一个文件copy到另外一个

2.密码解锁小demo


具体操作

文件的相关操作

  • 如何创建文件
                     //所要创建的文件的完全路径
       String path = "F:/JAVA/DAY12/Day1/src/main/java/Day8/JAVA";
        File file = new File(path.concat("/1.txt"));//1.txt是所要创建的文件名
        //判断所要创建的文件是否存在
        if (file.exists() == false) {
            //不存在就创建
            file.createNewFile();
        }
  • 2.I/O流
1.流的定义
  • 流:统一管理数据的写入和读取
2.I/O流的定义
  • I/O流:即输入/输出流
  • 输出流:从内存空间将数据写到外部设备(磁盘/硬盘/光盘)
  • 输入流:将外部数据写到内存中 ,把字符串写到文件里面输出
3.I/O流的性质
  • I/O流的方向:参考系是内存空间,从文件里面读取数据是输入,将数据写到文件里面是输出
  • 开发者只需要将内存里面的数据写到流里面或者从流里面读取数据
  • I/O流对象不属于内存对象 ,需要自己关闭
4.字符流和字节流
  • 字节流:传输过程中,传输数据的最基本单位是字节的流。
  • 字符流:传输过程中,传输数据的最基本单位是字符的流。
5.字节输入流和字符输入流
  • 字节输出流:InputStream、FileInputStream、BufferedInputStream

1.InputStream是字节输入流的抽象基类 ,InputStream作为基类,给它的基类定义了几个通用的函数:

  • read(byte[] b):从流中读取b的长度个字节的数据存储到b中,返回结果是读取的字节个数(当再次读时,如果返回-1说明到了结尾,没有了数据)
  • read(byte[] b, int off, int len):从流中从off的位置开始读取len个字节的数据存储到b中,返回结果是实际读取到的字节个数(当再次读时,如果返回-1说明到了结尾,没有了数据)
  • close():关闭流,释放资源。

2.FileInputStream主要用来操作文件输入流,它除了可以使用基类定义的函数外,它还实现了基类的read()函数(无参的):

  • read():从流中读取1个字节的数据,返回结果是一个int,(如果编码是以一个字节一个字符的,可以尝试转成char,用来查看数据)。

3.BufferedInputStream:带有缓冲的意思,普通的读是从硬盘里面读,而带有缓冲区之后,BufferedInputStream已经提前将数据封装到内存中,内存中操作数据要,所以它的效率要要非缓冲的要。它除了可以使用基类定义的函数外,它还实现了基类的read()函数(无参的):

  • read():从流中读取1个字节的数据,返回结果是一个int,(如果编码是以一个字节一个字符的,可以尝试转成char,用来查看数据)。
  • 字节输入流
    常用的字节输出流主要有:OutputStream、 FileOutputStream、
    BufferedOutputStream

1.OutputStream: OutputStream是字节输出流的基类,OutputStream作为基类,给它的基类定义了几个通用的函数:

  • write(byte[] b):将b的长度个字节数据写到输出流中。
    write(byte[] b,int off,int len):从b的off位置开始,获取len个字节数据,写到输出流中。
  • flush():刷新输出流,把数据马上写到输出流中。
  • close():关闭流,释放系统资源。

2.FileOutputStream是用于写文件的输出流,它除了可以使用基类定义的函数外,还实现了OutputStream的抽象函数write(int b):

  • write(int b):将b转成一个字节数据,写到输出流中。

3.BufferedOutputStream像BufferedInputStream一样,都可以提高效率。它除了可以使用基类定义的函数外,它还实现了OutputStream的抽象函数write(int b):

  • write(int b):将b转成一个字节数据,写到输出流中。
  • 字符输入流
    常见的字符输入流有:Reader、InputStreamReader、FileReader、BufferedReader

1.Reader是字符输入流的抽象基类 ,它定义了以下几个函数:
read() :读取单个字符,返回结果是一个int,需要转成char;到达流的末尾时,返回-1

  • read(char[] cbuf):读取cbuf的长度个字符到cbuf这种,返回结果是读取的字符数,到达流的末尾时,返回-1
  • close():关闭流,释放占用的系统资源。

2.InputStreamReader 可以把InputStream中的字节数据流根据字符编码方式转成字符数据流。它除了可以使用基类定义的函数,它自己还实现了以下函数:

  • read(char[] cbuf, int offset, int length):从offset位置开始,读取length个字符到cbuf中,返回结果是实际读取的字符数,到达流的末尾时,返回-1

3.FileReader 可以把FileInputStream中的字节数据转成根据字符编码方式转成字符数据流。

4.BufferedReader可以把字符输入流进行封装,将数据进行缓冲,提高读取效率。它除了可以使用基类定义的函数,它自己还实现了以下函数:

  • read(char[] cbuf, int offset, int length)从offset位置开始,读取length个字符到cbuf中,返回结果是实际读取的字符数,到达流的末尾时,返回-1
  • readLine():读取一个文本行,以行结束符作为末尾,返回结果是读取的字符串。如果已到达流末尾,则返回 null
  • 字符输出流
    常见的字符输入流有:Writer、OutputStreamWriter、FileWriter、BufferedWriter
  • write(char[] cbuf):往输出流写入一个字符数组。
  • write(int c) :往输出流写入一个字符。
  • write(String str) :往输出流写入一串字符串。
  • write(String str, int off, int len) :往输出流写入字符串的一部分。
  • close() :关闭流,释放资源。 【这个还是抽象的,写出来是说明有这个关闭功能】
  • flush():刷新输出流,把数据马上写到输出流中。 【这个还是抽象的,写出来是说明有这个关闭功能】

2.OutputStreamWriter可以使我们直接往流中写字符串数据,它里面会帮我们根据字符编码方式来把字符数据转成字节数据再写给输出流,它相当于一个中介桥梁。

3.FileWriter与OutputStreamWriter功能类似,我们可以直接往流中写字符串数据,FileWriter内部会根据字符编码方式来把字符数据转成字节数据再写给输出流。

4.BufferedWriter比FileWriter还高级一点,它利用了缓冲区来提高写的效率。它还多出了一个函数:

  • newLine():写入一个换行符。

OutputStream和InputStream都是抽象类 不能直接使用

  • 4.文件中写入和读取字符流
  //向文件写入数据-字节流
        //1.创建文件输出流对象
        FileOutputStream fos=new FileOutputStream(file);

        //2.调用write方法写入
        byte[] text={'1','2','3','4'};//创建一个字节数组
        fos.write(text);
        //3.操作挖完毕需要关闭Stream对象
        fos.close();

       //读取内容
        FileInputStream fis=new FileInputStream(file);
        byte[] name=new byte[12];//12个字节
        int count=fis.read(name);
        fis.close();
        System.out.println(count+"  "+new String(name));//打印name,是地址
image.png
  • 4.文件中写入和读取字符流
        FileWriter fw=new FileWriter(file);
        char[] name={'安','卓','开','发'};
        fw.write(name);
        fw.close();//说明 是从头开始写的
image.png
       FileReader fr=new FileReader(file);
        char[] book=new char[4];//4个字符
        int count=fr.read(book);
        fr.close();
        System.out.println(count+"  "+new String(book));
image.png
  • 5.文件中保存对象
  1. 保存的对象必须实现序列化
  2. 如果对象内部还有属性变量是其他类的对象 这个类也必须实现Serializable接口
image.png
    Person xw=new Person();
        xw.name="小王";
        xw.age=20;
        OutputStream os=new 
        FileOutputStream(file);
        ObjectOutputStream 
    oos=new ObjectOutputStream(os);
        oos.writeObject(xw);
        oos.close();
  • 6.从文件中读取对象
 InputStream is=new FileInputStream(file);
        ObjectInputStream ois=new ObjectInputStream(is);
        Person xw=(Person)ois.readObject();

        System.out.println(xw.name+" "+xw.age);
        ois.close();
image.png
  • 7.将一个文件copy到另外一个文件
     //将一个文件 copy 到另一个 位置
        //源文件的路径
        long start=System.currentTimeMillis();
        String sourcePath = "C:/Users/Administrator.000/Desktop/迎新晚会.png";
        //2.目标文件的路径
        String desPath = "F:/JAVA/DAY12/Day1/src/main/java/Day8/JAVA/1.jpg";
        //3.图片 字节
        FileInputStream fis = new FileInputStream(sourcePath);
        FileOutputStream fos = new FileOutputStream(desPath);
        byte[] in = new byte[1024];
        int count=0;
        while((count=fis.read(in)) !=-1){
            fos.write(in,0,count);
        }
//         while(true) {
//            int count = fis.read(in);
//           if(count!=-1){
//                //读取到内容了
//                //将这一次读取的内容写到目标文件中
//                fos.write(in,0,count);
//            }else{
//                break;
//            }
//        }
        fis.close();
        fos.close();
        long end=System.currentTimeMillis();

2.密码解锁小demo

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

public class FileOperation {//用来管理文件的相关操作
   public static final String PATH="F:/ps素材/pwd.txt";//
   public  String password;

    public static final FileOperation instance = new FileOperation();

    private FileOperation(){
        try {
            load();
        }catch (IOException e){
            System.out.println("");
        }
    }

    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异常");
        }
    }

}

main函数

import java.util.Scanner;

import Day8.JAVA.Unlock.FileOperation;

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

        //判断是否已经登录
        String password = FileOperation.instance.password;
        if (password != null){
            logined = true;
        }

        //提示用户操作
        String alert;
        if (logined) {
            alert = "请输入密码";
        } else {
            alert = "请设置密码";
        }
        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) {
                //已经登陆过 直接比较
                if (password.equals(inputPassword)) {
                    System.out.println("解锁成功");
                    break;
                } else {
                    System.out.println("解锁失败 请重新输入");
                    wrongTime--;
                }
            }else{
                //没有登陆过 在设置密码
                //判断是设置密码的第一次还是第二次
                if (firt == null){
                    //第一次  保存第一次输入的密码
                    firt = inputPassword;
                    System.out.println("请确认密码 ");
                }else{
                    //第二次 比较两次输入的密码是否相同
                    if (firt.equals(inputPassword)){
                        System.out.println("设置密码成功");
                        //保存设置的密码
                        FileOperation.instance.save(firt);
                        break;
                    }else{
                        System.out.println("两次密码不一致 请重新设置密码:");
                        firt = null;
                        wrongTime--;
                    }
                }


            }
            scanner.nextLine();
        }
    }

}

运行结果

20190815_002327.gif
20190815_002440.gif
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容