美文网首页
Java基础(10)——基本文件输入输出流

Java基础(10)——基本文件输入输出流

作者: 让时间走12138 | 来源:发表于2020-04-17 20:58 被阅读0次

    本节内容

    1.文件简介和创建

    2.文件类型和过滤

    3.输入输出流

    4.图片读取并写入

    5.图片和文本读取和写入

    一、文件简介和创建

    1.文件:数据在磁盘的唯一最小描述,也就是说上层应用程序只能通过文件来操作磁盘上的数据。文件也是操作系统和磁盘数据交互的一个最小单元。
    2.文件也可以叫作目录、文件。可以是虚拟的,也可以是真实存在的。
    3.文件的基本操作:①创建文件/目录(文件夹) ②判断文件/目录是否存在 ③写入数据 ④删除
    注:new file并不会创建一个文件,如果需要创建,那么就使用.createNewFile()函数。这个过程可能会出现异常,所以我们需要使用try-catch函数接受异常
    ①以下为创建一个文件的具体代码
         //1.让File指向一个指定的文件,(存在/不存在)都有文件名
            File file =new File("C:\\Users\\86178\\Desktop\\1.txt");
            //2.判断文件或者目录是否存在
           if( file.exists()){
               //3.创建文件
               try {
                   file.createNewFile();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
    
    以下为创建一个目录的代码,床架目录调用.mkdir()函数。
      File file = new File("C:\\Users\\86178\\Desktop", "file");
          if (file.exists()) {
              return;
          }
          try {
              //创建目录
              file.mkdir();
          } catch (NullPointerException e) {
              e.printStackTrace();
          }
    
    ④以下为删除一个文件的具体代码
     File parent = new File("C:\\Users\\86178\\Desktop");
            File file = new File(parent,"file");
            if(file.exists()){
                file.delete();
            }
    
    ③写入数据:File没有具体读取和写入数据的方法,数据的读取和写入通过I/O流来操作(具体见 第三、输入输出流)

    二、文件类型和过滤

    1.file有一个isDirectory()方法判断它是不是目录,还有一个isFile()方法判断它是不是普通的文件
          //判断是文件还是目录
            if(file.isDirectory()){
               System.out.println("是目录 文件夹");
            }
            if(file.isFile()){
                System.out.println("是普通的文件");
            }
    
    2.file使用没有参数的list()方法可以查看当前文件的所有内容
     //查看当前文件的所有内容
            String[] filePathList= file.list();
            for(String name:filePathList){
                System.out.println(name);
            }
    
    3.file使用参数类型为FilenameFilter的list()方法时,可以起到文件过滤的作用。我们一般使用匿名内部类,直接在()里面new一个FilenameFilter对象,这个时候会自动弹出一个accept()方法,它是boolean类型的,如果返回true,当前这个文件会被过滤出来。如果返回false,当前文件会被放弃。
    String[] filePathList= file.list(new FilenameFilter() {
                @Override
                public boolean accept(File file, String s) {
                    //如果返回true 当前这个文件会被过滤出来
                    //如果返回false 当前文件会被放弃
                  File f =new File(file,s);
                  if(f.exists()){
                        return true;
                    }
                    return false;
                }
            });
    
    4.通过listFiles()方法,然后再调用getAbsoluteFile()方法可以获取当前文件的路径
         File[] files= file.listFiles();
            for(File f:files){
                System.out.println(f.getAbsoluteFile());
            }
    

    三、输入输出流

    1.I /O流:输入流 ,输出流
    2.方向:相对的,相对于内存—运行的程序—进程来说的
    3.输出流:从内存里读到外部(硬盘,网络,外部设备)
    4.输入流:从外部(硬盘,网络,外部设备)到内存
    5.数据的存储形式有两种:①二进制形式存储(图片,视频,音频,exe)②字符的形式存储
    6.读取方式:①二进制文件—字节流(一次读取一个字节)②文本文件—字符流(一次读取两个字节)。如果想一打开就能看懂这个文件,那么一般用字符流。反之就用字节流(比如打开一张图片)
    7.I/O操作:①字节流,输入流 InputStream ,输出流OutputStream ②字符流,输入流 Reader ,输出流 Writer
    8.具体实现类:①字节流,输入流 FileInputStream 输出流 FileOutputStream ②字符流,输入流 FileReader,输出流FileWriter
    注意:当使用I/O流时,不需要的资源需要自己手动释放(关闭文件)
    例如,以下代码为在文件中写入数据
      String des= "C:\\Users\\86178\\Desktop\\1.txt";
       //写入需要的数据
            String text ="你好啊,老王";
            //选择字符流还是字节流
            FileWriter fw=null;
            try {
               //写入的内容是文本,所以是字符流
                //把内存的文本写到磁盘,所以是输出流
                fw =new FileWriter(des);
                //开始写入数据
                fw.write(text);
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                //关闭流
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    

    四、单个字节操作 图片读取并写入

    1.单个字节操作,将图片读取到内存中,因为是读到内存,所以为输入流。因为是读取图片,所以为字节流。FileInputStream
    2.将内存中的图片数据写入到内存磁盘中,因为是写入磁盘,所以为输出流。因为是图片,所以为字节流。FileOutputStream
    3.首先创建对象,因为有可能创建失败,所以需要使用try-catch。
    4.然后从输入流里面获取数据,写入到输出流。
    5.因为是一个字节一个字节地读取,直到read(无参数)函数的返回值为-1,才读取完毕。在它读取完毕之前,都要将它一个字节一个字节地写出去,所以需要使用while循环
    6.注:凡是实现了closeable接口的类,都可以在try()括号内部创建。这样当try代码块执行完毕或者有异常,系统会自动关闭对应的对象。这样就没必要在finally里面写close()函数了
    例如,以下代码为将图片复制到另外一个文件中
            String des="C:\\Users\\86178\\Desktop\\file\\ad.jpg";
            String src ="C:\\Users\\86178\\Desktop\\ad.jpg";
            //1.将图片读取到内存中
            //输入流,字节流  FileInputStream
            //2.将内存中的图片数据写入到内存磁盘中
            //输出流,字节流  FileOutputStream
            try (FileInputStream fis =new FileInputStream(src);
                 FileOutputStream fos =new FileOutputStream(des)){
                //创建字节输入流对象
                //创建字节输出流对象
                //从输入流里面获取数据,写入到输出流
                int b=0;
                while (true){
                //read()无参数,是一个字节一个字节读取
               b=  fis.read();
               //判断是否读取完毕 返回值为-1
                    if (b==-1){
                        break;
                    }
              //一个字节一个字节地写出去
                fos.write(b);
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    

    五、整个数组操作 图片和文本读取和写入

    1.为了使图片的读取速度快一点,我们将对上面的代码进行修改。
    2.首先我们不要单个字节操作,就整个数组操作,那么就需要定义一个字节数组,一般大小为1024字节。
    3.然后我们可以调用一个System.currentTimeMillis()来记录时间,在程序最前面设置一个,在结尾再设置一个,两个变量相减就是这段代码运行的时间。其他内容与上面的代码基本相同。以下代码为字节输入输出流
           String des="C:\\Users\\86178\\Desktop\\file\\ad.jpg";
            String src ="C:\\Users\\86178\\Desktop\\ad.jpg";
            long start=   System.currentTimeMillis();
            try (FileInputStream fis =new FileInputStream(src);
                 FileOutputStream fos =new FileOutputStream(des)){
                //定义一个数组用于保存一次性读取的多个数据
                byte [] buffer= new byte[1024];
                //从输入流里面获取数据,写入到输出流
                int len=0;
                while (true){
                //read()无参数,是一个字节一个字节读取
               len=  fis.read(buffer);
               //判断是否读取完毕 返回值为-1
                    if (len==-1){
                        break;
                    }
              //一个字节一个字节地写出去
                fos.write(buffer);
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            long stop=   System.currentTimeMillis();
            System.out.println("使用时间为:"+(stop-start));
    
    4.文本读取和写入
    ①单个字节写入,以下代码为字符输出流
            String des="C:\\Users\\86178\\Desktop\\file\\1.txt";
            String src ="C:\\Users\\86178\\Desktop\\1.txt";
            try (FileReader fr= new FileReader(src);
                 FileWriter fw =new FileWriter(des);){
                while (true){
                    int ch=fr.read();
                    if(ch==-1){
                        break;
                    }
                    fw.write(ch);
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    ②通过数组写入,以下代码也为字符输出流
           String des="C:\\Users\\86178\\Desktop\\file\\1.txt";
            String src ="C:\\Users\\86178\\Desktop\\1.txt";
            char [] buffer =new char[1024];
            try (FileReader fr= new FileReader(src);
                 FileWriter fw =new FileWriter(des);){
                while (true){
                    int len=fr.read(buffer);
                    if(len==-1){
                        break;
                    }
                    fw.write(buffer);
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    欧克儿,以上就为今天的全部内容了,再见!

    相关文章

      网友评论

          本文标题:Java基础(10)——基本文件输入输出流

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