Scala进阶之路-I/O流操作之文件处理
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流操作之文件处理的更多相关文章
- Scala进阶之路-Spark本地模式搭建
Scala进阶之路-Spark本地模式搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark简介 1>.Spark的产生背景 传统式的Hadoop缺点主要有以下两 ...
- Scala进阶之路-Spark独立模式(Standalone)集群部署
Scala进阶之路-Spark独立模式(Standalone)集群部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道Hadoop解决了大数据的存储和计算,存储使用HDFS ...
- Scala进阶之路-Spark底层通信小案例
Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...
- Scala进阶之路-尾递归优化
Scala进阶之路-尾递归优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 递归调用有时候能被转换成循环,这样能节约栈空间.在函数式编程中,这是很重要的,我们通常会使用递归方法来 ...
- Scala进阶之路-面向对象编程之类的成员详解
Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...
- Scala进阶之路-高级数据类型之集合的使用
Scala进阶之路-高级数据类型之集合的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala 的集合有三大类:序列 Seq.集 Set.映射 Map,所有的集合都扩展自 ...
- Scala进阶之路-高级数据类型之数组的使用
Scala进阶之路-高级数据类型之数组的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的初始化方式 1>.长度不可变数组Array 注意:顾名思义,长度不可变数 ...
- Scala进阶之路-Scala函数篇详解
Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...
- Scala进阶之路-Scala的基本语法
Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...
随机推荐
- java maven项目迁移时缺失jar包 或者 maven jar包缺失时的解决方案
这样弄完,jar包就都下载好了,就不缺失了. 从GitHub上checkout一个项目下来,导入idea后发现加载依赖奇慢无比,所以临时把网络调成FQ的代理,结果会发现idea会停止之前的下载,那怎么 ...
- mybatis 初步使用(IDEA的Maven项目, 超详细)
目录 创建 Maven 项目 Maven配置 pom.xml 创建数据库 配置Mybatis 配置mybatis的XML文件 创建实体类和对应的Mapper.xml 测试 源码 @ 创建 Maven ...
- 设计模式 笔记 状态模式 State
//---------------------------15/04/28---------------------------- //State 状态模式----对象行为型模式 /* 1:意图: ...
- Js_获取浏览器等高宽
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document. ...
- Golang Context 详细介绍
Golang context 本文包含对context实现上的分析和使用方式,分析部分源码讲解比价多,可能会比较枯燥,读者可以直接跳过去阅读使用部分. ps: 作者本着开源分享的精神撰写本篇文章,如果 ...
- PAT甲题题解-1096. Consecutive Factors(20)-(枚举)
题意:一个正整数n可以分解成一系列因子的乘积,其中会存在连续的因子相乘,如630=3*5*6*7,5*6*7即为连续的因子.给定n,让你求最大的连续因子个数,并且输出其中最小的连续序列. 比如一个数可 ...
- 《Linux内核分析》第四周笔记 扒开系统调用的三层皮(上)
扒开系统调用的三层皮(上) 一.用户态.内核态和中断 库函数将系统调用封装起来. 1.什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别. 在高执行级别下,代码可以执行特权指令,访问任意的 ...
- beta版本“足够好”/测试矩阵
能通过地图鱼相应的地点信息实时交互,便于用户操作. 测试矩阵
- mark1-git
Administrator@-20131003RY MINGW64 ~ $ pwd /c/Users/Administrator Administrator@-20131003RY MINGW64 ~ ...
- 数据平面可编程与SDN关系理解,以及数据平面可编程的理解
数据平面可编程与SDN关系 狭义 广义 数据平面可编程的理解 狭义 广义