码迷,mamicode.com
首页 > 其他好文 > 详细

IO流 2

时间:2015-09-25 18:28:30      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

File类
 
用来将文件或者文件夹封装成对象
方便对文件与文件夹的属性信息进行操作 。
File对象可以作为参数传递给流的构造函数。
了解File类中的常用方法。
 
1.概述
          //将a.txt封装成File对象
          //可以将已有的和未出现的文件或者文件夹封装成对象。
 
          //文件路径
          File f1 = new File("d:\\FileDemo\\a.txt");
 
          //父目录,文件名
          File f2 = new File("d:\\FileDemo\\abc", "b.txt");
         
          //目录
          File d = new File("d:\\FileDemo\\abc");//
          //父目录,文件名
          File f3 = new File(d,"d.txt");

          //跨平台分隔符separator
          File f4 = new File("c:"+File.separator+"d.txt");

 

 
2.创建和删除
 
2.1.创建
    1)创建文件
    boolean createNewFile(); 
       在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
       和输出流不一样,输出流对象一建立就会创建对象。且如果文件已经存在,会覆盖。
 
File f = new File("d:\\FileDemo\\file.txt");
f.createNewFile();

 

 
创建临时文件
createTempFile(String prefix, String suffix);
createTempFile(String prefix, String suffix, File directory);
 
          2)创建目录
              boolean mkdir();   创建文件夹(只能创建1级目录)
              boolean mkdirs();  创建多级文件夹
 
2.2 删除
          1) 删除
               boolean delete();     删除失败返回false。
               void deleteOnExit(); 在程序退出时删除指定文件。
3. 判断
          1)  文件是否可以执行
    
      File f = new File("d:\\FileDemo\\file.txt");
         sop("execute" + f.canExecute());
2) 文件是否存在
     boolean exists()
3)是否是文件 和 是否是目录
     注意 首先要判断该文件对象封装的内容是否存在 通过exists()判断
               boolean isDirectory()
               boolean isFile()
          4)判断是否是隐藏文件
               isHidden()
          5)判断是否是绝对路径 不需要文件存在
               boolean isAbsolute()
 
4.获取信息
          getName();   // 获取文件名称
          getPath();     // 返回对象封装的路径、
 
          getParent(); //该方法返回对象封装路径中的父目录,如果是相对路径,返回空
                            //如果路径中有上一层目录,那么该目录就是返回结果
 
          File getAbsoluteFile(); //返回绝对路径的File对象
          String getAbsolutePath();//返回绝对路径
 
          lastModified();
          length();
 
f1.renameTo(f2)  //可以是不同的目录 相当于剪切
          
3.文件列表
 
3.1 listRoots和list方法
 
public static File[] listRoots()     //listRoots列出机器中的盘符     
public String[] list()                    //list列出目录中的内容
 
调用list方法的file对象必须是封装了一个目录。该目录还必须存在.
如果不存在返回空指针异常
 
 
import java.io.*;

class FileDemo2
{
     public static void main(String[] args)
     {
          //listRootsDemo();    
          listDemo();
     }
     public static void listDemo()
     {
          //File f = new File("c:\\abc.txt");
          File f = new File("c:\\");

          String[] names = f.list();//调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
          for(String name:names)
          {
               System.out.println(name);
          }
     }
     public static void listRootsDemo()
     {
          File[] files = File.listRoots();

          for(File f:files)
          {
               System.out.println(f.length());
          }
     }
}
 

 

3.2 文件列表 FilenameFilter
 
public String[] list(FilenameFilter filter)
 
FilenameFilter是一个接口,里面只有一个方法:
boolean accept(File dir, String name)
 
//列出d盘中所有的txt文件
public static void listDemo2()
     {
          File dir = new File("d:\\");
          String[] arr = dir.list(new FilenameFilter()
                    {
                         public boolean accept(File dir,String name)
                         {
                              //System.out.println("dir:"+dir+"name:"+name);
                              return name.endsWith("txt");
                         }
                    }
                   
                    );

          System.out.println("len:"+arr.length);
          for(String name:arr)
          {
               System.out.println(name);
          }

     }
 

 

 
3.3 File[] listFiles();
 
    
 public static void listDemo3()
 {
      File dir = new File("d:\\");
      File[] files = dir.listFiles();

      for(File f:files)
      {
           System.out.println(f.getName()+"::"+f.length());
      }    
 }

 

 
4 列出目录下所有内容
 
列出指定目录下文件或者文件夹,包含子目录中的内容
也就是列出指定目录下所有内容
 
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归

递归要注意:
 
1,限定条件。
2,要注意递归的次数。尽量避免内存溢出
 
列出目录下所有内容 - 带层次
 
 
/*
*     列出指定目录下文件或者文件夹,包含子目录中的内容
*     也就是列出指定目录下所有内容
*
* */
import java.io.*;

class FileDemo3
{
     public static void main(String[] args)
     {
          File dir = new File("c:/java");

          showDir(dir, 0);
          //toBin(6);
     }
     public static String getLevel(int level)
     {
          StringBuilder sb = new StringBuilder();
          sb.append("|--");
          for(int i = 0; i < level; i++)
          {
               //sb.append("|--");
               sb.insert(0,"|  ");
          }
          return sb.toString();
     }
     //递归  打印目录中的所有文件
     public static void showDir(File dir, int level)
     {
          System.out. println(getLevel(level)+dir.getName());
          level++;

          File[] files = dir.listFiles();
          for(int i = 0; i < files.length; i++)
          {
               if(files[i].isDirectory())
                    showDir(files[i], level);
               else
                    System.out.println(getLevel(level)+files[i]);
          }
     }
     //递归 十进制转成二进制
     public static void toBin(int num)
     {
          if(num > 0)
          {
               toBin(num/2);
               System.out.println(num%2);
          }
     }


}
 

 

5 删除带内容的目录

/*
删除一个带内容的目录。
删除原理:
在window中,删除目录从里面往外删除的。

既然是从里往外删除。就需要用到递归。

*/
import java.io.*;
class  RemoveDir
{
     public static void main(String[] args)
     {
         
          File dir = new File("d:\\testdir");
          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());
     }

}

 



6. 创建java文件列表
 
/*
练习
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表文件。

思路:
1,对指定的目录进行递归。
2,获取递归过程所以的java文件的路径。
3,将这些路径存储到集合中。
4,将集合中的数据写入到一个文件中。

*/
import java.io.*;
import java.util.*;

class JavaFileList
{
     public static void main(String[] args) throws IOException
     {
          File dir = new File("c:\\java");
         
          List<File> list = new ArrayList<File>();

          fileToList(dir,list);

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

          writeToFile(list, file.toString());
     }
     //将文件目录中的.java文件对象存储到List中
    
     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);
               }
          }
     }
     //将List<File>对象 打印成一个文件
     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)
          {
               throw e;
          }
          finally
          {
               try
               {
                    if(bufw!=null)
                         bufw.close();
               }
               catch(IOException e)
               {
                    throw e;
               }

          }

     }
}

 

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

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

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

那么在加载数据时,需要数据有固定格式:键=值。

方法:
 
1.  //通过 键值 搜索(获得) 属性
 
     String getProperty(String key); 
 
2.  //调用Hashtable的方法put.
 
     Objext setProperty(String key,String value)
 
3. //返回此属性列表中的键集
 
     Set<String> stringPropertyNames()
 
4.  //从输入流中读取属性列表(键和元素对)
 
     void load(InputStream inStream)
     void load(Reader reader)
     
5.  //将属性列表输出到指定的输出流
 
    void list(PrintStream out) 
    void list(PrintWriter out) 
     
6.  //将属性列表写入输出流
     //修改完数据并写入文件
 
     void store(OutputStream out ,String comments)
     //comments是注释 前面有#修饰 不会被Properties读取
 
练习
用于记录应用程序运行次数。
如果使用次数已到,那么给出注册提示。
很容易想到的是:计数器。
但是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。
可是随着该应用程序的退出,该计数器也在内存中消失。
下一次在启动改程序,又重新开始从0计数。
所以
限制程序运行次数。当运行次数到达5次时,给出,请您注册的提示。并不再让该程序执行。
 
     //演示,如何将流中的数据存储到集合中。
     //想要将info.txt中键值数据存到集合中进行操作。
     /*
          1,用一个流和info.txt文件关联。
          2,读取一行数据,将该行数据用"="进行切割。
          3,等号左边作为键,右边作为值。存入到Properties集合中即可。

     */     
 
XML
 
加入10个人的信息
<persons>
     <person id="001">
          <name>zhangsan</name>
          <age>30</age>
          <address>bj</address>
     </person id=‘002">
     <person>
     </person>
</persons>
//包 用于读取xml
dom4j  //dom for java
 
8 PrintWriter
 
打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。

字节打印流
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
 
字符打印流
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。
PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。
方法
     构造函数  自动刷新
 
import java.io.*;

class PrintStreamDemo
{
     public static void main(String[] args) throws IOException
     {
          BufferedReader bufr =
               new BufferedReader(new InputStreamReader(System.in));
        
          //为true自动刷新
          PrintWriter out = new PrintWriter(System.out,true); 

          String line = null;

          while((line = bufr.readLine()) != null)
          {
               if(line.equals("over"))
                    break;
               out.println(line.toUpperCase());
               //out.flush();
          }

          out.close();
          bufr.close();
     }
}
/*
BufferedReader bufr =
     new BufferedReader(new InputStreamReader(System.in));
*/

 

 
 
9 合并流
对多个流进行合并
SequenceInputStream
构造函数
 
SequenceInputStream(InputStream s1, InputStream s2)
SequenceInputStream(Enumeration<? extends InputStream> e)
 
import java.io.*;
import java.util.*;
class SequenceDemo
{
     public static void main(String[] args) throws IOException
     {

          Vector<FileInputStream> v = new Vector<FileInputStream>();
         
          v.add(new FileInputStream("c:\\1.txt"));
          v.add(new FileInputStream("c:\\2.txt"));
          v.add(new FileInputStream("c:\\3.txt"));

          Enumeration<FileInputStream> en = v.elements();

          SequenceInputStream sis = new SequenceInputStream(en);

          FileOutputStream fos = new FileOutputStream("c:\\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();

     }
}

 

 
10  切割文件
 

import java.io.*;
import java.util.*;

class SplitFile
{
     public static void main(String[] args) throws IOException
     {
          //splitFile();
          merge();
     }
 
     //合并文件
     public static void merge()throws IOException
     {
          ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();

          for(int x=1; x<=3; x++)
          {
               al.add(new FileInputStream("c:\\splitfiles\\"+x+".part"));
          }

          final Iterator<FileInputStream> it = al.iterator();

          Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
          {
               public boolean hasMoreElements()
               {
                    return it.hasNext();
               }
               public FileInputStream nextElement()
               {
                    return it.next();
               }
          };

          SequenceInputStream sis = new SequenceInputStream(en);


          FileOutputStream fos = new FileOutputStream("c:\\splitfiles\\0.bmp");

          byte[] buf = new byte[1024];

          int len = 0;

          while((len=sis.read(buf))!=-1)
          {
               fos.write(buf,0,len);
          }

          fos.close();
          sis.close();
     }
     //切割文件,按1M
     public static void splitFile()throws IOException
     {
          FileInputStream fis =  new FileInputStream("c:\\1.bmp");

          FileOutputStream fos = null;


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

          int len = 0;
          int count = 1;
          while((len=fis.read(buf))!=-1)
          {
               fos = new FileOutputStream("c:\\splitfiles\\"+(count++)+".part");
               fos.write(buf,0,len);
               fos.close();
          }
         
          fis.close();
         
     }
}
 

 

IO流 2

标签:

原文地址:http://www.cnblogs.com/chasingw/p/4838831.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!