Contents
  1. 1. 2015/11/18 15:03:43
    1. 1.1. 回调函数Callback的理解
  2. 2. 2015/11/19 10:56:14
    1. 2.1. 特征
    2. 2.2. 示例:
    3. 2.3. 示例:
  3. 3. 2015/11/23 9:36:28
    1. 3.1. 文件(目录)操作File的理解
  4. 4. 2016/1/22 19:02:35
    1. 4.1. 文件流的理解
    2. 4.2. 示例 —— 写一个用文件保存数据的方法
    3. 4.3. 总结 —— 创建一个文件的过程
  5. 5. 2015/11/23 9:44:36
    1. 5.1. 文件的读写
  6. 6. 2015/11/23 10:51:00
    1. 6.1. 通过文件保存、读取数据需要序列化
  7. 7. 2015/11/6 10:49:42
    1. 7.0.1. 关于String的subString方法
  • 陷阱
    1. 0.1. 集合删除元素
    2. 0.2. 静态成员只初始化一次(创建第一个对象时)
    3. 0.3. 必须同时重写equal跟hashCode方法
  • 1. 2016/1/29 18:57:16
    1. 1.1. 集合按某个属性(时间)排序
  • 2015/11/18 15:03:43

    回调函数Callback的理解

    1. 一段程序代码块中,可设定一部分代码,该代码块在未来才实现。
    2. 回调函数分成3部分

      • 回调接口 —— 提供数据的人编写
      • 提供数据的人

        • 预留接口给他人实现(定义接口、创建接口引用)
        • 提供注册接口的方法(注册接口)
        • 在给数据的地方调用接口的方法(通过接口引用调用方法)
    * 获取返回数据的人
    
        - (实现回调接口) implements Callback
        -  注册回调函数
    

    2015/11/19 10:56:14

    特征

    [A做了一半任务,需要等待B完成任务并返回数据(预留接口引用,给别人调用),然后再完成自己的接下来的任务]

    示例:

    帮你教机构详情的数据需要到机构简介Fragment里请求,然后返回更新数据
    

    示例:

    员工A 完成任务后 告知老板B
    
    • 回调接口

      interface Callback{ //接口返回something time等参数
          void execute(String something ,long time);
      }
      
    • (员工)

      class A{
      private Callback callback; //预留回调接口,方便他人调用
      private doSomething(){
      
              .
              .    //工作数小时
              .
      
              callback.execute(work,144000055); //告知老板
      
          }
      private setUser(Callback callback){//提供注册回调函数的方法、还可以考虑通过构造函数注册
              this.callback = callback;    
          }
      
      }
      
    • (老板)

      class B implements Callback{  //实现回调接口
      @Override
      public void execute(String something ,long time){
          System.out.println("员工在"+time+"做了"+something);
          }
      }
      
    • 测试

      class Test{
      
          public static void main (String args[]){
      
          A a = new A();
          a.setUser(new B());//注册接口
          a.doSomething();
      
          }
      
      }
      

    2015/11/23 9:36:28

    文件(目录)操作File的理解

    • 理解 —— File是一个工具类,通过其对象来操作文件的增删改查
    • 创建文件

      File file = new File(路径,文件名);
      
    • 创建文件夹

      File file = new File(路径,文件名);
      file.mkdirs();
      
    • 删除文件

      file.delete();
      

    2016/1/22 19:02:35

    文件流的理解

    • 理解 —— 在程序中要操作文件(读写),必须先将文件转换成流,然后从流中读取(写入)数据。

      • 字符流(Reader、Writer) —— 读取(写入)相关的字符(String),不需要缓冲区。

      • 字节流(InputStream、OutputStream) —— 读取(写入)相关的字节,需要先将数据读入(写入)缓冲区,然后再将缓冲区读入(写入)流中。

    • 下面通过一个示例来讲述字符流跟字节流的区别。

      • 示例: 对一个md文件写入Hello World语句

        File file = new File("B:/Erintrus.md");
        if(file.exists()){
            println("This file already exists");
        }else{
            file.createNewFile();
        }
        //上述代码创建一个md文件
        
        -------------------------------------------
        
        **********字符流*************
        FileWriter fw = new FileWriter(file);
        String msg = "Hello World";//需要写入的信息
        fw.write(msg);//直接将数据写入字符流
        
        **********字节流*************
        FileOutputStream fos = new FileOutputStream(file);
        String msg = "Hello World";
        byte[] bytes = msg.getBytes();//将数据写入缓冲区
        fos.write(bytes); //将缓冲区写入字节流
        
        ***********进阶 —— 高级流************
        BufferReader、BufferWriter
        
    * InputStream示例
    
            ************InputStream的缺陷,需要提前设置缓存区大小***************
            File file = new File("B:/Erintrus.md");
            FileInputStream fis = new FileInputStream(file);
            byte[] bytes = new byte[10240]; //文件过大,还是无法读取到完整的数据    
            fis.read(bytes);
    
    * <font color ="red">推荐示例 —— BufferReader(必须加\n)</font>
    
             ***********FileReader跟BufferReader的结合使用********
            FileReader r = new FileReader(file);
            BufferedReader br = new BufferedReader(r);
    
            StringBuffer msg = new StringBuffer();
            String s;
            while ((s = br.readLine()) != null) {
                msg = msg.append(s+“\n”); //必须要加\n 否则全部数据变成一行
            }
    
    * <font color="red">推荐示例 —— BufferWriter(必须要关闭流)</font>
    
            *********FileWriter跟BufferWriter的结合使用
            FileWriter fw = new FileWriter(decFile);
            BufferedWriter bw = new BufferedWriter(fw); //可以不用BufferWriter
    
            bw.write(msg.toString());
            bw.close();//必须要关闭,不然写不了数据
            fw.close();必须要关闭,不然写不了数据
    
    * <font color = "red">推荐示例 —— FileChanel与FileInputStream、FileOutputStream结合</font>
    
            FileInputStream fis = new FileInputStream(file);
            FileOutputStream fos = new FileOutputStream(desFile);
            FileChanel fcIn = new FileChanel(fis); //将输入流放到输入管道中
            FileChanel fcOut = new FileChanel(fos);//将输出流放到输出管道中
    
            ******************输入管道调用transferTo()方法传输数据************
            fcIn.transferTo(0,fcIn.size(),fcOut);
            .
            .
            .
            关闭流
    
    • 总结:

      1. 字符流比字节流简便。
      2. 不推荐使用FileInputStream、FileInputStream,要用就结合FileChannel来用。

    文件流的参考

    示例 —— 写一个用文件保存数据的方法

    //参数依次是上下文、待保存数据、文件名、折叠器(用于判断是否在当前文件夹下创建文件)
    public void saveData(Context context , Object data , String name , String folder){
        if(context ==null) return ;
        File file;
        if(folder.isEmpty){ //如果没有折叠器,则在当前目录创建文件
            file = new File(context.getFilesDir(),name);
        }else{ //否则,创建一个文件夹
            File filesDir = new File(context.getFilesDir(),folder);
            if(!filesDir.exists()||!filesDir.isDirectory()){//如果文件夹不存在,则创建该文件夹
            {
                fileDir.mkdir();
            }
            file = new File(filesDir,name);//在该目录下创建文件            
        }
    
    
        if (file.exists()) {
            file.delete();
        }
    
    *************************保存数据
    
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
    oos.writeObject(data);
    oos.close();
    }
    

    总结 —— 创建一个文件的过程

    • 判断是否需要创建折叠器(文件夹)

      • 不要 ——> 直接创建文件
      • 需要 ——> 判断文件的目录是否存在 && 判断是否文件夹 ——> 如果不存在,则在该路径下创建文件
    • 判断文件是否存在

      • 存在 —— >删除

    2015/11/23 9:44:36

    文件的读写

    • getCacheDir()方法用于获取/data/data//cache目录

    • getFilesDir()方法用于获取/data/data//files目录

    • 写入内容(writeObject、ObjectOutputStream方法)

      ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
      oos.writeObject(data);
      oos.close();
      
    • 读取内容(readObject、ObjectInputStream方法)

      ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
      ois.readObject();
      ois.close();
      

    2015/11/23 10:51:00

    通过文件保存、读取数据需要序列化

    2015/11/6 10:49:42

    关于String的subString方法

    • subString(int start,int end)中的start、end指的是第几位(从start开始,不算strat到end的字符)
    String date =20151106
    year = date.subString(0,4);
    month = date.subString(4,6);
    day = date.subString(6,8);
    

    陷阱

    集合删除元素

    • 比较两段代码的不同

    示例一:Iterator删除

    Iterator<ShowInfo> iterator = showList.iterator();
    if (iterator.hasNext()) {
       ShowInfo delShow = iterator.next();
        if (delShow.isCheck() == true) {
                    iterator.remove();
        }
    }
    

    示例二: for循环删除

    for(int i =0;i<list.size();i++){
        list.remove(i);
        i--;
    }
    

    静态成员只初始化一次(创建第一个对象时)

    必须同时重写equal跟hashCode方法

    • 如何重写equal方法?

      1. 判断两个对象是否相等 if(this==obj)
      2. 判断是否本类实例化的对象 if(obj instanceof Test)
      3. 判断各种属性(将obj强转成本类)
      
    public class Test{
    
        private String name;
    
        @Override
        public boolean equals(Object obj) { //此处必须是Object对象
    
            if(this == obj){return true;}
            if(!obj instanceof Test){return false} //obj不是Test实例化的对象
            Test test = (Test)obj;
            //判断各种属性
            if(name.equal(obj.getName())){return true;}
        }
    
    }
    
    • 如何重写hashCode方法

      1. 定义常量基数prime = 31
      2. 定义存放散列值的变量 result = 1
      3. 散码值通过属性判断,属性为空,则为0,否则调用hashCode方法获取散列值
      4. 结果= 基数 * 散列码变量 +散列值
      
    @Override
    public int hashCode() {    
        final int prime = 31;
        int result = 1;
        result = prime * result + (name==?0:name.hashCode());
        return result;
    }
    

    2016/1/29 18:57:16

    集合按某个属性(时间)排序

    • 使用Collections的排序方法sort()
    • 对象需要实现Comparable接口、重写compareTo方法

      • 下面是重写compareTo方法的过程

        @Override
        public int compareTo(Object another) {
            if (another instanceof User) {
                return ((Long) ((User) another).getLastContentTime()).compareTo((Long) this.getLastContentTime());
            } else {
                return 0;
            }
        }
        

    总结:使用不了compareTo方法需要将其属性强转。

    Contents
    1. 1. 2015/11/18 15:03:43
      1. 1.1. 回调函数Callback的理解
    2. 2. 2015/11/19 10:56:14
      1. 2.1. 特征
      2. 2.2. 示例:
      3. 2.3. 示例:
    3. 3. 2015/11/23 9:36:28
      1. 3.1. 文件(目录)操作File的理解
    4. 4. 2016/1/22 19:02:35
      1. 4.1. 文件流的理解
      2. 4.2. 示例 —— 写一个用文件保存数据的方法
      3. 4.3. 总结 —— 创建一个文件的过程
    5. 5. 2015/11/23 9:44:36
      1. 5.1. 文件的读写
    6. 6. 2015/11/23 10:51:00
      1. 6.1. 通过文件保存、读取数据需要序列化
    7. 7. 2015/11/6 10:49:42
      1. 7.0.1. 关于String的subString方法
  • 陷阱
    1. 0.1. 集合删除元素
    2. 0.2. 静态成员只初始化一次(创建第一个对象时)
    3. 0.3. 必须同时重写equal跟hashCode方法
  • 1. 2016/1/29 18:57:16
    1. 1.1. 集合按某个属性(时间)排序