Day15

File类(表示文件)

        我们要在java程序中操作硬盘上的文件,首先需要在程序中表示一个对应的文件.

        一个File类的对象表示硬盘上的一个文件或目录(文件夹)

       /*
            一个File类的对象,表示一个文件或目录
            new File("String类型的文件名  可以是相对路径,也可以是绝对路径");
            new File(父级,子级);
         */

       /* File f1 =   new File("E:/demo.txt");
        System.out.println(f1.length());*/

       /* String p = "E:/";
        File f1 =   new File(p,"demo.txt");
        File f2 =   new File(p,"demo1.txt");*/

 操作方法:

判断功能

 File f1 =   new File("E:/demo.txt");
        System.out.println(f1.canWrite());//是否可以写
        System.out.println(f1.canRead());//是否可以读
        System.out.println(f1.exists());//是否存在
        System.out.println(f1.isHidden());//是否隐藏
        System.out.println(f1.isFile());//是不是文件
        System.out.println(f1.isDirectory());//是不是文件夹
        System.out.println(f1.isAbsolute());//是不是绝对路径

        获取功能

File f1 =   new File("E:/demo.txt");
        System.out.println(f1.length());//文件的长度(以字节为单位的)
        System.out.println(f1.lastModified());//最后一次修改的时间 1644456727960
        System.out.println(new Date(1644456727960L));

        System.out.println(f1.getParent());
        System.out.println(f1.getName());
        System.out.println(f1.getAbsolutePath());

       /* File f2 = new File("IO");//相对路径
        System.out.println(f2.getAbsolutePath());//获取文件的绝对路径*/


        File f2 = new File("E:/api");  //这表示的是一个文件夹
        //获取 api目录下所有的文件和文件夹,返回的都是文件名的字符串形式
          /* String[] fs =  f2.list();
           for (String fn : fs){
               System.out.println(fn);
           }*/

        //获取 api目录下所有的文件和文件夹,返回的是文件对象
        //File[] fs =  f2.listFiles();
        //文件筛选
        File[] fs =  f2.listFiles( (dir,name)->{ return name.endsWith("chm"); });
        for (File fn : fs){
            System.out.println(fn);
          }

        创建,删除功能

/* File f1 =   new File("E:/demo2.txt");
        try {
            f1.createNewFile();//创建一个新的文件,前提是文件不存在
        } catch (IOException e) {
            e.printStackTrace();
        }*/
         //  f1.delete(); 删除文件

        //File f = new File("E:/a");
        File f = new File("E:/a");
             //f.mkdir();//创建一个文件夹,只能创建一级
             //f.mkdirs();创建文件夹,可以创建多级目录

              f.delete();//delete在删除文件时,一次只能删除一级目录,且目录中为空

        File类只能表示文件,不能对文件内容进行读写操作

  

I(input) O(output) 输入和输出

        按照读写的单位分为:

                字节流(一次读写一个字节): 使用的多 图片,视频,音频,exe...

                字节输入流 从硬盘向程序中读数据

        InputStream

                字节输出流 从程序中向硬盘上写数据

        OutputStream

 //需求,把E:/demo.txt  --->  F:/demo.txt

        //创建一个输入流管道,为其指定输入的文件, 输入流要求文件是存在的,否则会报错
        FileInputStream in =  new FileInputStream(new File("E:/demo.txt"));
        //创建一个输出流管道,为其指定输出的文件,输出文件可以不存在,会自动创建
        FileOutputStream out = new FileOutputStream(new File("F:/demo.txt"));

              //int b = in.read();//从文件中读数据,一次读一个字节,文件内容读完后返回-1.
               int b=0;
              while( (b=in.read())!=-1){
                   out.write(b);
              }

               in.close(); //关闭流通道,释放文件
               out.close();
 //需求,把E:/demo.txt  --->  F:/demo.txt

        //创建一个输入流管道,为其指定输入的文件, 输入流要求文件是存在的,否则会报错
        FileInputStream in =  new FileInputStream(new File("E:/demo.txt"));
        //创建一个输出流管道,为其指定输出的文件,输出文件可以不存在,会自动创建
        FileOutputStream out = new FileOutputStream(new File("F:/demo.txt"));
        //read() 一次只读取一个字节,并返回结果, a-97 , 读完返回-1  效率低
        //read(byte[] b) 一次读取一个byte数组个字节内容,返回数组中实际装入内容的长度,读完返回-1
        //44个字节  数组长度是10
           byte[] b = new byte[10];
           int size = 0; //实际向数组中读到的内容长度, 主要是最后一次的实际数量
             while((size=in.read(b))!=-1){
                 // write(装内容的数组,数组的第0个位置开始,size,实际写出的长度); 最后一次之后4个字节,向外只写4个即可
                    out.write(b,0,size);
             }
              in.close();
              out.close();

节点流和处理流

         节点流: FileInputStream,FileOutputStream

                     流对象中封装的是的数据源. 直接用来读文件的

        处理流:BufferedInputStream,BufferedOutputStream(提供内部缓冲区功能)                     ObjectInputStream,ObjectOutputStream

        流对象中包含的是其他流对象,可以提供一些其他操作.

//需求,把E:/demo.txt  --->  F:/demo.txt
        //节点流
        FileInputStream in =  new FileInputStream(new File("E:/feige.exe"));
        //处理流
        BufferedInputStream bin = new BufferedInputStream(in);
        //节点流
        FileOutputStream out = new FileOutputStream(new File("F:/feige.exe"));
        //处理流
        BufferedOutputStream bout = new BufferedOutputStream(out);

                  byte[] b = new byte[10240];//数组的大小一定看具体的情况,不是越大越好  数组是在内存中存储的
                    int size = 0;
                  while((size=bin.read(b))!=-1){
                      bout.write(b,0,size);//虽然每次调用了write方法,但是不一定每次都会真正写出
                  }
                    bin.close();
                    bout.flush();//刷新缓冲区
                    bout.close();

        字符流(一次读写一个字符):只能读纯文本文件 txt java c 

        字符输入流 Reader

                           InputStreamReader 转换流 把原始的字节转为字符 将1个中文的3个字节转为一个字符编码

                           FileReader

 /*
             字符流可以一次直接读取到一个字符内容
             1个汉字三个字节组成,直接可以读到
         */
        FileReader  reader = new FileReader(new File("E:/demo.txt"));
        FileWriter  writer = new FileWriter(new File("E:/demo1.txt"));
                   int c = 0;
                   while((c=reader.read())!=-1){
                       writer.write(c);
                   }
                   /*
                   char[] c = new char[10];
                   int size = 0;
                   while((size=reader.read(c))!=-1){
                       writer.write(c, 0, size);
                   }
                   */
                   reader.close();
                   writer.close();
                   

 字符输出流 Writer

                    OutputStreamWriter

                    FileWriter

字符处理流:BufferedReader,BufferedWriter 提供对数据的缓冲功能

 FileReader  reader = new FileReader(new File("E:/demo.txt"));
        BufferedReader breader = new BufferedReader(reader);
        FileWriter  writer = new FileWriter(new File("E:/demo1.txt"));
        BufferedWriter bwriter = new BufferedWriter(writer);
                   //breader.readLine();//一次读一行数据,没有数据了,返回null
                     String line=null;
                     while((line=breader.readLine())!=null){
                          bwriter.write(line);//一次写出一个字符串
                          bwriter.newLine();//写出一个换行符
                     }
                      breader.close();
                      bwriter.flush();
                      bwriter.close();

print流

        没有输入,只是从程序中向外输出

        PrintStream 打印字节流

        PrintWriter 打印字符流 百度搜索 输入信息 点击百度按钮,向服务器端发送数据,服务器端搜索,将搜索到的内容响应到浏览器

对象输入,输出流(对象序列化和对象反序列化)

        就是把程序运行时所产生的对象信息(内存中存储) 输出到一个文件中(实现对象信息的持久化保存) 称为对象序列化

        例如系统升级,停止服务器, 可以将一些对象保存到硬盘中, 服务器启动,从文件中读取信息.

        从文件中 将对象信息读取到内存中, 称为反序列化(重新创建一个对象) (也是java中创建对象的一种方式)

   /* //程序运行时产生两个对象
          String s = new String("abc");
          Date date = new Date();
          // 使用对象输出流 将对象信息输出到文件中, 称为对象序列化
         FileOutputStream out = new FileOutputStream(new File("E:/object.txt"));
         ObjectOutputStream objout = new ObjectOutputStream(out);

                        objout.writeObject(s);
                        objout.writeObject(date);

                        objout.flush();
                        objout.close();*/


        //对象输入流读取文件中的对象信息  反序列化
          FileInputStream in  = new FileInputStream(new File("E:/object.txt"));
          ObjectInputStream objin = new ObjectInputStream(in);

                        String s =   (String)objin.readObject();
                        Date date =   (Date)objin.readObject();

                        System.out.println(s);
                        System.out.println(date);


                        objin.close();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值