黑马程序员——Java之IO流(二)

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


一、File类


File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修

改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。

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

1、创建

public boolean createNewFile() throwsIOException 创建新文件,并返回true,如果有这个文件则不创建,返回false。

public static File createTempFile(Stringprefix,String suffix) throws IOException 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。

public static File createTempFile(Stringprefix, String suffix, File directory) throws IOException在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。

 

public boolean mkdir()创建目录,只能创建一级目录。

public boolean mkdirs()创建目录,能创建多级目录。

2、删除

public boolean delete( )    删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。

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

3、判断

public boolean exists() 判断文件或目录是否存在。

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

public boolean isHidden()判断是否是一个隐藏的文件。

public boolean isDirectory()判断是否是目录。

public boolean isAbsolute()判断是否是绝对路径。

public boolean canExecute()判断文件是否可执行。

public boolean canRead()判断文件是否可读。

public boolean canWrite()判断文件是否可写。

4、获取

public String getName()获取文件或目录的名称。

public String getParent()获取父目录的路径。

public String getPath()获取相对路径。

public String getAbsolutePath()获取绝对路径

public long lastModified() 获取文件最后一次被修改的时间。

public long length()获取文件的长度。

 

public static File[] listRoots()列出系统中所有的系统根目录。

public String[] list() 获取指定路径下的文件和目录。调用list方法时,file对象必须是一个目录不能是文件,该目录还必须存在。

public String[] list(FilenameFilter filter)获取指定目录下的指定文件的名称。

 

public File[] listFiles() 返回指定路径下的文件或目录的对象列表。

public File[] listFiles(FilenameFilterfilter)获取过滤掉文件名的文件列表。

public File[] listFiles(FileFilter filter) 获取过滤掉文件的列表


5、练习

(1)过滤指定的文件名;

class Test8
{
       publicstatic void method_1(File f){
              String[]str=f.list(new FilenameFilter(){
                     publicboolean accept(File dir,String name){
                            returnname.endsWith(".jpg");
                     }
              });
              for(Strings:str){
                     System.out.println(s);
              }
       }


(2)获取目录下的所有文件(包含目录中目录中的文件)

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

递归要注意:限定的条件和递归的次数,次数太多会内存溢出。

     

  publicstatic void method_2(File f){
              File[]file=f.listFiles();//获取目录下的所有目录和文件对象列表。
              for(intx=0;x<file.length;x++){
                     if(file[x].isDirectory()){
                            System.out.println("--"+file[x]);
                            method_2(file[x]);
                     }
                     else
                     System.out.println("   ---"+file[x]);
              }
       }
       //3.删除文件及目录;删除原理:在windows中删除文件时从里往外删除。
       publicstatic void method_3(File f){
              File[]file=f.listFiles();
              for(intx=0;x<file.length;x++){
                     if(file[x].isDirectory())
                            method_3(file[x]);
                     else
                            System.out.println("删除文件"+file[x].toString()+file[x].delete());
              }
              System.out.println("删除文件夹"+f.toString()+f.delete());
       }
       //4.制作文件路径列表清单。
       //(1)将获取到的目录及文件都存放在List集合中。
       publicstatic List<File> method_4(File f,List<File> list){
              File[]file=f.listFiles();
              for(intx=0;x<file.length;x++){
                     if(file[x].isDirectory())
                            method_4(file[x],list);
                     else
                            list.add(file[x]);
              }
              returnlist;
       }
       //集合中的元素使用输出流输出到一个文件中。
       publicstatic void access(List<File> list,String str){
              BufferedWriterbw=null;
              try{
                   bw=new BufferedWriter(newFileWriter(str));
                      for(File f:list){
                             String path=f.getAbsolutePath();//获取绝对路径
                             bw.write(path);//将路径通过写入流写入到文件。
                             bw.newLine();//换行
                             bw.flush();//刷新
                      }
 
              }
              catch(Exceptione){
                     thrownew RuntimeException("写入错误");
              }
              finally{
                     if(bw!=null)
                            try{
                            bw.close();
                     }
                     catch(Exceptione){
                            thrownew RuntimeException("关闭写入流错误");
                     }
              }
       }
       publicstatic void main(String[] args){
              Filedir=new File("E:\\IO\\运维周报日报");
              //method_1(dir);
              //method_3(dir);
              List<File>list=new ArrayList<File>();
              List<File>lifi=method_4(dir,list);
              Filefile=new File(dir,"文件路径.txt");
              access(lifi,file.toString());
       }
}


二、RandomAccessFile类


该类不是IO体系中的子类,但是他是IO包的成员,因为他具备读取和写的功能。内部封装了一个数组,而且通过指针对数组元素进行操作。可以通过getFilePointer获取指针位置。同时可以通过seek改变指针的位置。

其实完成读写的原理就是内部封装了字节输入流和字节输出流。

(1)该对象只能操作文件,所以构造函数接收两种类型的参数:

a.字符串文件路径;

b.File对象。


(2)该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)

如果模式为r, 则不会创建文件,读取一个已存在的文件,如果文件不存在,则异常。

如果模式为rw, 操作的文件不存在的话,会创建一个文件,如果存在则不会被覆盖。

注意:

该对象在实例化时,如果要操作的文件不存在,会自动创建;如果文件存在,写数据未指定位置,会从头开始写,即覆盖原有的内容。可以用于多线程下载或多个线程同时写数据到文件。

练习:

public class RandomAccessFileDemo {
     public static void write(){
         File f= new File("E:\\IO\\RandomAccessFileDemo.txt" );
          try {
              RandomAccessFile raf= newRandomAccessFile(f,"rw" );
              raf.write( "张三" .getBytes());
              raf.writeInt(20);
              raf.write( "李四" .getBytes());
              raf.writeInt(2);
              raf.seek(8*3);
              raf.write( "马六" .getBytes());
              raf.writeInt(2);
              raf.seek(8*2);
              raf.write( "王五" .getBytes());
              raf.writeInt(2);
              raf.close();
         } catch (Exception e) {
               // TODO Auto-generated catchblock
              e.printStackTrace();
         }
    }
     public static void read(){
          try {
              RandomAccessFile raf= newRandomAccessFile("E:\\IO\\RandomAccessFileDemo.txt" ,"r" );
              //raf.write(333);
               //调整对象中的指针。
               //raf.seek(7);
               //跳过指定字节
              raf.skipBytes(2);
             byte [] buff=new byte[1024];
              raf.read(buff);
              System. err .println(newString(buff));
              raf.close();
         } catch (Exception e) {
              e.printStackTrace();
         }
    }
     public static void main(String[] args) {
     //read();
     write();
    }
}


三、Properties类


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

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

该对象的特点,可以用于键值对形式的配置文件。

在加载数据时,需要数据有固定格式,一般为键=值。

练习:软件免费使用五次,大于五次则需要付费
class PropertiesDemo
{
       publicstatic void pay(){
              Propertiespro=new Properties();
              try{
                     Filef=new File("E:\\IO\\RunCount.ini");
                     if(!f.exists())
                            f.createNewFile();
                     FileReaderfr=new FileReader(f);
                     pro.load(fr);
                     Stringvalue=pro.getProperty("time");
                     intcount=0;
                     if(value!=null)
                            count=Integer.parseInt(value);
                     if(count>=5){
                            System.out.println("使用次数已到,请付款");
                            return;
                     }
                     count++;
                     pro.setProperty("time",count+"");
                     FileWriterfw=new FileWriter(f);
                     pro.store(fw,"使用次数");
                     fr.close();
                     fw.close();   
              }
              catch(Exceptione){
                     e.printStackTrace();
              }
       }
       publicstatic void main(String[] args){
              pay();
       }
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值