您的位置:首页 > 编程语言 > Java开发

Java上路18-I/O-File

2012-12-03 11:25 246 查看
一. 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();
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息