Java系列 | 十分钟学会JAVA IO

JAVA IO装饰者模式:java

    不知道你们在学JAVA IO的时候,有没有被各类五花八门的构造函数之间的组合和嵌套弄得头昏脑涨,好比BufferedReader br=new BufferedReader(new InputStreamReaderweb

(new FileInputStream(filename),"UTF-8"));与其去记这些函数,不如来看下面一段话。正则表达式

先来看一幅图:编程

        这是一个简单的JAVA输入输出流的类层次结构图。api

        咱们知道,Reader类InputStream类是不能直接被实例化的,只能实例其子类(或其子类的子类…),Reader类和InputStream类里只封装了一些IO所必须的抽象方法,具体实现和怎么实现则直接由其子类所定义,这些直接子类分别直接搭建了从文件到程序的管道(不一样子类有不一样管道),管道里面就是具体的流,而这些子类派生出来的子类则对这些管道进行了改进,或直接对管道自己进行改良,或在管道和程序之间再架设一个缓冲区,这就是JAVA IO的装饰者模式。微信

        再来看上面的代码,最里面的new FileInputStream(filename)搭建了一个从文件到程序的管道,第一个参数是文件名,能够是像“test.txt”这样的相对路径(这样文件就存放在工程根目录下),也能够是像” E:\JAVA Src\homework“这样的绝对路径,不过推荐使用相对路径,一来方便本机文件的管理,二来方便移植给别人。 app

再来看次外层的new InputStreamReader(newFileInputStream(filename),"UTF-8"),先说说第二个参数,设置字符集,通常设置为“UTF-8‘,为国际通用标准,至于第一个参数,先看一下InputStreamReader的构造函数.编程语言

这里咱们用的是第四个构造函数,它的第一个参数为一个InputStream对象,而咱们传入的是FileInputStream,这里使用了多态技术,莫方,问题不大,关于多态只须要记住下面这句话,“多态的核心:父类引用能够指向子类的对象。“,从上面的继承树能够看出FileInputStream类正是InputStream类的子类,而调用时,InputStream in = new FileInputStream(filename),等号后面是咱们传入的子类对象,等号前面是一个父类的应用,因此,多态没问题了吧?再从宏观上来看,new InputStreamReader函数

(new FileInputStream(filename),"UTF-8"),把一个字节流转换成了字符流,对管道自己作改良:把运字节的管道改为了运字符的管道,这就是JAVA IO修饰者模式的体现。 再来看最外层的BufferedReader br=new BufferedReader(new InputStreamReader工具

(new FileInputStream(filename),"UTF-8")),分析方法同次外层,这里在管道和程序之间又架设了一个缓冲区,也是JAVA IO修饰者模式的体现。

因此,这些东西都不用记了,使用的时候查JAVA API就行。

在此附上一个无毒无害的JAVA 在线API工具

http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4

封装一个JAVA IO操做工具

        在学io的时候,常常遇到读写数字和字符串的,好比从一大堆包含数字和字符串的txt文件里提取数字,,里面还有各类不可见字符…,个人思路是,写的时候所有把数据转成字符串,而后利用字符流再写,读的时候用字符流读,再利用String类强大的API进行数据分割(其实在JAVA高编里有现成的正则表达式能够了解下,限于学习成本,这里直接用本身设计的模型)

先来看写数据,好比,要写一段这样的数据:“中南大学\r\n通讯工程1602班\r\n0905160233“

//作下说明

/**

         * 在大多数编程语言中,从键盘上输入的回车等效于两个字符'\r'+'\n'

         * 'r':回到行首;'n':新起一行

         * 这里把content设置成这样是为了模拟文本编辑中换行操做

         * 以及字符串和数字混合和分割的问题

               */

利用这样一段代码把它写到文本文档里:


▲向上滑动

String content = "中南大学\r\n通讯工程1602班\r\n100023";

      String filename = "test.txt";

      writefile(content,filename);

   }

   public static void writefile(String content,String filename) throws Exception {

      FileOutputStream fos = new FileOutputStream(filename);

      OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

      BufferedWriter bw = new BufferedWriter(osw);

      bw.write(content);

      bw.close();

      osw.close();

      fos.close();

   }




(说明一下为何吧writefile()设置成static静态, main()函数是静态的,在静态方法里只能调用静态方法或变量,若是不设置成static,这样调用也行;:new “YourClassName”().writefile(content,filename)打开txt文档,以下:

下面再来看读的操做,根据一个文件名读取,并返回一个字符串


▲向上滑动

public static String readfile(String filename) throws Exception{//原样读取

      BufferedReader br=new BufferedReader(new InputStreamReader

           (new FileInputStream(filename),"UTF-8")); 

      StringBuffer lines = new StringBuffer();

      /**

       * StringBuffer是一个动态字符串类,经常使用此类对象的append()方法来连接字符串

       * 其实也能够用String类的”+“代替,可是前者性能明显优于后者

       * 最后要用StringBuffer类的toString()方法转成String

       * 这样才能使用String类强大而灵活的API

       */

      int count = 0;

       while((count=br.read())!=-1){ 

         //read方法返回一个整数,用(char)转为字符

             lines.append((char)count); 

         }

       br.close();

       return lines.toString();

   }



输出打印以下:

而后提取数字:


▲向上滑动

public static  ArrayList<Integer> getNumbers(String content) {

      StringBuffer aNumber = new StringBuffer();

      ArrayList<Integer> Numbers =new ArrayList<Integer>();;

      for(int i = 0; i<=content.length(); i++) {

        char ch = content.charAt(i);

        while(ch>='0'&&ch<='9') {

           aNumber.append(ch);

           i++;

           if(i==content.length()) break;

           ch = content.charAt(i);

        }

        if(aNumber.length()>0) {

           Numbers.add(Integer.parseInt(aNumber.toString()));

           aNumber.delete(0, aNumber.length());

        }

      }

      return Numbers;

   }



用代码System.out.println("班级编号:"+Numbers.get(0)+"\t学号:"+Numbers.get(1));打印以下:

提取字符串等其余操做相似,只要改一下判断条件就行。

以上为小编的原创做品

以为写得不错,请点个赞

了解更多资料,请点个关注

后台回复“java io“获取源代码




                                               长按关注公众号

本文分享自微信公众号 - 月小水长(inspurer)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索