黑马程序员-java 基础之IO其他常用类

--------------------- android培训java培训、java学习型技术博客、期待与您交流! -------------------

File

概述:文件和目录路径名的抽象表示形式,该类的出现时对文件系统中的文件以及文件夹进行对象的封装,可以通过对象的思想来操作文件以及文件夹

创建方式:

              File(String filename)//将一个字符串路径封装成Filed对象,该路径可以存在也可以不存在

                   示例:File f=new File("d:\\mytxt\\1.txt")

              File(String parent,String child)//将一个字符串文件目录和文件名,封装成File对象

                      示例 File f=new File("d:\\mytxt""1.txt ")

              File(File parent,String child)//将一个File对象和文件名字符串封装成对象

                      示例 File d=new File("d:\\mytxt")

                              File f=new File(d,"1.txt ")

特殊字段:File.separator 跨平台的目录分割符

       示例:File f=new File("d: "+File.separator+ "mytxt "+File.separator+ "1.txt")

常见方法

       创建

              boolean creatNewFile():如果要创建的文件已经存在,则不创建

              boolean mikdir():创建文件夹

              boolean mikdirs():创建多级文件夹

       删除

boolean delete():可用来删除文件或者文件夹

注意:对于文件夹只能删除空文件夹,对于非空文件夹,不可以直接删除,需要先删除文件夹里的内容再删除文件夹

void deleteOnExit():系统退出时执行删除动作

判断

       boolean canExecute():判断是否为可执行文件

       boolean exists():判断文件是否存在

       boolean isFile():判断是否是文件

       boolean isDirectory():判断是否是文件夹

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

boolean isHidden();//是否是隐藏文件,在获取硬盘文件或者文件夹时,对于系统目录中的文件,java是无法访问的,所以在遍历时,可用于避免遍历隐藏文件

获取

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

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

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

long lastModified();//返回文件最后一次被修改的时间long length();//返回文件长度static File[] listRoots();//列出可用的文件系统根目录,即系统盘符

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

String[]list(FilenameFilter filter);//返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,

accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。

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

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

       重命名

              renameTo(File file)

              File f1=new File("d:\\mytxt\\1.txt")

              File f2=new File("d:\\mytxt\\2.txt")

              f1. renameTo(f2)//f1中封装的文件名更改为f2中的文件名

获取一个目录下的所有.java文件

代码示例

import java.io.*; 

class  FileDemo

    public static void main(String[] args)  

    { 

        File dir=new File("e:\\java \\day20"); 

       

   

        //传入FilenameFilter匿名内部类子类对象,并复写accept方法 

        String[] javaFile=dir.list(new FilenameFilter() 

        { 

            public boolean accept(File dir,String name) 

            { 

                return name.endsWith(".java");//判断文件名是否是以.java结尾 

            } 

        }); 

 

        System.out.println("len:"+javaFile.length); 

        for (String s : javaFile ) 

        { 

            System.out.println(s); 

        } 

    } 

递归

概述:当方法内部还需要使用方法内容时,就出现了方法自身调用自身,这种编程手法叫做递归,可以参考电影《盗梦空间》中的多重梦境

注意

       要限定条件来结束,避免死循环

       注意递归的次数,避免内存溢出

练习使用递归方法列出所有文件

import java.io.*;

public class FileDemo2

{

       public static void main(String[] args)

{

 

              File dir = new File("e:\\demodir");

             

              listAll(dir,0);

       }

 

       public static void listAll(File dir,int level) {

             

      

              System.out.println(getSpace(level)+dir.getName());

              //获取指定目录下当前的所有文件夹或者文件对象

             

              level++;

              File[] files = dir.listFiles();

             

              for(int x=0; x<files.length; x++){

                    

                     if(files[x].isDirectory()){

                            listAll(files[x],level);

                     }

                     else

                            System.out.println(getSpace(level)+files[x].getName());

              }    

       }

 

       private static String getSpace(int level) {

             

              StringBuilder sb = new StringBuilder();

             

              sb.append("|--");

              for(int x=0; x<level; x++){

                     sb.insert(0,"|  ");

              }

             

              return sb.toString();

       }

      

 

}

 

练习,删除带目录的文件夹

代码示例

import java.io.*;

public class FileDemo3

{

public static void main(String[] args)

       {

              File dir=new File("e:\\java\\day22");

       }

       public static void removeDir(File dir)

       {

              File[] files = dir.listFile();

              for(int i = 0;i<files.length;i++)

              {

                     if(files[i].isDirectory&&!files[i].isHidden())

                            removeDir(files[i]);//如果是文件夹则继续调用函数

                     else

//如果是文件则删除。注意删除的时候打印删除的结果,防止误删或者重删的情况

                            System.out.println(files[i].toString()+"::"+files[i].delete());

              }

              System.out.println (dir+"::"+dir.delete());

       }

}

练习-将文件中所有的.java文件的绝对路径存储到一个文本文件中

代码示例

import java.io.*;

public class Test

{

       public static void main(String[] args) throws IOException

      

                    

              File dir = new File("e:\\java0331");

             

              FilenameFilter filter = new FilenameFilter()

{

                     public boolean accept(File dir, String name)

{

                            return name.endsWith(".java");

                     }                  

              };

             

              List<File> list = new ArrayList<File>();

             

              getFiles(dir,filter,list);

             

              File destFile = new File(dir,"javalist.txt");

             

              write2File(list,destFile);

             

       public static void getFiles(File dir,FilenameFilter filter,List<File> list){

             

              File[] files = dir.listFiles();

             

              for(File file : files){

                     if(file.isDirectory()){

                            getFiles(file,filter,list);

                     }else{

              //对遍历到的文件进行过滤器的过滤。将符合条件File对象,存储到List集合中。

                            if(filter.accept(dir, file.getName())){

                                   list.add(file);

                            }

                     }

              }

             

       }

      

       public static void write2File(List<File> list,File destFile)throws IOException{

             

              BufferedWriter bufw = null;

              try {

                     bufw = new BufferedWriter(new FileWriter(destFile));

                     for(File file : list){

                            bufw.write(file.getAbsolutePath());

                            bufw.newLine();

                            bufw.flush();

                     }

                    

                    

              } /*catch(IOException e){

                    

                     throw new RuntimeException("写入失败");

              }*/finally{

                     if(bufw!=null)

                            try {

                                   bufw.close();

                            } catch (IOException e) {

                                  

                                   throw new RuntimeException("关闭失败");

                            }

              }

       }

 

}Properties

概述:该类是hashtable的子类,该类型不需要泛型,因为该类中存放的键值对都是String类型。是集合中与io技术相结合的类。

常用方法

       存入键值对

setProperty(key,value)

       通过键获取值

       getProperty(key)

       获取属性列表

       propertyNames()

       Set<String> stringPropertyNames()//Jdk1.6之后获取元素所有键元素

      

返回属性列表,并通过打印流,输出到指定的目的地

list(PrintStream)

list(PrintWriter)

       将流中的规则数据加载进集合,

       load(InputStream)

       load(Reader)

       将属性列表写入输出流中

       store(OutputStream,String comment)

       store(Writer,String comment)

代码演示

class PropertiesDemo

{

public static void main(String[] args)

       {

 

              Properties prop = new Properties();

              prop.setProperty("张三","25");

              prop.setProperty("李四","27");

              prop.setProperty("王五","20");

              String value = prop.getProperty("张三");

              Systrm.out.println(value);

              Set<String> keys = prop.stringPropertyName();

              for(String key : keys)

              {

                     System.out.println(key+"="+prop.getPropety(key));

              }

       }

}

小练习,记录程序使用次数,如果次数已到,则提示用户注册

代码示例

public class PropertiesTest

{

public static void main(String[] args) throws IOException 

{

                            getCount()

       }

      

       public static void getCount() throws IOException{

             

              //将配置文件封装成File对象。

              File confile = new File("count.properties");

             

              if(!confile.exists()){

                     confile.createNewFile();

              }

             

              FileInputStream fis = new FileInputStream(confile);

             

              Properties prop = new Properties();

             

              prop.load(fis);

             

             

              //从集合中通过键获取次数。           

              String value = prop.getProperty("time");

              //定义计数器。记录获取到的次数。

              int count =0;

              if(value!=null){

                     count = Integer.parseInt(value);

                     if(count>=5){

//                          System.out.println("使用次数已到,请注册,给钱!");

//                          return;

                            throw new RuntimeException("使用次数已到,请注册,给钱!");

                     }

              }

              count++;

             

              //将改变后的次数重新存储到集合中。

              prop.setProperty("time", count+"");

             

              FileOutputStream fos = new FileOutputStream(confile);

             

              prop.store(fos, "");

             

              fos.close();

              fis.close();

             

             

       }

 

}

打印流

概述:打印流中包含了PrintWriterPrintStream,该流中没有对应的输入流

特点:该流提供了打印方法,可将各种类型数据都原样打印

PrintWriter

       字符打印流

       该构造函数可以接收四种类型的值

       字符串路径

       File对象

       接收这两种类型参数时,还可以指定编码表

       OutputStram

       Writer

       接收这两种类型参数时,可以指定自动刷新,传入true即可,

代码示例

public class PrintWriterDemo

{

       public static void main(String[] args) throws IOException

{

             

              BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

             

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

             

              String line =  null;

              while((line=bufr.readLine())!=null){

                     if("over".equals(line))

                            break;

                     out.println(line.toUpperCase());

              }

             

              out.close();

              bufr.close();

       }

 

}

序列流

概述:序列流又称合并流,可以将多个读取流合并成一个流,可以实现文件的合并等功能

原理:其实就是将每一个读取流对象存储到一个集合中,读取其中的数据,以最后一个流对象的结尾作为该流的结尾

构造函数

SequenceInputStream(InputStream in1,InputStream in2)

将两个读取流合并成一个流

SequenceInputStream(Enumeration<? Extends InputStream> en)

将多个流存入集合后可实现多个流合并

练习文件切割

代码示例

class SplitFileDemo

{

 

       public static void main(String[] args) throws Exception

{

 

              File file = new File("c:\\1.mp3");

 

              splitFile (file);

       }

 

       private static void splitFile (File file) throws IOException

{

 

              // 用读取流关联源文件。

              FileInputStream fis = new FileInputStream(file);

 

              // 定义一个1M的缓冲区。

              byte[] buf = new byte[1024*1024];

 

              // 创建目的。

              FileOutputStream fos = null;

 

              int len = 0;

              int count = 1;

             

              Properties prop  = new Properties();

             

              File dir = new File("c:\\partfiles");

              if (!dir.exists())

                     dir.mkdirs();

 

              while ((len = fis.read(buf)) != -1) {

 

                     fos = new FileOutputStream(new File(dir, (count++) + ".part"));

                     fos.write(buf, 0, len);

                     fos.close();

              }

             

              //将被切割文件的信息保存到prop集合中。

              prop.setProperty("partcount", count+"");

              prop.setProperty("filename", file.getName());

             

              fos = new FileOutputStream(new File(dir,count+".properties"));

             

              //prop集合中的数据存储到文件中。

              prop.store(fos, "save file info");

 

              fos.close();

              fis.close();

 

       }

 

       public static void splitFile(File file) throws IOException {

 

              // 用读取流关联源文件。

              FileInputStream fis = new FileInputStream(file);

 

              // 定义一个1M的缓冲区。

              byte[] buf = new byte[1024*1024];

 

              // 创建目的。

              FileOutputStream fos = null;

 

              int len = 0;

              int count = 1;

 

              File dir = new File("c:\\2.mp3 ");

              if (!dir.exists())

                     dir. creatNewFile();

 

              while ((len = fis.read(buf)) != -1) {

 

                     fos = new FileOutputStream(new File(dir, (count++) + ".part"));

                     fos.write(buf, 0, len);

              }

 

              fos.close();

              fis.close();

 

       }

 

}

练习-合并多个读取流

代码示例

import java.util.*; 

import java.io.*; 

 

class  SequenceInputStreamDemo 

    public static void main(String[] args)throws IOException 

    { 

        ArrayList<InputStream> al=new ArrayList<InputStream>();//创建ArrayList集合,并添加相关流对象 

         al.add(new FileInputStream("1.txt")); 

        al.add(new FileInputStream("2.txt")); 

        al.add(new FileInputStream("3.txt")); 

       Iterator<InputStream>=al.iterator()

 

        Enumeration<InputStream> en=new  Enumeration<InputStream>()

       {

              public boolean hasMoreElements()

              {

                     return it.hasNext();

              }

              public InputStream nextElement()

              {

                     return it.next();

              }

             

       }//创建枚举子类对象 

        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(); 

 

--------------------- android培训java培训、java学习型技术博客、期待与您交流! -------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值