java入门了解10

1.IO:
  1.File
    (一)注意:
      a.可以表示文件或者文件夹(也可称为目录)
      b.创建的File对象实际上不存在的文件只是代表了一个抽象路径
      c.Windows中分隔符'\'('//'也可以);Unix/Linux'\';更专业的写法:File.pathSeparatorChar
    (二)绝对路径相对路径
      a.Unix,绝对路径前缀‘/’就可以了,Windows前缀由“c:\\..”;
        Unix没有相对路径,Windows相对路径没有盘符前缀‘.’当前目录;‘..’上级目录
    (三)File实例常用方法:
      createNewFile();
      mkdir():在指定的位置创建最后一级目录,如果上级目录不存在就会报错
      mkdirs():创建指定目录,如果上级目录不存在就创建
      renameTo(File dest)重命名文件夹
      delete():删除文件或文件夹,如果文件夹不为空删不了
      判断:exists();isFile();isDirectory();isHidden();isAbsolute();
      获取:getName();getPath();getAbsolutePath();length();getParent();lastModified();
      listRoots():这个返回所有的根目录;
      list():返回目录下的文件,文件的话返回null
      list(FilenameFilter filter)返回指定当前目录中符合过滤条件的文件或者文件夹
      listFiles():返回目录下的文件或者目录(File类实例)

    (四)题目
      a.列出指定目录中所有的子孙文件与子孙目录名,只需要列出名称即可
      b.列出指定目录中所有扩展名为.java的文件,写一个工具类传入一个参数后缀名
      这里列出代码:
     

    /**
     * 从指定路径中找到所有的文件和文件夹
     * @param path
     */
    public static void listAllFilesAndDirs(String path){
        File f1=new File(path);
        File[] files=f1.listFiles();
        for(File i:files){
            if(i.isFile()){
                System.out.println(("子文件:"));
                System.out.println("\t" + i.getName());
            }else if(i.isDirectory()){
                System.out.println(("子目录:"));
                System.out.println("\t" + i.getName());
            }
        }
    }
View Code
/**
     * 从指定路径中找出指定扩展名的文件
     * @param path
     * @param extension
     */
    public static void listAllFiles(String path,String extension){
        File f1=new File(path);
        File[] names=f1.listFiles();
        for(File i:names){
            if(i.getName().endsWith(extension)){
                System.out.println(i.getName());
            }
        }
    }
View Code

 

  2.IO流
    (一)注意:
      a.File能表示存在文件也可表示不存在,但我们想要操作文件内容就需要IO流技术
      b.java对设备中数据通过流来操作;设备是指硬盘,内存,网络等
      c.java中操作流的对象都在IO包中
      d.流分类.数据类型:字节流;字符流;按流向:输入流;输出流
    (二)字节流:
      a.计算机中数据都是以字节流的方式存储的,我们的64位操作系统就是指最大流宽度8个字节
      b.基类java.io.InputStream;java.io.OutputStream
      c.字节流处理的单位是字节,用于操作二进制文件
    (三)InputStream输入字节流基类抽象类
      a.FileInputStream:读取文件数据的输入字节流
      步骤:1.找到目标文件
              2.建立数据输入通道
          3.读取文件中数据
          4.关闭资源
      注意:读完文件一定要释放资源否则别人不能使用
      例子:

    /**
     * 这个方法只能读取一部分,大小由存放流数据文件的buff决定
     * 因为文件读取到buff满了后没有地方可放了
     * 所以正确的还要加个循环就好了
     * @param path
     * @throws IOException
     */
    public static void readTest1(String path) throws IOException{
        File f=new File(path);
        FileInputStream fis=new FileInputStream(f);
        byte[] buff=new byte[1024*67];
        int length=fis.read(buff);
        System.out.println("length:"+ length);
        String content=new String(buff,0,length);
        System.out.println(content);
        fis.close();
    }
    /**
     * 完善后的读取文件都能读取了
     * @param path
     * @throws IOException
     */
    public static void readTest2(String path) throws IOException{
        File f=new File(path);
        FileInputStream f1=new FileInputStream(f);
        byte[] buff=new byte[1024];
        int length=0;//存放读取的文件长度
        int lenz=0;
        while((length=f1.read(buff))!=-1){
            System.out.print(new String(buff,0,length));
            lenz+=length;
        }
        System.out.println(lenz);
        f1.close();
    }
View Code

      b.BufferedInputStream:就是维护了一个8kb的字节数组
       步骤:1.找到目标文件
        2. 建立缓冲输入字节流
        3.读取
        注意:凡是缓冲流都不具备读写文件的能力
        提问:1.为什么创建BufferInputStream时需要传递FileInputStream?
             BufferInputStream 本身不具备读文件的能力,所有需要借助FileInputStream来读取数据
           2.BufferInputStream出现目的是提高读取文件的效率,但是BufferInputStream方法每次读取一个字节数据 而FileInputStream每次也是只读一个字节的数据,那么这个东西它效率高的原因?

 


                                   这个需要查看器read()方法发现原因:本质原因是内存读取速度快要硬盘读取速度;
                                   内部原理:先获取8kb数据放到缓存区中,然后再从缓存区中一个字节一个字节获取数据,所有这里的每次获取一个字节和FileInputStream每次获取一个字节所处读取环境不一样一个是内存一个是硬盘


      例子:复制文件

    public static void copyImage1(String pathfrom,String pathTo) throws IOException{
        File f1=new File(pathfrom);
        File f2=new File(pathTo);
        
        FileInputStream input=new FileInputStream(f1);
        FileOutputStream output=new FileOutputStream(f2);
        
        byte[] buff=new byte[1024];
        int length=0;
        while((length=input.read(buff))!=-1){
            output.write(buff, 0, length);
        }
        
        output.close();
        input.close();
    }
View Code

 

    (四)OutputStream输出字节流基类抽象类
      a.FileOutStream向文件输入数据
      步骤:1找到目标文件
        2.建立数据输出通道
        3.读取文件中的数据
        4.关闭资源
      注意:1.使用FileOutStream时,如果目标文件不存在,那么会创建
        2.使用期写数据时,如果目标文件已存在,会清空目标文件中的数据,然后再写入
        3.如果想要在已存在的目标文件中末尾写,需要new FileOutStream(file,true)//第二个参数为true才行
        4.write()方法如果传入的是数字,他也只会截取前8位一个字节的大小
      例子:public static void writeTest1() throws IOException{
          File f=new File("C:/a/e.txt");
          FileOutputStream out=new FileOutputStream(f);
          String content="adasdfasdf";
          //out.write('a');
          out.write(content.getBytes());
          out.close();
         }
    (五)例子:
       a.复制文件

public static void copyImage1(String pathfrom,String pathTo) throws IOException{
        File f1=new File(pathfrom);
        File f2=new File(pathTo);

        FileInputStream input=new FileInputStream(f1);
        FileOutputStream output=new FileOutputStream(f2);

        byte[] buff=new byte[1024];
        int length=0;
        while((length=input.read(buff))!=-1){
            output.write(buff, 0, length);
        }

        output.close();
        input.close();                            
}
View Code

b.用缓冲输入输出字节复制文件

public static void copyFile(String pathFrom,String pathTo) throws IOException{
         File f=new File(pathFrom);
         File t=new File(pathTo);

         FileInputStream fis=new FileInputStream(f);
         FileOutputStream fos=new FileOutputStream(t);

         BufferedInputStream buffI=new BufferedInputStream(fis);
         BufferedOutputStream buffO=new BufferedOutputStream(fos);
         //边读边写
         int content=0;
          //int length=buffI.read(buffer)//如果传入了缓冲数组,内容是存储到缓冲数组中,返回值是存储到缓冲数组中的字节个数。
         while((content=buffI.read())!=-1){//read没有传参数返回值就是读取到的内容
         buffO.write(content);
     } 
     buffO.close();
     buffI.close();
}
 
View Code

  3.IO异常处理(这里是比较麻烦的):
    注意:IO异常时,代码后面都不需要执行了所以必须用throw关键字阻止后面代码执行且能出现异常信息
        每次关资源的时候也需要这样弄下
        我们抛出的异常用RuntimeException(e)本质是抛出e,但是有这个包着,编译器就不会认为是IO异常立马让我们处理
    模板例子:

public static void copyFile(String pathForm,String pathTo){
       FileInputStream input=null;
       FileOutputStream output=null;
       try{
            File f1=new File(pathForm);
            File f2=new File(pathTo);
            input =new FileInputStream(f1);
            output=new FileOutputStream(f2);
            int length=0;
            byte[] buff=new byte[1024];
            while((length=input.read(buff))!=-1){
                  output.write(buff, 0, length);
             }
        }catch(IOException e){
           //IO异常,后后面的代码就不进行了所以用throw
          throw new RuntimeException(e);
        }
        finally{
                  try{ 
                        if(output!=null){
                                 output.close();
                                 System.out.println("关闭输出流对象成功...");
                         }
                       }catch(IOException e){
                         System.out.println("关闭输出流资源失败...");
                         throw new RuntimeException(e);
                       }finally{
                                   try{
                                      if(input!=null){
                                                    input.close();
                                                    System.out.println("关闭输入流资源成功...");
                                      }
                                  }catch(IOException e){
                                      System.out.println("关闭输入流资源失
败...");
                                      throw new RuntimeException(e);
                                  }

                     }

             }

}    
View Code

 



posted @ 2017-04-07 09:33  王吉平  阅读(189)  评论(0编辑  收藏  举报