Java笔记5 IO<3>File、Properties、PrintWriter、合并流

时间:2022-01-17 15:57:46


20天-01-IO流(File概述)

l  File类

Ø  用来将文件或文件夹封装成对象。

Ø  方便对问价或文件夹操作。

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

Ø  了解File中的常用方法。

 

 

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

l  File类的常用方法:

1.      创建:

boolean createNewFile():在指定位置创建文件,如果该文件存在,则不创建,返回false。

和输出流对象不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖。

       booleanmkdir():创建文件夹。

       booleanmkdirs():创建多级文件夹。

 

 

2.      删除:

delete();

deleteOnExit():系统退出时删除。

3.      判断:

boolean exists():文件是否存在。

isFile():

isDirectory():

isHidden():

isAbsolute():

 

 

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

l  获取操作系统盘符

File[] files =File.listRoots();

for(Filef:files){

       System.out.println(f);

}

l  获取当前目录下的文件或文件夹(包含隐藏文件或文件夹):

File f = newFile(“C:\\”);

String[] names =f.list();

for(Stringname:names){

       System.out.println(name);

}

 

 

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

l  利用File类中的list(FileFilter f)过滤文件。

import java.io.File;

import java.io.FilenameFilter;

 

public class FileFilterDemo {

 

    public static void main(String[] args) {

       File file = new File("D:\\Android\\Htmlexcise");

       String[] arr = file.list(new FilenameFilter() {        

           @Override

           public boolean accept(File dir, String name) {

              if(name.endsWith(".html")){

                  returntrue;//假如存在以.html结尾的文件,返回文件名。

              }

              return false;//过滤掉不符合条件的文件。

           }

       });

       for(String s:arr){

           System.out.println(s);

       }

    }

}

 

 

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

l  toBin方法的递归演示

代码:

public static void toBin(int num){

    if(num>0){

    toBin(num/2);

    System.out.println(num%2);

}

}

递归过程,图片演示:

²  递归时要注意:

<1> 限定条件。

<2>要注意递归的次数,尽量避免内存溢出。(递归次数过多,递归过程中创建的多个方法会逐渐消耗栈内存空间。当递归还未结束,但是栈内存空间消耗完,就会出现栈内存溢出)

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

public static void showDir(File dir){

    System.out.println(dir);

    File[]files = dir.listFiles();

    for(intx=0;x<files.length;x++){

    if(files[x].isDirectorr()){

    showDir(files[x]);

}else{

    System.out.println(files[x]);

}

}

}

 

²  总结,个人认为此节是学习递归方法的一个经典视频(至少通过视频讲解分析,解开了一些我学习递归调用总感到纠结的困惑),以后对递归感到疑惑的时候,可以在把这一节视频重头看一遍,还会有收获的。

 

 

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

示例:

public static int getLevel(int level){

    StringBuildersb = new StringBuilder();

    sb.append(“|--“);

    for(intx=0;x<level;x++){

    //sb.append(“|--“);

sb.insert(0,”|  ”);

}

return sb.toString();

}

public static void showDir(File dir,intlevel){

    System.out.println(getLevel(level)+dir.fetName());

    Level++;

    File[]files = dir.listFiles();

    for(intx=0;x<files.length;x++){

    if(files[x].isDirectorr()){

    showDir(files[x],level);

}else{

    System.out.println(files[x],level);

}

}

}

 

 

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

/*

删除一个带内容的目录。

删除原理:

    在window中,删除目录从里边往外删除。

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

*/

示例:

public static void removeDir(File dir){

    File[]files = dir.listFiles();

    for(intx=0;x<files.length;x++){

    if(files[x].isDirectory()){

    remove(files[x]);

}else{

    System.out.println(files[x].toString+”:-file-:”+files[x].delete());

}

}

System.out.println(dir+”::dir::”+dir.delete());

}

 

 

20天-10-IO流(创建java文件列表)

l  练习:将以个指定目录下的java文件的绝对路径,存储到一个文本文件中。

建立一个java文件列表文件。

思路:

1.      对指定的目录进行递归。

2.      获取递归过程中所有的java文件的路径。

3.      将这些路径存储到集合中。

4.      将集合中的数据写入到一个文件中。

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

 

public class JavaFileList {

 

    public static void main(String[] args) {

       File dir = new File("D:\\新建 文件夹 (2)");

       List<File> list = new ArrayList<File>();

       fileToList(dir,list);

      

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

       try {

           writeToFile(list, file.toString());

       } catch (IOException e) {

           e.printStackTrace();

       }

       System.out.println(list.size());

 

    }

    public static void fileToList(File dir,List<File>list){

       File[] files = dir.listFiles();

       for(File file:files){

           if(file.isDirectory()){

              fileToList(dir,list);

           }else{

              if(file.getName().endsWith(".java")){

                  list.add(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{

           if(bufw!=null){

              try {

                  bufw.close();

              } catch (IOException e) {

                  throw e;

              }

           }

       }

    }

}

 

²  总结:上面的fileTolist容易发生栈溢出(在我电脑上,子文件夹>=3个,总会栈内存溢出),在实际编程中移植此代码,要留心一点儿。

 

 

20天-12-IO流(Properties存取)

/*

Properties 是HashTable的子类。

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

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

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

*/

示例:

Properties pro = new Properties();

prop.setProperty(“zhangsan”,”30”);

prop.setProperty(“lisi”,”39”);

System.out.println(prop);//打印键值对

Set<String> names =prop.stringPropertyNames();//取键集

for(String s:names){

System.out.println(s+”:”+prop.getProperty(s));//取键、值

}

 

 

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

l  演示如何将流中的数据存储到集合中。

思路:

1.        用一个流和info.txt文件关联。

2.        读取一行数据,将该数据用”=”切割。

3.        等号左边作为键,右边作为值。存入到Properties中。

public void loadDemo(){

       Propertiesprop = new Properties();

       FileInputStreamfis = new FileInputStream(“info.txt”);

       prop.load(fis);//将流中的数据加载到集合中。

       Prop.setProperty(“wangwu”,”9”);//修改键值.

 

       FileOutputStreamfos = new FileOutputStream(“info.txt”);

       prop.store(fos,”haha”);//第二个参数是注释信息,不会被Properties加载。

       Prop.list(System.out);//将属性列表输出到指定的输出流。

}

 

 

20天-14-IO流(Properties练习)

l  创建一个配置文件,用于记录运行程序的次数。如果使用次数已到,那么给出注册提示。

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Properties;

 

public class PropertiesRunCount {

 

    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);

      

       int count = 0;

       String value = prop.getProperty("time");

       if(value!=null){

           count = Integer.parseInt(value);

           if(count>5){//设置使用次数上限

              System.out.println("使用次数已到,交钱!");

           }

       }

       count++;//开始计数

       prop.setProperty("time", count+"");//计数完后转换为字符串存为time的值。

       FileOutputStream fos = new FileOutputStream(file);

       prop.store(fos, "");

      

       fos.close();

       fis.close();

    }

}

 

 

20天-15-IO流(PrintWriter)

l  PrintWriter

构造函数可以接收的参数类型:

1.      File对象。File

2.      字符串路径。string

3.      字节输出流。OutputStream

4.      字符输出流。Writer。

PrintWriter功能展示:

import java.io.BufferedReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

 

public class PrintSteamDemo {

 

    public static void main(String[] args)throws IOException {

       BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

       PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);//<1>

       String line = null;

       while((line=bufr.readLine())!=null){

           if("over".equals(line)){

              break;

           }

           out.println(line);//打印到指定文件并换行。

           //out.flush;//<1>处以自动刷新。

       }

       out.close();

       bufr.close();

    }

}

 

 

20天-16-IO流(合并流)

l  序列流

Ÿ   SequenceInputStream

对多个流进行合并。

功能演示:

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.SequenceInputStream;

import java.util.Enumeration;

import java.util.Vector;

 

public class SequenceInputStreamDemo {

 

    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 =newbyte[1024];

       int len = 0;

       while((len=sis.read(buf))!=-1){

           fos.write(buf,0,len);//将合并文件中的数据写入到指定文件中

       }

       fos.close();

       sis.close();

    }

}

 

 

20天-17-IO流(切割文件)

l  文件的切割

方法演示:

public static void splitFile() throws IOException{

       FileInputStream fis = new FileInputStream("c:\\1.bmp");

       FileOutputStream fos = null;

      

       byte[] buf =newbyte[1024];

       int len = 0;

       int count = 1;

       while((len=fis.read())!=-1){

           fos = new FileOutputStream("c:\\splitfiles\\"+(count++)+".part");

           fos.write(buf,0,len);

           fos.close();

       }

       fis.close();

    }

 

l  文件的合并

方法演示:

public static void merge() throws IOException{

       ArrayList<FileInputStream> al = newArrayList<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 = newEnumeration<FileInputStream>() {//此处重写了Enumeration方法

          

           @Override

           public FileInputStream nextElement() {

              return it.next();

           }

          

           @Override

           public boolean hasMoreElements() {

              return it.hasNext();

           }

       };

       SequenceInputStream sis = new SequenceInputStream(en);

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

       byte[] buf =newbyte[1024];

       int len = 0;

       while((len=sis.read())!=-1){

           fos.write(buf, 0, len);

       }

       fos.close();

       sis.close();

    }

}