• Scala进阶之路-I/O流操作之文件处理


                 Scala进阶之路-I/O流操作之文件处理

                                   作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

      说起Scala语言操作文件对象其实是很简单的,大部分代码和Java相同。

    一.使用Scala拷贝文件实现

      1 /*
      2 @author :yinzhengjie
      3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
      4 EMAIL:y1053419035@qq.com
      5 */
      6 package cn.org.yinzhengjie.file
      7 
      8 import java.io._
      9 
     10 object FileDemo {
     11     /**
     12       * 定义读取文件的方法
     13       */
     14     def readFile(filePath:String): Unit ={
     15         val f = new File(filePath)
     16         val fis = new FileInputStream(f)
     17         val buf = new BufferedReader(new InputStreamReader(fis))
     18         var line = "";
     19         /**
     20           *     我这里定义一个标志位,判断文件是否读取完毕,不建议使用break,不仅仅是因为它需要导报,而是因为它是以抛异常的
     21           * 方式结束了整个程序!这一点我真的想吐槽Scala啦!比起Python,Java,Golang,Scala是没有continue和break关键字的!
     22           */
     23         var flag:Boolean= true
     24         while (flag){
     25             line = buf.readLine()
     26             //注意,Scala在读取文件时,如果读到最后会返回一个null值,因此,此时我们将标志位改为false,以便下一次结束while循环
     27             if (line == null){
     28                 flag = false
     29             }else{
     30                 println(line)
     31             }
     32         }
     33         buf.close()
     34         fis.close()
     35     }
     36 
     37     /**
     38       * 拷贝文本文件
     39       */
     40     def copyFile(Input:String)(OutPut:String): Unit ={
     41         val input = new File(Input)
     42         val output = new File(OutPut)
     43         val fis = new FileInputStream(input)
     44         val fos = new FileOutputStream(output)
     45         val buf = new BufferedReader(new InputStreamReader(fis))
     46         val cache = new BufferedWriter(new OutputStreamWriter(fos))
     47         var line = "";
     48         var flag:Boolean= true
     49         while (flag){
     50             line = buf.readLine()
     51             if (line == null){
     52                 flag = false
     53             }else{
     54                 cache.write(line)
     55                 cache.write("
    ")
     56                 cache.flush()
     57             }
     58         }
     59         cache.close()
     60         fos.close()
     61         fis.close()
     62         println("拷贝完毕")
     63     }
     64 
     65 
     66     /**
     67       * 拷贝任意类型文件,包括二进制文件
     68       */
     69     def copyFile2(Input:String)(OutPut:String): Unit ={
     70         val fis = new FileInputStream(Input)
     71         val fos = new FileOutputStream(OutPut)
     72         //定义缓冲区
     73         val buf = new Array[Byte](1024)
     74         var len = 0
     75 
     76         /**
     77           * 注意:len = fis.read(buf)是一个赋值操作,这个赋值操作是没有任何的返回值的哟!因此我们需要返回len的值。
     78           */
     79         while ({len = fis.read(buf);len} != -1){
     80             fos.write(buf,0,len)
     81         }
     82         fos.close()
     83         fis.close()
     84         println("拷贝完毕")
     85     }
     86 
     87     def main(args: Array[String]): Unit = {
     88         var input = "D:\BigData\JavaSE\yinzhengjieData\1.java"
     89         var output = "D:\BigData\JavaSE\yinzhengjieData\2.java"
     90 //        readFile(input)
     91         copyFile2(input)(output)
     92     }
     93 }
     94 
     95 
     96 
     97 
     98 /*
     99 以上代码输出结果如下 :
    100 拷贝完毕
    101  */

    二.读取用户的输出

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.file
     7 
     8 import scala.io.StdIn
     9 
    10 object ConsoleDemo {
    11     def main(args: Array[String]): Unit = {
    12         //控制台交互--老API
    13         print("请输入内容:")
    14         val consoleLine1 = Console.readLine()
    15         println("老API输入的内容是:" + consoleLine1)
    16 
    17         //控制台交互--新API
    18         print("请输入内容(新API):")
    19         val consoleLine2 = StdIn.readLine()
    20         println("新API输入的内容是:" + consoleLine2)
    21     }
    22 }

      以上代码执行结果如下:

    三.Scala文件处理常用方法

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.file
     7 
     8 object SourceDemo {
     9     def main(args: Array[String]): Unit = {
    10         var input = "D:\BigData\JavaSE\yinzhengjieData\1.java"
    11         val f = scala.io.Source.fromFile(input)
    12         println(f)
    13 
    14         /**
    15           *  迭代打印文件中的每行内容
    16           */
    17 //        val it = f.getLines()
    18 //        for(x <- it){
    19 //            println(x)
    20 //        }
    21 
    22         /**
    23           * 读取整个文件串
    24           */
    25         println(f.mkString)
    26 
    27         /**
    28           * 迭代每个字符
    29           */
    30 //        for(c <- f){
    31 //            print(c)
    32 //        }
    33 
    34         /**
    35           * 使用正则 s:空白符 S:非空白符
    36           *     所谓的空白符就是指:空格,制表符,换行符等等
    37           */
    38 //        val arr = f.mkString.split("\s+")
    39 //        for(a <- arr){
    40 //            println(a)
    41 //        }
    42 
    43     }
    44 }

      使用Scala爬取网页,在网上找了一些写的都长篇大论,属实懒得看,爬虫的话建议还是用Java或者Python去写,Java爬取网页的笔记可参考:https://www.cnblogs.com/yinzhengjie/p/9366013.html。

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.file
     7 
     8 import java.io.FileOutputStream
     9 
    10 object ReptilianDemo {
    11 
    12     def copyFile(Input:String)(OutPut:String): Unit ={
    13         val fos = new FileOutputStream(OutPut)
    14         fos.write(Input.getBytes())
    15         println("拷贝完毕")
    16     }
    17 
    18     def main(args: Array[String]): Unit = {
    19         /**
    20           * Scala的fromURL方法我是不推荐使用的,因为爬去的内容不完全,需要设置相应的参数,建议用java代码或者Python去爬取
    21           *     可参考:https://www.cnblogs.com/yinzhengjie/p/9366013.html
    22           */
    23         val res = scala.io.Source.fromURL("https://www.cnblogs.com/yinzhengjie")
    24         val html = res.mkString
    25         println(html)
    26         var output = "D:\BigData\JavaSE\yinzhengjieData\尹正杰.html"
    27         copyFile(html)(output)
    28 
    29     }
    30 }

      访问成功的话,在控制端会打印如下信息:

  • 相关阅读:
    webpack篇
    js 中对于this 的理解的 经典案例
    AMD、CMD、CommonJs和es6对比
    vue import异步加载js
    vscode 保存自动 格式化eslint 代码
    git设置
    面向对象的三大特性之继承
    面向对象 类与对象及其属性与方法 类的组合
    hashlib模块 hash算法
    configparser模块 配置文件的解析操作
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/9352806.html
Copyright © 2020-2023  润新知