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

                               作者:尹正杰

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

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

一.使用Scala拷贝文件实现

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.file import java.io._ object FileDemo {
/**
* 定义读取文件的方法
*/
def readFile(filePath:String): Unit ={
val f = new File(filePath)
val fis = new FileInputStream(f)
val buf = new BufferedReader(new InputStreamReader(fis))
var line = "";
/**
* 我这里定义一个标志位,判断文件是否读取完毕,不建议使用break,不仅仅是因为它需要导报,而是因为它是以抛异常的
* 方式结束了整个程序!这一点我真的想吐槽Scala啦!比起Python,Java,Golang,Scala是没有continue和break关键字的!
*/
var flag:Boolean= true
while (flag){
line = buf.readLine()
//注意,Scala在读取文件时,如果读到最后会返回一个null值,因此,此时我们将标志位改为false,以便下一次结束while循环
if (line == null){
flag = false
}else{
println(line)
}
}
buf.close()
fis.close()
} /**
* 拷贝文本文件
*/
def copyFile(Input:String)(OutPut:String): Unit ={
val input = new File(Input)
val output = new File(OutPut)
val fis = new FileInputStream(input)
val fos = new FileOutputStream(output)
val buf = new BufferedReader(new InputStreamReader(fis))
val cache = new BufferedWriter(new OutputStreamWriter(fos))
var line = "";
var flag:Boolean= true
while (flag){
line = buf.readLine()
if (line == null){
flag = false
}else{
cache.write(line)
cache.write("\r\n")
cache.flush()
}
}
cache.close()
fos.close()
fis.close()
println("拷贝完毕")
} /**
* 拷贝任意类型文件,包括二进制文件
*/
def copyFile2(Input:String)(OutPut:String): Unit ={
val fis = new FileInputStream(Input)
val fos = new FileOutputStream(OutPut)
//定义缓冲区
val buf = new Array[Byte](1024)
var len = 0 /**
* 注意:len = fis.read(buf)是一个赋值操作,这个赋值操作是没有任何的返回值的哟!因此我们需要返回len的值。
*/
while ({len = fis.read(buf);len} != -1){
fos.write(buf,0,len)
}
fos.close()
fis.close()
println("拷贝完毕")
} def main(args: Array[String]): Unit = {
var input = "D:\\BigData\\JavaSE\\yinzhengjieData\\1.java"
var output = "D:\\BigData\\JavaSE\\yinzhengjieData\\2.java"
// readFile(input)
copyFile2(input)(output)
}
} /*
以上代码输出结果如下 :
拷贝完毕
*/

二.读取用户的输出

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.file import scala.io.StdIn object ConsoleDemo {
def main(args: Array[String]): Unit = {
//控制台交互--老API
print("请输入内容:")
val consoleLine1 = Console.readLine()
println("老API输入的内容是:" + consoleLine1) //控制台交互--新API
print("请输入内容(新API):")
val consoleLine2 = StdIn.readLine()
println("新API输入的内容是:" + consoleLine2)
}
}

  以上代码执行结果如下:

三.Scala文件处理常用方法

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.file object SourceDemo {
def main(args: Array[String]): Unit = {
var input = "D:\\BigData\\JavaSE\\yinzhengjieData\\1.java"
val f = scala.io.Source.fromFile(input)
println(f) /**
* 迭代打印文件中的每行内容
*/
// val it = f.getLines()
// for(x <- it){
// println(x)
// } /**
* 读取整个文件串
*/
println(f.mkString) /**
* 迭代每个字符
*/
// for(c <- f){
// print(c)
// } /**
* 使用正则 s:空白符 S:非空白符
* 所谓的空白符就是指:空格,制表符,换行符等等
*/
// val arr = f.mkString.split("\\s+")
// for(a <- arr){
// println(a)
// } }
}

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

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

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

Scala进阶之路-I/O流操作之文件处理的更多相关文章

  1. Scala进阶之路-Spark本地模式搭建

    Scala进阶之路-Spark本地模式搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark简介 1>.Spark的产生背景 传统式的Hadoop缺点主要有以下两 ...

  2. Scala进阶之路-Spark独立模式(Standalone)集群部署

    Scala进阶之路-Spark独立模式(Standalone)集群部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道Hadoop解决了大数据的存储和计算,存储使用HDFS ...

  3. Scala进阶之路-Spark底层通信小案例

    Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...

  4. Scala进阶之路-尾递归优化

    Scala进阶之路-尾递归优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 递归调用有时候能被转换成循环,这样能节约栈空间.在函数式编程中,这是很重要的,我们通常会使用递归方法来 ...

  5. Scala进阶之路-面向对象编程之类的成员详解

    Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...

  6. Scala进阶之路-高级数据类型之集合的使用

    Scala进阶之路-高级数据类型之集合的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala 的集合有三大类:序列 Seq.集 Set.映射 Map,所有的集合都扩展自 ...

  7. Scala进阶之路-高级数据类型之数组的使用

    Scala进阶之路-高级数据类型之数组的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的初始化方式 1>.长度不可变数组Array 注意:顾名思义,长度不可变数 ...

  8. Scala进阶之路-Scala函数篇详解

    Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...

  9. Scala进阶之路-Scala的基本语法

    Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...

随机推荐

  1. Jenkins控制台输出乱码

    一.问题详情 jenkins构建mav任务,在控制台显示乱码: 二.原因分析 1. 查看系统编码和tomcat的编码都正常 # grep encoding /usr/local/tomcat/conf ...

  2. TMS320VC5509使用nof flash AM29LV400

    1. 硬件接口如下,其中nor flash的使用方法,写的时候和NAND FLASH是一样的,读的时候和DRAM是一样的 2. 看下擦除指令和编程指令 3. 代码如下 #include <csl ...

  3. Redis基本数据类型介绍笔记

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  4. java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除

    最近在做一个项目,需要实现这几项功能,上网查了很多资料,自己研究了好几天终于实现了,现在与大家分享一下. 一.JAVA实现文件夹的搜索   在百度搜索N个技术文章,从哪些大牛们共享的资料中终于写出了我 ...

  5. grunt源码解析:整体运行机制&grunt-cli源码解析

    前端的童鞋对grunt应该不陌生,前面也陆陆续续的写了几篇grunt入门的文章.本篇文章会更进一步,对grunt的源码进行分析.文章大体内容内容如下: grunt整体设计概览 grunt-cli源码分 ...

  6. 在 OSX 下使用 supervisor 管理服务

    我为什么想用 supervisor 来管理服务呢?因为我在系统管理上属于处女座+任性的气质. OSX 下办公用的是普通用户,我不想在 root 权限下做过多设置污染我的系统. OSX 下的服务管理我感 ...

  7. 软件测试_Loadrunner_APP测试_性能测试_脚本优化_脚本回放

    本文主要写一下在使用Loadrunner录制完毕APP脚本之后如何对脚本进行回放,如有不足,欢迎评论补充. 如没有安装Loadrunner软件,请查看链接:软件测试_测试工具_LoadRunner: ...

  8. C# List left join

    public class Test1 { public int ID { get; set; } public string Name { get; set; } } public class Tes ...

  9. 利用链式队列(带头节点)解决银行业务队列简单模拟问题(c++)-- 数据结构

    题目: 7-1 银行业务队列简单模拟 (30 分)   设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客 ...

  10. Beta版本冲刺(五)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...