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

来源:互联网 发布:网络电视内存多大合适 编辑:程序博客网 时间:2024/06/05 17:38
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

File

一、概述

1File类:文件和目录路径名的抽象表现形式

2、特点:

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

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

        3File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变

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

 

二、File对象创建

构造方法摘要File(File parent, String child) 
          根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。File(String pathname) 
          通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。File(String parent, String child) 
          根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

方式一:      

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

        将a.txt封装成File对象。可以将已有的和未出现的文件或者文件夹封装成对象。

 方式二:

            File f2=newFile("c:\\abc","b.txt");

        将文件所在目录路径和文件一起传入,指定文件路径。

 方式三:

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

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

        将文件目录路径封装成对象。再创建文件对象。降低了文件于父目录的关联性。

小知识:

        File.separator表示目录分隔符,可以跨平台使用。相当于路径中的“\”(双斜杠\\windows中表示表示转义后的分隔符,但是在linux系统中就不是)。

 

三、File类的常见方法

        boolean   createNewFile();

        //在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖。

        boolean    mkdir();//创建文件夹,只能创建一级文件夹

例:

        File dir=new File("abc");

        dir.mkdir();//创建abc这个文件夹

        boolean mkdirs();//创建多级文件夹

2、删除

        boolean delete();

        //删除文件或目录。文件存在,返回true;文件不存在或者正在被执行,返回false    

        void deleteOnExit();//在程序退出时删除指定文件

3、判断

        boolean canExecute();//是否是可执行文件

        boolean exists();//文件是否存在

        boolean isFile();//是否是文件

        boolean isDirectory();//是否是文件夹

        boolean isHidden();//是否是隐藏文件

        boolean isAbsolute();//文件是否是绝对路径

记住:在判断文件对象是否是文件或者目录时,必须要判断该文件对象封装的内容是否存在。通过exists判断。

4、获取信息

        String getName();//获取文件名

        String getPath();

        //获取文件的相对路径(即创建的对象传入的参数是什么就获取到什么)

        String getParent();

        //获取文件父目录。返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。如果相对路径中有上一层目录,那么该目录就是返回结果。

        String getAbsolutePath();//获取文件的绝对路径      

        long lastModified();//返回文件最后一次被修改的时间

        long length();//返回文件长度

5、列出文件及文件过滤

        static File[] listRoots();//列出可用的文件系统根目录

        String[] list();

        //列出当前目录下所有文件,包括隐藏。调用list方法的file对象必须是封装了一个目录。该目录还必须存在。

        String[]list(FilenameFilter filter);

        //返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。

        //FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。

        File[] listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹

        File[] ListFiles(FilenameFilterfilter);//返回抽象路径名数组,获取目录中满足指定过滤器的文件或目录。

package com.test;import java.io.*;class  FileDome{public static void main(String[] args) throws IOException{ fileTest();}public static void fileTest()throws IOException //抛出异常{File f1 = new File("E://1.txt");File f2 = new File("E://文件夹//第二个");//f2.mkdir();//创建文件夹,只能创建一级目录f2.mkdirs();//创建多级文件夹System.out.println("exists:"+f2.exists());//判断存在必须先创建文件}}

四、递归

1、定义

       当函数内每一次循环还可以调用本功能来实现,也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。

2、递归注意事项

        a、限定条件。是来结束循环调用,否则是死循环。

        b、注意递归的次数,尽量避免内存溢出。因为每次调用自身的时候都会先执行下一次调用自己的方法,所以会不断在栈内存中开辟新空间,次数过多,会导致内存溢出。

/*需求:列出指定目录下文件或文件夹,包含子目录,即列出指定目录下所有内容(带层次的)。分析,因为目录中还有目录,只有使用同一个列出目录功能的函数完成即可,在列出过程中出现的还是目录的话,还可以再调用本功能,这就是利用递归原理。*/import java.io.*;class  RecursionDemo{public static void main(String[] args) {//关联指定路径File dir=new File("e:\\Java Study\\Practice");        //列出关联路径中所有的.java文件allFileList(dir,0);}//列出指定目录下的所以内容public static void allFileList(File dir,int level){//有层次的输出System.out.println(getLevel(level)+dir);level++;File[] fileArr=dir.listFiles();//获取本目录下的所以文件和目录的抽象路径        //遍历for (File file : fileArr){if(file.isDirectory()){//如果目录下还是目录,则继续调用本函数allFileList(file,level);}elseSystem.out.println(getLevel(level)+file);//显示(列出)文件}}//带层次的列表public static String getLevel(int level){StringBuilder sb=new StringBuilder();sb.append("|--");//每多一级目录,就多输出指定字符for (int x=level;x>0 ; x--){//sb.append("|--");sb.insert(0,"|  ");}return sb.toString();}}

 Properties

一、概述

1PropertiesHashtable的子类,它具备Map集合的特点。而且它里面还有存储的键值对,都是字符串,无泛型定义。是集合中和IO技术想结合的集合容器。

2、特点:

        1)可用于键值对形式的配置文件

        2)在加载时,需要数据有固定的格式,常用的是:键=

 

二、特有方法

1、设置

        Object setProperty(String key,String value);

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

2、获取

        String getProperty(String key);

        //指定key搜索value

        Set<String> stringPropertyName();

        //返回属性列表的键集,存入Set集合

3、加载流和存入流

        void load(InputStream ism);

        //从输入字节流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。

        void load(Readerreader);

        //从输入字符流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。

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

        void store(OutputStreamout,String comments);

        //对应load(InputStream )将属性列表(键值对)写入输出流。comments属性列表的描述。

        void store(Writerwriter, String comments);

        //对应load(Reader)将属性列表(键值对)写入输出流。comments属性列表的描述。


打印流

一、概述

        1、打印流包括:PrintStreamPrintWriter

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

 

二、字节打印流:PrintStream

构造方法中可接收的参数类型:

        1File对象。File

        2、字符串路径:String

        3、字符输出流:OutputStream

 

三、字符串打印流:PrintWriter

构造方法中可接受的参数类型

        1File对象:File

        2、字符串路径:String

        3、字节输出流:OutputStream

        4、字符输出流:Writer


import java.io.*;class  PrintStreamDemo{public static void main(String[] args) throws IOException{//键盘录入BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//打印流关联文件,自动刷新PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);String line = null;while((line=bufr.readLine())!=null){if("over".equals(line))//结束字符break;out.println(line.toUpperCase());//out.flush();}//关流out.close();bufr.close();}}

序列流

一、概述

1SequenceInputStream对多个流进行合并。也被称为合并流。

2、常用构造函数

        SequenceInputStream(Enumeration<?extends FileInputStream> e)

 

二、常见合并多个流文件步骤

        1、创建集合,并将流对象添加进集合

        2、创建Enumeration对象,将集合元素加入。

        3、创建SequenceInputStream对象,合并流对象

        4、创建写入流对象,FileOutputStream关联写入文件

        5、利用SequenceInputStream对象和FileOutputStream对象读数据进行反复读写操作。


三、文件切割的原理?

通过读取流关联源文件,然后读取流将一个临时的数据进行了一个临时的缓冲,然后通过这个临时的缓冲区将数据分散到不同的文件当中。

也就意味着一个读取流对应着多个输出流。


/*SequenceInputStream合并流需求:将三个文本文件中的数据合并到一个文本文件中思路:1、创建一个Vector集合,将三个文本文件字节流添加到集合中  2、创建Enumeration对象,创建SequnceInputStream对象关联Enumeration  3、输出流关联新文本文件  4、反复读写操作*/import java.util.*;import java.io.*;class  SequenceInputStreamDemo{public static void main(String[] args)throws IOException{Vector<InputStream> ve=new Vector<InputStream>();//创建vector集合,并添加相关流对象ve.add(new FileInputStream("1.txt"));ve.add(new FileInputStream("2.txt"));ve.add(new FileInputStream("3.txt"));Enumeration<InputStream> en=ve.elements();//创建枚举对象SequenceInputStream sis=new SequenceInputStream(en);//合并流FileOutputStream fos=new FileOutputStream("4.txt");//关联写入文件//反复读写操作byte[] buf=new byte[1024];int len=0;while((len=sis.read(buf))!=-1){fos.write(buf,0,len);}//关流fos.close();sis.close();}}



0 0