zoukankan      html  css  js  c++  java
  • Android开发之I/O流上篇

    在写Android的数据存储之前,想温故下Core Java中的I/O流。一是为巩固基础,二是为更好掌握Android的数据存储打基础!

      IO:即输入,输出。学IO:

    • 先学好一个包: java.io.*。
    • 学java.io.*包之前,先要明白:流的概念。
    • 理解了‘流’之后就要区分字节流与字符流。
    • 当以上都理解之后,就可以去练习相关的类。 
    • 当相关的类掌握之后,就去学习序列化。
    • 当以上知识点都学习并且掌握之后,就可以去学习如何使用NIO.

    这是大致的学习路线图,另外补充一点,NIO我也不太熟悉,相关笔记以后在补上!

    java.io.*总共有86个类(如果没有算错的话),不建议每个类或接口都掌握,学习的目的是用于生产,所以掌握能干活的并且经常使用的类即可,我主张学于致用!

    关于流的思考:

      我们见过河流,相信不少人还在其中嬉戏打闹游泳过。我喜欢河流,并且在其中裸泳是件很美妙的事情。河流通常都会有源头并且大多位海拔较高或者相当的高区位,河流的终点往往是某大型湖泊或海洋,它流动的趋势是从高向底,弯曲游走;它是动态的,是变化的!我们可以抽象些讲: 是按一定规律运动的;再抽象点:是自然界中脉络相通的排泄降水径流的天然输水通道;再再抽象点:河流是通道,是按某种轨迹运动变化的水的抽象!当淤泥过多时,它会阻塞膨胀;当大坝筑起后,它可以蓄水防洪。它的载体是大地。

    • 输入流:海拔较高或者相当的高区位
    • 输出流:某大型湖泊或海洋
    • 中间层:是水的通道

      讲河流与IO有什么关系呢? 有个概念抽象的关系。IO中流是对有序数据抽象。那有序数据就好比是水,它的输入不在是高海拔的山区而是键盘,鼠标等设备,它的输出不在是湖泊与海洋而是文件或屏幕;水是变化动态的,有序的数据也是变化,动态的。IO会阻塞,也有缓存,java中的IO与平台无关,它的载体是操作系统。这就是相关性,也是我的感悟;不一定最好,只是可以通过生活中的事物进行联想理解而以。

    • 输入流:键盘,鼠标等设备
    • 输出流:文件或屏幕
    • 中间层:数据通道

     总结下: 流: 英译stream:

    1.  "一头一口":源头与出口,即输入与输出;
    2. 是有序且变化着的;
    3. 有阻塞,有缓存;
    4. 不理会大地与平台,专注与它的实现。

    我们回到具体的实现中来:数据从服务器通过网络流向客户端,我们称Server端的程序为输出流(把数据输出到网络),Client端内存负责从网络里读取数据,称之为:输入流。

    • 输入流: 读取数据;
    • 输出流:写入数据;
    • 中间层:网络数据通道;

    因此我们就能很好的以中间层为轴判断输入流与输出流了!eg:网络从Server端读取数据然后向Client中写入数据! 

    字节流与字符流:它们之的区别就在于数据单元不同而以;字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字节。

    •  File

      File与内容无关,它是文件本质上抽象并且包含一系列与文件相关的方法。

    1. 与文件名相关:String getName(),String getParent(),String getAbsolutePath()
    2. 检测文件:boolean isAbsolute(), boolean exists(),boolean isDirectory(),boolean isFile()  大多是is系列方法
    3. 文件及目录操作:boolean mkdir(),String[] list(),File[] listFiles(),boolean createNewFile(),boolean delete(),void deleteOnExit()在Android调用此方法应当注意,具体原因请查阅文档,它比我解释的更好: http://developer.android.com/reference/java/io/File.html#deleteOnExit()

    下面给出三段代码:各位也可以试验一下并观察它们的区别,亲自试验之后,会有不一样的收获:

     1 static void demo1(String pathname) {
     2         File file = new File(pathname);
     3         // System.out.println("return : " + file.isFile());
     4         if (file.isDirectory()) {
     5             String[] temp = file.list();
     6             for (int i = 0; i < temp.length; i++) {
     7                 File flag = new File(pathname, temp[i]);
     8                 if (flag.isDirectory()) {
     9                     demo1(flag.getPath());
    10                 }
    11                 System.out.println(flag);
    12 
    13             }
    14         }
    15     }
    View Code
     1 static void demo2(String pathname) {
     2         File file = new File(pathname);
     3         // System.out.println("return : " + file.isDirectory());
     4         if (file.isDirectory()) {
     5             File[] temp = file.listFiles();
     6             File flag = null;
     7             for (int i = 0; i < temp.length; i++) {
     8                 flag = temp[i];
     9                 if (flag.isDirectory()) {
    10                     demo2(flag.getPath());
    11                 }
    12                 // else{
    13                 System.out.println(flag);
    14                 // }
    15 
    16             }
    17         }
    18 
    19     }
    View Code
     1 static void demo3(String pathname) {
     2         File file = new File(pathname);
     3         // System.out.println("return : " + file.isFile());
     4         if (file.isDirectory()) {
     5             String[] temp = file.list();
     6             for (int i = 0; i < temp.length; i++) {
     7                 File flag = new File(temp[i]);
     8                 if (flag.isDirectory()) {
     9                     demo3(flag.getPath());
    10                 }
    11                 System.out.println(flag);
    12 
    13             }
    14         }
    15     }
    View Code

    main方法:

    1 public static void main(String[] args) {
    2         long num = System.currentTimeMillis();
    3         demo1(".");
    4         demo2(".");
    5         demo3(".");
    6         System.out.println(System.currentTimeMillis() - num);
    7     }
    View Code

     核心是:list()与listFiles()的操作。

    另外在list系列方法有个“文件过滤器”接口:FilenameFilter ,其中有个accept方法;如果要过滤某个文件,把过滤条件写在accept中既可;Easy!!

     此文是上篇,是基础;Android开发之I/O流下篇:今晚发布!!!






    【Dylan童鞋】

    关注Dylan童鞋,请搜索微信号:DylanTongXue 。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Q群:315858410. 此群用于关注DylanTongXue者交流!群成员职业不限,程序员居多,讨论主题不限:技术分享,生活感悟,职场心得,时事分析...

  • 相关阅读:
    Sum Root to Leaf Numbers 解答
    459. Repeated Substring Pattern
    71. Simplify Path
    89. Gray Code
    73. Set Matrix Zeroes
    297. Serialize and Deserialize Binary Tree
    449. Serialize and Deserialize BST
    451. Sort Characters By Frequency
    165. Compare Version Numbers
    447. Number of Boomerangs
  • 原文地址:https://www.cnblogs.com/idayln/p/3102810.html
Copyright © 2011-2022 走看看