Java上路18-I/O-File


一. File:

File对象可以表示文件或者目录,利用它可对文件或目录的属性进行基本操作。也可以查询文件的基本信息,并进行修改。

  构造函数  

  File file = new File (“ Demo.txt ”) ; 

  在默认目录创建文件 

  File file = new File (“ C : \\”,“ Demo.txt ”) ;  

  以字符串形式,在指定目录创建文件   

  File file = new File (  File,“ Demo.txt ”) ;

  以文件形式,在指定目录创建文件 

 

 常用方法

 描述

       增

  file. createNewFile() ;

  创建声明的文件 

  file.mkdir() ;

  创建声明的目录 

       删

  file.delete() ;

  删除文件或目录

  file.deleteOnExit() ;

  程序结束后删除

       改

  renameTo() ;

  重命名

  setReadOnly() ;

  设置只读

       查

  file.exists ( ) ; 

  判断文件或目录是否存在 

  file.isFile ( ) ; 

  判断是否是文件 

  file.isDirectory ( ) ; 

  判断是否是目录 

  file.getName ( ) ;  

  获取文件或目录的名称 

  file.getPath ( ) ; 

  获取文件或目录的路径 

  file.getAbsolutePath ( ) ; 

  获取文件或目录的绝对路径 

  file.lastModified ( ) ; 

  获取文件或目录的最后修改日期 

  file.length ( ) ; 

  获取文件或目录的大小(字节) 

 

1. 例子:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
 
class FileDemo
{
       public static void main(String[] args) throws IOException
       {
              File file1=new File("Demo.txt"); //创建文件操作器
              file1.createNewFile();
              test("file1is a file : "+file1.isFile());   //判断是否为文件
              test("thename of file1 is : "+file1.getName());      //查询文件名
              file1.renameTo(new File("MyDemo.txt"));       //重命名
              test("thenew name of file1 is : "+file1.getName()+
                     ". File 类的实例是不可变的;一旦创建,File对象表示的抽象路径名将永不改变");
             
              File file2=new File("Demo.java");
              file2.createNewFile();
              test("\nfile2is a directory  :"+file2.isDirectory ());      //判断是否为文件夹
             
              File file3=new File("Demo");      //创建目录
              file3.mkdir();
              test("\nfile3is a exist : "+file3.exists());   //判断是否存在
              test("file3is a directory  :"+file3.isDirectory());
 
              File file4=new File("file.txt");
              FileWriter fw=new FileWriter("file.txt");
              BufferedWriter bw=new BufferedWriter(fw);
              bw.write("thisis a file.");
              bw.flush();
              fw.close();
              test("\nthelength of file4 is : "+file4.length()+" byte");       //判断大小
              test("thepath of file4 is : "+file4.getPath());   //获取路径
              test("theabsolute path of file4 is : "+file4.getAbsolutePath());   //获取绝对路径
              Date date=new Date(file4.lastModified());
              test("thelast modified of file4 is : "+date);     //获取最后编辑时间
             
              String txtfile="new file.txt";
              File file5=new File("c:\\", txtfile);
              file5.createNewFile();
              test("\nfile5is a exist : "+file5.exists());   //判断是否为文件夹
              file5.delete(); //删除文件
 
              File file6=new File(file3, "new demo.java");
              file6.createNewFile();
              test("\nfile6is a exist : "+file6.exists());   //判断是否为文件夹
              file6.deleteOnExit();
       }
 
       publicstatic void test(Object obj)
       {
              System.out.println(obj);
       }
}

 

2. 层级列表:

                          方法

                                          说明

  list ( ) ;

  返回全部的文件夹和文件(不包括子目录)的名称数组  

  list (FilenameFilter filter ) ;

  返回指定类型的文件

  listFiles ( ) ;

  返回全部的文件夹和文件(不包括子目录)的对象数组  

  listFiles ( FilenameFilter filter ) ;  

  返回指定类型的对象

import java.io.File;
import java.io.FilenameFilter;
 
class FileDemo
{
       public static void main(String[] args)
       {
/*
              File[] files=File.listRoots();  //获取所有盘符-驱动器
              for(File f:files)
              {
                     test(f);
              }
 
              File file=new File("e:/javatest");
              String[] names=file.list();    //获取所有文件及目录的名称
              for(String s:names)
              {
                     test(s);
              }
*/
              //filter();
 
              File dir=new File("e:/javatest");
              dir(dir);
       }
 
       publicstatic void dir(File dir)
       {
              test("\n目录:"+dir);
              File[] files=dir.listFiles();
              for(int x=0; x<files.length; x++)
              {
                     if(files[x].isDirectory())
                     {
                            dir(files[x]);   //递归,查询子目录
                     }
                     else
                     {
                            test(files[x]);
                     }
              }
       }
 
/*
递归:
       务必有终止条件
       合理设置执行次数
*/
 
       public static void filter()
       {
              File file=new File("e:/javatest");
              String[] names=file.list(
              //匿名内部类
              new FilenameFilter()
              {
                     //此时两个参数是自动装入的
                     public boolean accept(File dir, String name)
                     {
                            return name.endsWith(".txt");   //只返回封装目录下的txt文件
                     }
              }
              );     //获取指定文件对象
              for(String s:names)
              {
                     test(s);
              }
       }
 
       public static void test(Object obj)
       {
              System.out.println(obj);
       }
}


3. 删除文件及文件夹:

import java.io.File;
 
class FileDemo
{
       public static void main(String[] args)
       {
              File dir=newFile("e:/javatest/demo");
              removeDir(dir);
       }
 
       public static void removeDir(File dir)
       {
              File[] files=dir.listFiles();
 
              for(int x=0; x<files.length; x++)
              {
                     if(files[x].isDirectory())
                     {
                            removeDir(files[x]);
                     }
                     else
                     {
                            System.out.println(files[x].toString()+"--file--"+files[x].delete());
                     }
              }
              System.out.println(dir+"--dir--"+dir.delete()+"\n");
       }
 
       public static void test(Object obj)
       {
              System.out.println(obj);
       }
}

从执行的结果来看,Demo或demo都可以被删除。

 

4. 提取所有的java文件名单到txt文件:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
class FileDemo
{
       public static void main(String[] args) throws IOException
       {
              File dir=new File("e:/javatest");
              List<File> list=new ArrayList<File>();
              fileToList(dir,list);  //提取java文件到集合
 
              File file=new File(dir, "javatest.txt");
              writeToFile(list,file.toString());   //将集合内容保存到文本文件
       }
 
       public static void writeToFile(List<File> list, String javaListFile) throws IOException
       {
              BufferedWriter bufw=null;
              try
              {
                     bufw=new BufferedWriter(new FileWriter(javaListFile));
                     for(File f:list)
                     {
                            String path=f.getAbsolutePath();
                            bufw.write(path);
                            bufw.newLine();
                            bufw.flush();
                     }
              }
              catch(IOException e)
              {
                     throwe;
              }
              finally
              {
                     try
                     {
                            if(bufw!=null)
                            {
                                   bufw.close();
                            }
                     }
                     catch(IOException e)
                     {
                            throwe;
                     }
              }
       }
 
       public static void fileToList(File dir, List<File> list)
       {
              File[] files=dir.listFiles();
              for(File file:files)
              {
                     if(file.isDirectory())
                     {
                            fileToList(file,list);
                     }
                     else
                     {
                            if(file.getName().endsWith(".java"))
                            {
                                   list.add(file);
                            }
                     }
              }
       }
}


二. Properties:

       java.util.Properties,可将数据保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。可与IO结合的集合容器。

 

方法

说明

  查   

  getProperty(String key)

    用指定的键在此属性列表中搜索属性

  load(InputStream inStream)

    从输入流中读取键和元素对

   list(PrintStream out)

    将属性列表输出到指定的输出流

  stringPropertyNames()

    返回此属性列表中的键集

  setProperty(String key, String value)

    调用 Hashtable 的put方法

  store(OutputStream out, String comments)

    将此 Properties 表中的属性列表(键和元素对)写入输出流   

import java.io.*;
import java.util.*;
 
class FileDemo
{
       public static void main(String[] args) throws IOException
       {
              //File file=new File("info.txt");
              //file.createNewFile();
 
              //creat();       //创建集合对象,写入文本文件
              //gets(); //查询(文本文件内容全部是有效的)
              load();    //使用Properties的已有方法查询
       }
 
       public static void load() throws IOException
       {
              Properties prop=new Properties();
              FileInputStream fis=new FileInputStream("info.txt");
              prop.load(fis);      //加载字符流
              prop.list(System.out);
       }
 
       public static void gets() throws IOException
       {
              BufferedReader bufr=new BufferedReader(new FileReader("info.txt"));
              String line=null;
              Properties prop=new Properties();
              while((line=bufr.readLine())!=null)
              {
                     String[] arr=line.split("=");
                     prop.setProperty(arr[0],arr[1]);
              }
              bufr.close();
              System.out.println(prop);
       }
 
       public static void creat() throws IOException
       {
              Properties prop=new Properties();
              prop.setProperty("wangwu","39");  //插入键值对
              prop.setProperty("wangliu","35");
              prop.setProperty("wangqi","49");
              //prop.setProperty("wangwu","50");      //覆盖已有的键
              FileOutputStream fos=new FileOutputStream("info.txt");
              prop.store(fos,"this is a tab");  //将此 Properties 表中的属性列表(键和元素对)写入输出字符
              //prop.list(System.out);      //在控制台打印
              fos.close();    //     关闭前自动flush
       }
}


 例子:

       限制使用次数:

import java.io.*;
import java.util.*;
 
class FileDemo
{
       public static void main(String[] args) throws IOException
       {
              Properties prop=new Properties();
              File file=new File("count.ini");
              if(!file.exists())
              {
                     file.createNewFile();
              }
              FileInputStream fis=new FileInputStream(file);      //读
              prop.load(fis);
              intcount=0;
              String value=prop.getProperty("time");  //读取键值
              if(value!=null)
              {
                     count=Integer.parseInt(value);
                     if(count>=5)
                     {
                            System.out.println("拿钱来!");
                            return;
                     }
              }
              count++;      //将读取的键值递增后重新写入
              prop.setProperty("time",count+"");
              FileOutputStreamfos=new FileOutputStream(file);
              prop.store(fos,"");
              fos.close();
              fis.close();
       }
}


三. 其它常用IO类:

SequenceInputStream:合并流

PrintWriter:打印流

import java.io.*;
import java.util.*;
 
class FileDemo
{
       public static void main(String[] args) throws IOException
       {
              //cut();   //拆分mp3文件
              //merge();     //合并mp3
              //sequenceInputStreamDemo();      //合并流(文本文件)
              printWriterDemo();     //打印流
       }
 
       public static void cut() throws IOException
       {
              FileInputStream fis=new FileInputStream("demo.mp3");     //字节读取流,封装图片文件
              FileOutputStream fos=null;       //字节写入流
              byte[] buf=new byte[1024*1024];   //1M大的字节数组
              int len=0;
              int count=1;
              //读取1m大的量的字节存入buf,同时存入len
              while ((len=fis.read(buf))!=-1)
              {
                     fos=new FileOutputStream((count++)+".tmp");   //字节写入流封装一个新的tmp文件
                     fos.write(buf, 0, len);   //写入刚才的数据(数据,位置,长度)
                     fos.close();    //刷新缓冲区写入文件,然后关闭
              }
              fis.close();
       }
 
       public static void merge() throws IOException
       {
              ArrayList<FileInputStream> al=new ArrayList<FileInputStream> ();
              for (int x=1; x<=3; x++)
              {
                     al.add(new FileInputStream(x+".tmp")); //将3个tmp文件存入集合
              }
              finalIterator<FileInputStream> it=al.iterator();     //迭代
              Enumeration<FileInputStream> en=new Enumeration<FileInputStream> ()   //枚举
              {
                     public booleanhasMoreElements()
                     {
                            return it.hasNext();
                     }
                     public FileInputStreamnextElement()
                     {
                            return it.next();
                     }
              };
              SequenceInputStream sis=new SequenceInputStream(en); //合并流
              FileOutputStream fos=new FileOutputStream("new demo.mp3");
              byte[] buf=new byte[1024];
              int len=0;
              while ((len=sis.read(buf))!=-1)
              {
                     fos.write(buf, 0, len);
              }
              fos.close();
              sis.close();
       }
 
       public static void sequenceInputStreamDemo() throws IOException
       {
              Vector<FileInputStream> v=new Vector<FileInputStream> ();
              v.add(new FileInputStream("1.txt"));
              v.add(new FileInputStream("2.txt"));
              v.add(new FileInputStream("3.txt"));
              Enumeration<FileInputStream> en=v.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();
       }
 
       public static void printWriterDemo ()throws IOException
       {
              BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
              PrintWriter out=new PrintWriter(System.out, true);     //打印流,自动刷新
              String line=null;
              while((line=bufr.readLine())!=null)
              {
                     if("over".equals(line))
                     {
                            break;
                     }
                     out.println(line.toUpperCase());
                     //out.flush(); //已经启动自动刷新缓冲区
              }
              out.close();
              bufr.close();
       }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值