• 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者交流!群成员职业不限,程序员居多,讨论主题不限:技术分享,生活感悟,职场心得,时事分析...

  • 相关阅读:
    【转】使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法
    配置Linux系统ssh免密登录
    numpy的随机数组
    numpy.where和numpy.piecewise的用法
    numpy、pandas学习笔记
    数据库行存储和列存储的区别
    pandas对DataFrame对象的基本操作
    pandas中assign方法的使用
    numpy实现快速傅里叶变换
    最小二乘法在线性拟合中的使用
  • 原文地址:https://www.cnblogs.com/idayln/p/3102810.html
Copyright © 2020-2023  润新知