【黑马】程序员————IO(二)流操作规律,File类,Properties.

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----

 

一、流操作规律。

1、键盘输入输出System.in/Syste,.out和转换流InputStreamReader/OutputStreamReader。

1.1 标准键盘输入

  System.in    键盘键入,输入的类型为字节。  

  System.out   向控制台输出字节。

1.2 InputStreamReader/OutputStreamReader

  InputStreamReader是字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符。其使用的字符集可以由名称指定或显示指定。

  一般用法:

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

  OutputStreamWriter是字符流通向字节流的桥梁:它使用指定的charset将要写入的字符编码为字节。

  一般用法:

  BufferedWriter br = new BufferedWriter(new OutputStreamWriter(System.out));

<示例1>标准输入输出和转换流

/*
 * 标准输入输出和转换流示例
 */
import java.io.*;
public class IoTest1 {
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(
                                (new InputStreamReader(System.in)));//将标准键盘输入字节流转换为缓冲字符流
        BufferedWriter bw = new BufferedWriter(
                
                                (new OutputStreamWriter(System.out)));//缓冲字符流的字符转换为字节向控制台输出
        String s = null;    
        
        while((s = br.readLine()) != null) { //读入从键盘输入的转换为字符流的字节流
            
            if(s.equals("over"))
                break;
            
            bw.write(s.toUpperCase());
            bw.newLine();    //换行
            bw.flush();  //刷新
            
        }
        br.close();
        bw.close();
        
        
    }
}

 

  Byte ---->InputStreamReader-----Char------>BufferedReader ------>BufferWriter--——Char--->OutputStreamWriter————>Byte

 

  

2、流操作规律。

 

1.1 规律总结:

  1)两个明确:

    明确流的源和目的。例子:想要将一个文件的数据打印到控制台上:源:文件 目的:控制台

  2)操作的数据类型是否为纯文本。

    是:字符流

    不是:字节流

  3)明确使用哪个具体的对象:

    通过设备进行区分:

    源设备:内存,硬盘,键盘

    目的设备:内存,硬盘,控制台

小练习:将键盘录入的数据存入一个文本文件中(按照特定编码表)。

思路:1、为了使操作键盘录入的数据比较方便,一般把键盘录入的字节转化为字符。BufferedReader br = new (BufferedReader(new InputStreamReader(System.in)));

       2、用BufferedWriter 将接收的字节写入文本文件中。BuffereWriter bw = new BufferWriter(new FileWriter("目标文件.txt"));

       3、指定编码表:把想要录入的字符数据按照特定的编码表录入(GBK / UTF-8).而FileWriter 使用的是默认的编码表,GBK.转换流 OutputStreamWriter可以传入字符集            参数。(转换流应用)    同样,FileReader只能读取GBK默认编码的文件。

<示例2>

  

/*
 * 将键盘输入的数据写入目标文件中
 */
import java.io.*;
public class IoTest1 {
    public static void main(String[] args)  {
        
        BufferedReader br = null; //生命字符读取流
        BufferedWriter bw = null;//声明缓冲字符流写入
        String temp = null;
        
        
        try {
            br = new BufferedReader(new InputStreamReader(System.in));    
            //用OutputSteamWriter指定UFF-8编码,以字节形式写入文件中
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(("d:\\喵咪咪.txt")),"utf-8"));
            
            while((temp = br.readLine()) != null) {
                if(temp.equals("end")) //结束标志
                  break;
            
                bw.write(temp);
                bw.newLine();
                bw.flush();
                
                
            }
        }  catch(IOException e) {
            new RuntimeException("erro");
            
        }
        
        finally {
            if(br != null)
                try {
                    br.close();
                } catch(IOException e) {
                    new RuntimeException("erro");
                    
                } finally {
                    if(bw != null)
                        try {
                            bw.close();
                        } catch(IOException e) {
                            new RuntimeException("erro");
                            
                        }
                }
        }
        
    
            
    }

 

1.2 System.setIn(InputStream in) ;/System.setOut(PrintStream out);:

  改变标准输入输出。使不再从键盘中录入数据,不再向控制台写入。

<示例3>更改标准输出,将捕获的异常打印至文件中。

    Properties ppt = System.getProperties();

    ppt.list(System.out/new PrintStream("abc.txt"));

/*
 * 将键盘输入的数据写入目标文件中
 */
import java.io.*;
import java.text.*; //SimpleDateFormat
import java.util.*;


public class IoTest1 {
    public static void main(String[] args)  {
        
        try {
            
            int arr[] = new int[10];
            System.out.println(arr[11]);
            
        } catch(Exception e) {
            
            try {
                    
                    //获取系统时间,通过SimpleDateFormat sdf.format(d)方法将日期改成自定格式并传入字符串S
                    Date d = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String s = sdf.format(d);
                    
                    
                    
                    //建立打印流对象,作为参数传入System.Out()中,改变标准输出为D盘下的 LOG.TXT文件。
                     PrintStream ps = new PrintStream("D:\\LOG.txt");
                     ps.println(s);
                     //ps.write(d.toString().getBytes());
                     System.setOut(ps);
                
            } catch(IOException e1) {
                
                 new RuntimeException("找不到文件"); 
            }
            
            
            e.printStackTrace(System.out); //输出异常
        }
    
        
        
            
    }
    
    
}

 

 

二、File类。

1、File简介。


   1)Java中用File类抽象描述文件和文件夹,方便对文件和文件夹的属性信息进行操作。

   2)弥补了流只能操作数据而不能操作文件的缺陷。

   java.lang.Object

    |--  java.io.File

    实现接口:Serializable,Comparable<File>

  Constructor:

    File(String pathName)

    File(String pathName ,String fileName)

   获取系统分隔符方法:

    <Stringng>Static sperator() (跨平台分隔符)

     File a  = new File("c"+File.seperator+"abc\\abc.txt")

   

2、常见方法。

1)创建

  boolean createNewFile() throws IOException 是否创建成功,如果目录含有同名文件,创建失败,返回False.

  注意:和输出流不同,输出流FileWriter("abc.txt")会覆盖同名文件。

   createTempFile(String prefix,String suffix,File directory) 在指定目录中创建一个空文件,用给定的前后缀生成文件名。

   boolean mkdir() 创建目录 

    File dir = new File("abc\\bca");

    dir.mkdir();只能创建一级目录

  boolean mkdirs() 创建多级目录

    

2)删除

  boolean delete();

  void deleteOnExit(); 在文件退出时删除,例如正在看视频文件无法删除该视频.avi,在视频播放结束后,自动删除。

3)判断

 boolean canExecute() 文件是否可以执行

 boolean canRead()   boolean canWrite();

   int compareTo(File pathName)  按照字母顺序比较两个抽象路径名

   boolean exists()  文件是否存在

 boolean isDirectory() 在判断对象是目录或是文件时候,首先要判断该对象是否存在。

 boolean isFile()

 boolean isHidden() 是否隐藏

 boolean isAbsolute() 是否绝对路径

 

 

4)获取信息

 String getName()

 String getPath()

  String getAbsolutePath()

 String getParent() // 返回绝对路径的父目录或上级目录,前提是 new File("xxx\\xxx")

  File getAbsoluteFile() 返回File对象类型的绝对路径 .toString();

 long lastModified() //返回上一次文件被修改的时间 毫秒数

 long length () 字节数

 boolean reNameTo()  //更改文件名 不同盘之间 (剪切复制)

 File[] listRoots() 返回根目录

   String[] list() 返回指定目录下文件和文件夹的名称。 File f = new File("c:\\");   String[] s = f.list(); for(String s : s) { sop(s)};

   String[] list(FilenameFilter fnf)

   File[] list()

   File[] list(FilenameFilter fnf)

 

<示例3> 打印BaiduYunDownload目录下的文件名(过滤后):

 

/*
 * list(new FilenameFilter)方法:
 */
import java.io.*;


public class IoTest1 {
    public static void main(String[] args)  {
        
        
        printFilterFilename(); //调用过滤文件名打印函数
            
    }
    
    public static void printFilterFilename() {
        
        File f = new File("F:\\BaiduYunDownload\\第01天");  //创建文件目录对象
        
        FilenameFilter fnf = new FilenameFilter() {  //匿名抽象类,重写accept方法,参数为目录名和文件名
            public boolean accept(File dir,String name) {
                 
                return name.endsWith(".avi");
            }
        };
        
        String[] names = f.list(fnf);  //f.list方法返回过滤后的文件名
        for(String name : names) {     //foreach循环
            System.out.println(name);
        }
    }
    
}

 

 

 

3、综合运用

3.1递归调用:列出文件夹下的所有文件夹和文件。

/*思路:列出指定目录下的所有内容,目录中还有目录,只要使用同一个列出目录功能的函数完成即可。

    在列出过程中仍会出现目录,这时还应该调用本函数。这种表现形式称之为递归调用。

      

*/

<示例4>列出文件夹下的所有内容:

 

/*
 * 递归调用
 */
import java.io.*;


public class IoTest1 {
    
    public static void main(String[] args)    {
        
    
        showDir(new File("E:\\CROSSGATE\\DATA"),0);
        
    
    }
    
    public static String getLevel(int n) {
        
        StringBuilder sb = new StringBuilder();
        
        for(int i = 0; i < n;i++) {
            
sb.append(
"| "); } return sb.toString(); } public static void showDir(File f,int count) { System.out.println(getLevel(count)+f); count ++;
File[] fs
= f.listFiles();
for(int i = 0; i < fs.length;i++ ) { //遍历 File[] 数组 if(fs[i].isDirectory()) { //如果fs[i]是文件夹,则继续调用showDir方法、 showDir(fs[i],count);
}
else //一直到fs[i]是文件,打印输出。 System.out.println(getLevel(count)+ "|——"+fs[i]); } } }
//效果如图
【黑马】程序员————IO(二)流操作规律,File类,Properties._第1张图片

 

3.2 小练习 将一个指定目录的.avi文件路径存储到一个文本文件当中。

 

 

 

/*思路:1、根据要求,需要操作的数据类型是 “JAVA的文件路径”,String s = f.getAbsolutePath();

       因此需要得到每一个文件的文件名,这就需要一个文件数组,存放所有的文件,并且遍历这个数组,得到每一个文件的文件名。

             2、要取出所有的.avi文件则需要过滤,可以用f.list(FilenameFilter),也可以通过取出的字符串的 boolean name.endsWith();来充当判断条件。

      3、用BufferWriter 将这些字符串文件名中的写入目标文件。

import java.io.*;


public class IoTest1 {
    public static void main(String[] args) throws IOException {
        
        File f = new File("F:\\BaiduYunDownload");
        
        BufferedWriter bw = new BufferedWriter( new FileWriter("D:\\hahaavi.txt"));
        
        printtotext(f,bw);
        
    }
    
    public static void printtotext (File f ,BufferedWriter bw) throws IOException {
        
        
        File[] fs = f.listFiles(); //将源文件夹下的所有文件夹和文件存入数组fs中
        
        for(File ff : fs) {  //遍历数组元素
            
            
            if(ff.isDirectory()) {  //递归
            
            
                printtotext(ff,bw);
            }
            else if(ff.getAbsolutePath().endsWith(".avi")) {  //如果是文件且是avi格式文件
                
                String s = ff.getAbsolutePath();  //则将文件绝对路径传入字符串s中。
                bw.write(s);   //字符输出流将字符串写入文件。
                bw.newLine();
                bw.flush();
            }
        }
    }

}    

【黑马】程序员————IO(二)流操作规律,File类,Properties._第2张图片

三、Properties。

1、Properties简介

 Properties是Hashtable的子类,因此具备了map集合的特点,其存储的键值对都是字符串。

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

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

比如php.in配置文件中的配置信息就是以键值对的形式出现的“mysql.dll = on" 

Properties就是这样一个可以去操作硬盘上键值对的对象。

 

2、常用方法:

void load(InputStream in)   //从输入流中读取属性列表。 

void setProperty(String s1,String s2)   //调用map集合的put方法存入键值对。

String getProperty(s1)  //获取键“s1”的值

Set<String> stringProrpertNames() ;  //将所有键值对的键传入set集合中并返回

void store(OutputStream os ,String 注释)

<示例> 将配置文件info.txt中的键值对存入properties中。

思路: 1、建立输入流对象读取Info.txt中的字符,并转换为字符串。 用readLine();

    2. 将字符串按照“=”切割后存入两个不同的字符串中。   str.split("=");

      3.调用setProperty(str1,str2)存入Properties集合中。//这三步可以用porperties的load方法实现。

public class IoTest1 {
    public static void main(String[] args) throws IOException {
        
            
        
            //method_1();
            Properties prop2 = new Properties();
            prop2.load(new FileReader("info.txt")); //load方法直接读取并存储
            prop2.setProperty("haha","2323");
            prop2.store(new FileOutputStream("info.txt"), null);
    
        
    }
    
    public static void method_1() throws IOException {
        
        BufferedReader br = null ;
        String str = null;
        
        br = new BufferedReader(new FileReader("info.txt"));
        
        Properties prop = new Properties();
        
        while((str = br.readLine()) != null) {
            
            String[] ss = str.split("=");  //切割字符串放入两个字符串数组
            prop.setProperty(ss[0], ss[1]);  //存入集合中
        }
    }
    

}    

<小练习>记录程序运行次数。

思路:1、如果用计数器的方式来计数,那么在程序运行结束后,在内存中的count变量也将被清楚,所以要用Properties的方式将运行次数以键值对的形式从硬盘存取。

   2、建立配置文件“count.ini”,建立字符流对象,建立Properties对象,load()方法读取,setProperty()方法设置,load方法读取(建立OutputStream对象)。代码如下咯:

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


public class IoTest1 {
    public static void main(String[] args) throws IOException  {
        
        
        
        
        
        Properties prop = new Properties();
        
        File f = new File("D:\\count.ini");
            if(!f.exists()) {
                f.createNewFile();
            }
            
        BufferedReader br = new BufferedReader(new FileReader(f));    
        FileWriter fw = new FileWriter(f);
        
        prop.load(br);
        
        int count  = 0;
        
        String value = prop.getProperty("times");
        
        if(value != null) 
            
            count = Integer.parseInt(value);
            
    
        count++;
        prop.setProperty("times", count+"");
        prop.store(fw, "啦啦啦德玛西亚");
        
        fw.close();
        br.close();
        
    
        
    }
    
    


}    

XML文档 

 

<persons>

  <person id = 1>

    <name>JOHN</name>

    <age>25<age>

  </person>

</persons>

 

dom4j   : documents for java  :是一个很好的工具,用于java操作 从XML文档中读取数据。

你可能感兴趣的:(【黑马】程序员————IO(二)流操作规律,File类,Properties.)