Kotlin总结3

作者: 世外大帝 | 来源:发表于2017-09-25 11:03 被阅读83次

    Date

    这个是日常用的比较多的类,在kotlin中用传统的方法,IDEA会提示语法警告,有更好的方法,就是下面的

    • 传统的方法
      fun formatDate(date: Date, pattern: String): String = SimpleDateFormat(pattern).format(date)
    • kotlin推荐方法
      fun formatDate(date: Date, dateFormat: DateFormat): String = dateFormat.format(date)

    • 提示如下

    To get local formatting use getDateInstance(), getDateTimeInstance(), or getTimeInstance(), or use new SimpleDateFormat(String template, Locale locale) with for example Locale. US for ASCII dates.

    获得本地格式化请使用getDateInstance(),getDateTimeInstance(),或者getTimeInstance(),或者使用new SimpleDateFormat(String template, Locale locale),例如Locale.US为ASCII日期。

    • 但是它只提供了常用的,这些之外的,还是自定义吧

    静态常量和静态方法共存

    • 工具类
    
    object DateUtils {
        
        const val SFStr = "yyyyMMdd"
    
        fun formatDate(date: Date, pattern: String): String = SimpleDateFormat(pattern).format(date)
        }
    
    
    • 引用
    //java
    DateUtils.INSTANCE.formatDate(new Date(),DateUtils.DF_YYYYMMDDHHMMSS);
    //kotlin
    DateUtils.formatDate(Date(),DateUtils.DF_YYYYMMDDHHMMSS)
    

    java的引用,看起来是个单例,但是我的习惯是像java的静态方法一样调用

    • class可以做到,如果把工具类改成class,那么静态常量就没法用了
    • 伴生对象也可以做到,但object又不允许有伴生对象
    • 所以,加个注解就搞定了@JvmStatic
    • 加了注解不影响kotlin调用,只是简化了java调用
    //工具类方法
    @JvmStatic
    fun formatDate(date: Date, pattern: String): String = SimpleDateFormat(pattern).format(date)
    
    //java调用
    DateUtils.formatDate(new Date(),DateUtils.DF_YYYYMMDDHHMMSS);
    

    Kotlin读写流操作

    写文件在java中是这么操作的

        public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {
            InputStream in = new ByteArrayInputStream(bytes);
            File destFile = new File(filePath);
            if (!destFile.getParentFile().exists()) {
                destFile.getParentFile().mkdirs();
            }
            destFile.createNewFile();
            OutputStream out = new FileOutputStream(destFile);
            byte[] cache = new byte[CACHE_SIZE];
            int nRead = 0;
            while ((nRead = in.read(cache)) != -1) {
                out.write(cache, 0, nRead);
                out.flush();
            }
            out.close();
            in.close();
        }
    

    转成kotlin后,是不允许在while中写赋值表达式的,弄好好久,发现应该是这样的

        @Throws(Exception::class)
        fun byteArrayToFile(bytes: ByteArray, filePath: String) {
            val inStream = ByteArrayInputStream(bytes)
            val destFile = File(filePath)
            if (!destFile.parentFile.exists()) {
                destFile.parentFile.mkdirs()
            }
            destFile.createNewFile()
            val out = FileOutputStream(destFile)
            val cache = ByteArray(CACHE_SIZE)
            var nRead = inStream.read(cache)
    
            while (nRead != -1) {
                out.write(cache, 0, nRead)
                nRead = inStream.read(cache)
            }
            inStream.copyTo(out)
            out.close()
            inStream.close()
        }
    

    然后Slient大神发了一个扩展方法InputStream.copyTo

    于是就变成这样了

    @Throws(Exception::class)
    fun byteArrayToFile(bytes: ByteArray, filePath: String) {
        val inStream = ByteArrayInputStream(bytes)
        val destFile = File(filePath)
        if (!destFile.parentFile.exists())
            destFile.parentFile.mkdirs()
        destFile.createNewFile()
        val out = FileOutputStream(destFile)
        inStream.copyTo(out,MemoryUtils.KB)
        out.close()
        inStream.close()
    }
    

    卧槽,感觉好多语法糖,上次忘了一个什么方法,写了半天,也是Slient大神给了个语法糖

    相关文章

      网友评论

      • 皮球二二:Kotlin不是提供了文件读写方法吗
        世外大帝:是有读写方法,文中也展示出来了,但是同时提供了第二种方式:更简便的语法糖
      • smartapple:copyTo???为什么要这样用呢
        世外大帝:因为kotlin已经把原来java的那部分封装好了,可以看copyTo的源码,整体结构和原来还是一样的

      本文标题:Kotlin总结3

      本文链接:https://www.haomeiwen.com/subject/clvrextx.html