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

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

作者: 宁晓鸯 | 来源:发表于2019-08-15 00:30 被阅读0次

    心得体会

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

    今日所学

    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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/cdpnjctx.html