黑马程序员——>第二十天<io流(File-Proterties-合并流-切割文件)>

来源:互联网 发布:车工钳工 知乎 编辑:程序博客网 时间:2024/04/25 19:55

-------android培训java培训、期待与您交流-------

01IO流(File概述)

file类
  用来将文件或者文件夹封装成对象
  方便对文件与文件夹的属性信息进行操作       流对象无法操作文件夹   无法操作文件夹的属性信息
  file对象可以作为参数传递给流的构造函数        流只能操作数据
  了解file类中的常用方法

想要操作被数据封装成文件的信息,必须得用file对象

file类是文件和目录路径名的抽象表示形式
  separator  与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串  目录分隔符

//创建File对象 public static void consMethod()  // 构造方法演示 {  //将a.txt封装成file对象。可以将已有的和未出现的文件或者文件夹封装成对象。  File f1 = new File("a.txt");// 相对路径      File f2 = new File("c:\\abc","b.txt"); //逗号左边是父目录 右边是指目录中的文件名                        // 将目录和文件分开成两个参数来传递                       //好处:操作的目录不变,目录下的文件可以是变化的  File d = new File("c:\\abc");    //封装目录  File f3 = new File(d,"c.txt");  sop("f1:"+f1);   //将file对象作为字符串打印一下  sop("f2:"+f2);   //里边封装成什么  打印结果就是什么  sop("f3:"+f3);  File f4 = new File("c:"+File.separator+"abc"+File.separator+"zzz"+File.separator+"a.txt");  // 这句话可以实现跨平台     separator 目录分隔符 }

02IO流(File对象功能-创建和删除)

File类常见方法:
1,创建。
 boolean createNewFile():
在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
      和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

 boolean mkdir():创建文件夹。
 boolean mkdirs():创建多级文件夹。
2,删除。
 boolean delete():
删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
 void deleteOnExit();在程序退出时删除指定文件。

03IO流(File对象功能-判断)


3,判断。
 boolean exists() :
文件是否存在.
 isFile():  是否是一个标准文件
 isDirectory(); 是否是一个目录
 isHidden(); 是否是一个隐藏文件   尽量不要访问隐藏文件
 isAbsolute(); 是否为绝对路径名
 canExecute()  文件是否可以被执行

public static void method_2()         {  File f = new File("file.txt");     //sop("exists:"+f.exists());   //是否存在//在用流操作对象时,只有文件存在才能去读取,如果文件不存在,流一读就该抛异常了。所以我们可以先判断,这就是把文件封装成对象的好处  //sop("execute:"+f.canExecute());   canExecute()  文件是否可以被执行//只要文件可执行,就挂上 runtime对象就可以把你本机里边所有能执行文件全部打开  //创建文件夹  File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");//只能创建一级目录   这种是不行的  sop("mkdir:"+dir.mkdirs());    //创建多级目录若是mkdir 则只能创建一级目录 }  //记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。  //通过exists判断。  sop("dir:"+f.isDirectory());  //是目录吗?  sop("file:"+f.isFile());    //是文件吗?  sop(f.isAbsolute());  //再判断路径是否为绝对路径时用这个方法完成 }


04IO流(File对象功能-获取)
4,获取信息。

  返回值类型是字符串  string
 getName():  获取名称
 getPath():  获取路径
 getParent():  获取父目录  
getPath():getParent():俩一起就是getAbsolutePath()


 getAbsolutefile()      也是返回绝对路径,但是他把返回的绝对路径封装成了对象   返回值是file   把file对象 tostring就变成字符串
 getAbsolutePath()     获取绝对路径   返回的是文件的绝对路径  将字符串new就可以变成file对象

 

 long lastModified()     最后一次修改时间
 long length()     文件大小   long 因为数据的体积可能会很大

 

public static void method_4() {  File f = new File("file.txt");  sop("path:"+f.getPath());      //   获取路径  相对路径  你封装的什么路径  就获取什么路径  sop("abspath:"+f.getAbsolutePath());  //获取绝对路径  无论你封装的是相对的还是绝对的  获取的都是绝对的  sop("parent:"+f.getParent());//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。         //如果相对路径中有上一层目录那么该目录就是返回结果。 }

05IO流(File对象功能-文件列表1)

  File[]  listRoots()列出可用的文件系统根  方法是静态方法,因为它不操作具体的特有数据,操作共享数据,不需要对象。   返回来的是file数组,为null就不能被对象指向去遍历(因为里边调用了lenth属性),

public static void listDemo() {  File f = new File("c:\\abc.txt");//把文件封装成对象用list方法调用,会发生空指针异常;当list方法所属对象是一个文件,里边没有东西,不是目录,返回来的数组就为null,  String[] names = f.list();//调用list方法的file对象必须是封装了一个目录。该目录还必须存在。  包含隐藏文件  for(String name : names)  {   System.out.println(name);  } }


06IO流(File对象功能-文件列表2)

接口 FilenameFilter 实现此接口的类实例可用于过滤器文件名。

里边只有一个方法 boolean  accept(File dir, String name)  测试文件列表中指定文件是否应该包含在某一列表中

    你要过滤哪一个目录中的文件要先指定那个目录,目录是未知的;你要过滤目录中的哪一个文件也是未知的
   所以定义了两个参数   而且  符合要求就为真,不符合要求的就为假。   返回值是boolean型的


list
 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
listFiles
 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件

list返回的只有当前目录下的文件以及文件夹名称  只有名称  剩下的什么都没有了
而listFiles方法返回的是当前文件夹下面的文件以及文件夹的对象 而这个里边装的是对象  对象可以通过get name   获取名称,通过length获取大小,通过path获取路径,  

 //也就是说真实开发用这个比较好class  FileDemo2{ public static void main(String[] args)  {  File dir = new File("c:\\");  File[] files = dir.listFiles();  for(File f : files)  {   System.out.println(f.getName()+"::"+f.length());  } }

07IO流(列出目录下所有内容-递归)

列出指定目录下文件或者文件夹,包含子目录中的内容。
也就是列出指定目录下所有内容。

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

递归要注意:
1,限定条件。

2,要注意递归的次数。尽量避免内存溢出。

 public static int getSum(int n) { //求和运算   基数不断向下相加  if(n==1)   return 1;  return n+getSum(n-1); }  //可能会出现内存溢出现象   getSum在内存中运行还没有结束,有调用了它自己,当不断的递归,内存中会存在n多个这个方法, 在不断的创建空间的过程中,因为这个方法调用的太多了,而都没有结束,导致占内存中装不下了。  //超出了 内存的范围  所以用递归时要1,限定条件。2,要注意递归的次数。尽量避免内存溢出。public static void toBin(int num) {  if(num>0)   while   6  {   toBin(num/2);   System.out.println(num%2);  //  打印结果为110   /*   System.out.ptintln(num%2);   num = num/2;   结果为 011   */  } }


 

 //最简单的递归 public static void method() {  method();  // 永远结束不了 }

 

//递归理解showA();void showA(){   showB();   sop(A);}void showB(){   showC();   sop(B);}void showC(){   sop(C);}//打印结果为 C B A}

08IO流(列出目录下所有内容-带层次)
缩进目录

public static String getLevel(int level) {  StringBuilder sb = new StringBuilder();  sb.append("|--");  for(int x=0; x<level; x++)  {   //sb.append("|--");   sb.insert(0,"|  ");  }  return sb.toString(); }


09IO流(删除带内容的目录)


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

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


如果打印结果为false  那么证明你进行过误删除操作   就是对某个文件夹进行了两次删除操作

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

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

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

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

而键值对信息一般都存在一个文件当中,要想去获取这个信息,就得先找到那个文件,而且要操作这个数据,要用到io流技术,   这就是Properties这个对象的由来 
它的特点   不仅可以操作键值对,而且可以操作硬盘上的键值对信息(因为集合的信息要存到内存中)

12IO流(Properties存取)

// 设置和获取元素。 public static void setAndGet() {  Properties prop = new Properties();  //创建一个集合对象  prop.setProperty("zhangsan","30");  // 设置键值对  prop.setProperty("lisi","39");//  System.out.println(prop);  String value = prop.getProperty("lisi"); // 取里边的数据  //System.out.println(value);     prop.setProperty("lisi",89+"");  Set<String> names = prop.stringPropertyNames(); // 将集合里的数据全部遍历出来  返回set集合  for(String s : names)  {   System.out.println(s+":"+prop.getProperty(s));  } }

13IO流(Properties存取配置文件)

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

public static void loadDemo()throws IOException  //load方法原理 {  Properties prop = new Properties();  // 创建一个集合  FileInputStream fis = new FileInputStream("info.txt");  //关联一个文件  //将流中的数据加载进集合。  prop.load(fis);                     // set改变的是内存结果  prop.setProperty("wangwu","39");  //直接操作集合中的元素   修改年龄//在操作时  中间有了其他设置  要进行保存  否则   dos命令行中正确  但是文件中的数据没有改  FileOutputStream fos = new FileOutputStream("info.txt"); // 创建输出流  prop.store(fos,"haha");//将内存结果存到一个流当中//store方法需要一个输出流 fos//凡是带#的都是注释信息  不会被properties进行加载   但是要记住 properties加载的信息必须是键值对  // 不是键值对   加载没有意义 // System.out.println(prop);  prop.list(System.out);   //列出集合目录   打印流  fos.close();  fis.close(); }


 

//演示,如何将流中的数据存储到集合中。
 //想要将info.txt中键值数据存到集合中进行操作。
 /*
  1,用一个流和info.txt文件关联。
  2,读取一行数据,将该行数据用"="进行切割。
  3,等号左边作为键,右边作为值。存入到Properties集合中即可。

 */

 public static void method_1()throws IOException//要读一个文件  是纯文本的  用 filereader//紧跟着   需要缓冲 读一行 存一行 {  BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));//每一次多要从硬盘上获取这些数据往里存比较麻烦  所以Properties集合就提供了一个load方法  //可以直接加载一个字节流或者字符流   但是加载字符流方法是1.6版本才有的  String line = null;  Properties prop = new Properties();  while((line=bufr.readLine())!=null)  {   String[] arr = line.split("=");  //切割   //System.out.println(arr[0]+"...."+arr[1]);  将结果存到Properties中   prop.setProperty(arr[0],arr[1]);  }  bufr.close();  System.out.println(prop); }



  java本身就有取这些数据的对象接口可以表示整个html或xml文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问
              java拿这些数据特别的麻烦,要用 好多对象和好多方法来完成
所以有一帮牛人们  就做了一个更简单的工具:  dom4j   dom for java  这个工具等开发到xml时就必须要用到了

14io流(printWriter)
打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。

字节打印流:
PrintStream
构造函数可以接收的参数类型:
1,file对象。File        凡是和文件相关的流对象都是比较重要的流对象
2,字符串路径。String
3,字节输出流。OutputStream

 

字符打印流:  到web开发时  都需要这个对象,将数据一条一条的打印到客户端去
PrintWriter           更常用一些
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。


打印流
 PrintWriter(字符流)与PrintStream (字节流) 可以直接操作输入流和文件
序列流
 SequenceInputStream  对多个流进行合并
操作对象
 ObjectInputStream与ObjectOutStream  被操作的对象需要实现Serializable(标记接口)


PrintStream(字节流)  为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

println  它可以对那些基本数据类型进行直接操作,它可以保证数据的原样性,将数据打印出去。 object string

write (int b)  将指定的字节写入此流。  往里传一个int类型的值 它往外写的是这个int类型的值的最低八位
16IO流(合并流)
  多个源 对应一个目的     将多个源通过SequenceInputStream转换成一个源  然后对这一个源进行操作

  应用:网络小说  都是一天 一章一章的出   到最后将它弄成一个文件 看着比较舒服

 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)  // 是inputstream的子类  有read方法  所以可以直接写  {   fos.write(buf,0,len);  }  fos.close();  sis.close();   //关闭所有流 }


17IO流(切割文件)

 public static void merge()throws IOException   // 合并文件 {  //首先要创建集合,创建V...集合的效率很低,而集合ArrayList效率比较高  ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();  for(int x=1; x<=3; x++)   //添加流对象  {   al.add(new FileInputStream("c:\\splitfiles\\"+x+".part"));  }  //将碎片文件和读取流对象相关联  并添加到集合a1当中  final Iterator<FileInputStream> it = al.iterator();  // 枚举  Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()  //创建en对象  {   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(); } public static void splitFile()throws IOException   //切割文件 {  FileInputStream fis =  new FileInputStream("c:\\1.bmp");   //关联文件    源  FileOutputStream fos = null;  byte[] buf = new byte[1024*1024];   //创建一个1m的 容器  int len = 0;  int count = 1;  while((len=fis.read(buf))!=-1)   //当这句话以满足  就意味着往容器中装数据  {   fos = new FileOutputStream("c:\\splitfiles\\"+(count++)+".part");  //new一个输出流对象     .part  碎片的意思   fos.write(buf,0,len);   //将其 都写到流里边去   fos.close();   //关闭流  }    //循环几次创建几次流   就创建几个文件    fis.close();   }}


 

 -------android培训java培训、期待与您交流-------