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("\r\n")
 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 }

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值