黑马程序员——Java基础——File文件操作、Properties类、打印流、序列流

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、IO流——File文件操作

     1、概述

       流用于操作数据,而数据最明显的体现形式就是文件。而文件又包含很多属性和信息,比如:名称,前缀,后缀,路径名,属性信息,大小,类型等等。我们要想操作文件,就必须对它进行描述,并抽象为对象。这就是File类的由来。 而系统中,除了文件,还有文件夹。

  它弥补了流对象的不足,流对象不能操作文件夹,不能操作文件的属性信息。

      2File类的特点

           1)用来将文件或者文件夹封装成对象

           2)方便对文件与文件夹的属性信息进行操作

           3File对象可以作为参数传递给流的构造函数         

   3File对象的创建方式

                 第一种    这个文件不一定存在。它可以将已有的和未出现的文件或者文件夹封装成对象。

                File f =new File("a.txt");

         第二种   File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 

                File  f2=new File(c:\\abc,b.txt);/

         第三种  File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

               File d=new File(c:\\abc);

              File f3=new File(d,c.txt);

        我们发现,windows下的目录分隔符\\或者/.lunix下不能适用。不能跨平台。怎么办呢?

          有一个字段: static String separator  与系统有关的默认名称分隔符。在windows下,就是windows的目录分隔符,在lunix下,就是lunix的目录分隔符。所以要想我们的程序在任意系统下都通用,可以这样做

          File f4=new File(c:+File.separator+abc+File.separator+a.txt);

      4File类的方法

           1) 创建

               boolean createNewFile() 

             当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。如果文件已经存在,则不创建,返回false

             这和输出流不一样。输出流对象一旦建立,就会创建文件,文件已经存在,会覆盖。           

       2) 删除

           boolean delete() 

          删除此抽象路径名表示的文件或目录。 

          void deleteOnExit() 

          在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。

      3)判断

           boolean canExecute() 

            测试应用程序是否可以执行此抽象路径名表示的文件。              

           boolean exists() 

          测试此抽象路径名表示的文件或目录是否存在。 使用频率很高

           boolean isDirectory() 

          测试此抽象路径名表示的文件是否是一个目录。 

           boolean isFile() 

          测试此抽象路径名表示的文件是否是一个标准文件。 

          boolean isHidden() 

          测试此抽象路径名指定的文件是否是一个隐藏文件。 Java有些文件是访问不了的。

         System打头的,java都访问不了。所以我们取文件时,需要判断一下。

          Boolean  isAbsolute() 

          测试此抽象路径名是否为绝对路径名。 

      4)获取信息

         File  getAbsoluteFile() 

          返回此抽象路径名的绝对路径名形式。把返回的绝对路径封装成了文件对象。          

         String getAbsolutePath() 

          返回此抽象路径名的绝对路径名字符串。 

           这两者之间可以互相转换,file.toString()就得到了string。把string new一下,就得到了file                  

        String getName() 

          返回由此抽象路径名表示的文件或目录的名称。 

        String getParent() 

          返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null

            该方法返回的是绝对路径中的父目录 

       File getParentFile() 

          返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。            

       long length()           

返回由此抽象路径名表示的文件的长度。 

 覆盖文件的原理就是先把原来的文件删除,然后再创建一个新的文件。

 其他方法:    

    boolean renameTo(File dest) 

          重新命名此抽象路径名表示的文件:

重要方法:

    static File[] listRoots() 

          列出可用的文件系统根。是静态的,不操作特有数据。

    String[] list() 

          返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。包括隐藏文件。

        记住,调用list方法的file对象必须是封装的目录,而且该目录还必须存在

      File[] listFiles() 

          返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 

这个方法和String [] list()方法有什么区别呢?

String[] list()返回的是当前目录下,所有文件及文件夹的名称

File[] listFiles()返回的是当前目录下,所有文件及文件夹的对象。 

  局限性:这个方法只能拿当前目录下的文件和文件夹。想把当前目录下,包括子目录下的文件都打印出来,就需要用到递归方法了。

 

练习

 String[] list(FilenameFilter filter) 

          返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 

  

5、列出目录下所有内容——递归

     需求:

     列出指定目录下文件或者文件夹,包含子目录中的内容。也就是列出指定目录下所有内容。

   

 

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可,在列出过程中出现的还是目录的话,可以再次调用本功能,也就是函数自身调用自身。这种表现形式叫做递归。

递归要注意的:

限定条件  

要注意递归的次数,尽量避免内存溢出。

     递归举例

public static int getSum(int n )

 {

If(n==1)

 Return 1;

 Return n+getSum(n-1);

}

Main

{

 System.out.println(getSum(80000));

}

结果内存溢出

6、IO流——删除带内容的目录

    需求:删除一个带内容的目录

删除原理:

windows中,删除目录是从里面往外删除的。也就是说先要把最里层的文件删除,然后删除文件夹,然后一次往外删除。

既然是从里往外删除,就需要用到递归。

 

 

java删除是不走回收站的,所以要备份。

但是还是要提醒大家,不要误删,系统文件不要删,也删不掉的。还有就是有一些隐藏文件,java是访问不到的。这样就会导致空指针异常。

所以,删除之前,要先判断下,文件是否存在

 7、创建java文件列表

    

 

 

 

二、IO流——Properties

       1、概述

         PropertieshashTable的子类,也就是说它具备map集合的特点,而且它里面存储的键值对都是字符串。

是集合中和IO技术相结合的集合容器。

         该对象的特点:可以用于键值对形式的配置文件。那么在加载数据时,需要数据有固定格式,有键和值。

         应用:软件的配置信息。文本颜色,前景色等等。

       2、方法

           设置

        Object setProperty(String key,String value);

        设置键和值,调用Hashtable的方法put

          获取

        String getProperty(String key); 指定key搜索value

        Set<String> stringPropertyName();返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。

         加载流和存入流

       void load(InputStream inStream) 

          从输入流中读取属性列表(键和元素对)。 

       void load(Reader reader) 

          按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。 

       Void list(PrintStream out);将属性列表输出到指定的输出流

       void store(OutputStreamout,String comments);

        对应load(InputStream )将属性列表(键值对)写入输出流。            

     3、练习

        

 

4Properties类的应用

   用于记录应用程序运行次数

如果使用次数已到,那么给出注册提示。

很容易想到的是:计数器

可是,该计数器定义在程序中,随着程序的运行而在内存中存在,并进行了自增。可是,随着该应用程序的退出,该计数器也在内存中消失了。下一次再启动该程序,又重新开始从0计数。这样不是我们想要的。

程序即使结束,该计数器的值也存在,下次程序启动会先加载该计数器的值。并加1后再重新存储起来。

所以,要建立一个配置文件,用于记录该软件的使用次数。

该配置文件使用键值对的形式。这样便于阅读数据,并操作数据。键值对数据是map集合。数据是以文件形式存储的。使用IO技术。

那么,map+IO-----properties

 

 

 

三、打印流

   1、概述

 public class PrintStream  extends  FilterOutputStream  implements  Appendable, Closeable

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

2、方法:

该流提供打印方法,可以将各种数据类型的数据都原样打印。

write方法,传一个int型的数据,它往外打印的是最低八位。

3PrintStreamPrintWriter的区别

字节打印流  PrintStream

   在进行构造的时候,可以直接操作文件。

            PrintStream(File file) 

          创建具有指定文件且不带自动行刷新的新打印流。

   构造函数可以接收的参数类型:

      1  file对象     file

      2  字符串路径  Sting

      3  字节输出流OutputStream    

字符打印流  printWriter

相比之下,非常常用。到web编程的时候,都用这个对象,把信息一条一条打印到客户端中。

    构造函数可以接收的参数类型:

       1  file对象     file

       2  字符串路径  Sting

       3  字节输出流OutputStream

       4  字符输出流  Writer

 

 

 public PrintWriter(OutputStream out,boolean autoFlush)

      通过现有的 OutputStream 创建新的 PrintWriter。此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。

 

如果,要把数据写到文件里面去

   PrintWriter out=new PrintWriter(a.txt);file对象或者路径名都可以,但是不能刷新,

刷新只针对于流而言。

再运行,没有刷新。那我既想写到文件,又想刷新,怎么办?

把文件封装到流中就行了 

   PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(a.txt)),true);

一级一级嵌套

四、序列流

1、概述

    序列流

  SequenceInputStream  对多个流进行合并

      SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。也就是说,它可以将多个流对象拼成一个流对象。

特殊之处:这个流对象,没有对应的Output流对象。

  用于多个源对应一个目的进行数据操作。

这个流对象先把多个源变成一个源,然后一个源对应一个目的进行操作。

 2、应用

  

 

 

3、练习分割文件

    

 

 

 

如果是电影文件,要小心了,比如500M的文件,按100M去切,一定用两个流去写到两个文件中,否则内存溢出。


------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值