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. [BZOJ4857][JSOI2016]反质数序列[最大点独立集]

    题意 在长度为 \(n\) 的序列 \(a\) 中选择尽量长的子序列,使得选出子序列中任意两个数的和不为质数. \(n\leq3000\ ,a_i\leq10^5\). 分析 直接按照奇偶性建立二分图 ...

  2. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  3. Neo4j 第四篇:使用C#更新和查询Neo4j

    本文使用的IDE是Visual Studio 2015 ,驱动程序是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,创建的类库工程(Project)要求安装 .NET Framewo ...

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

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

  5. chrome浏览器插件 Octotree 让你浏览GitHub的时候像IDE 一样提供项目目录

    GitHub 作为代码托管平台,竟然没有提供项目目录,方便用户在线快速浏览项目结构.所以,在线分析项目源码就会变得很繁琐,必须一层一层点击,然后再一次一次地向上返回.要知道,本来 GitHub 网站在 ...

  6. 解决SSH登录用户执行的命令部分环境变量参数不生效的问题

    问题概况 linux机器在/etc/profile配置完成环境变量后,SSH到目标机器执行命令,但是获取不到已配置的环境变量值. 例如场景: 在/etc/profile配置了http代理 export ...

  7. Katalon Studio学习笔记(二)——请求响应中文乱码解决方法

    Katalon Studio接口测试发现返回的中文消息是乱码,这是因为KS的编码格式是UTF-8,因此导致中文字体出现乱码.如下图所示: 在我们的系统中添加一个名字为JAVA_TOOL_OPTIONS ...

  8. WebShell代码分析溯源(第1题)墨者学院

    一.访问链接 二.下载系统源码后直接放到D盾里扫描,扫到后门文件 三.查看该木马文件 <?php error_reporting(0); $_GET['POST']($_POST['GET']) ...

  9. [咸恩静][Real Love]

    歌词来源:http://music.163.com/#/song?id=484056972 作曲 : Andrew 崔/Brian Cho/220 [作曲 : Andrew 崔/Brian Cho/2 ...

  10. 【Alpha】第三次Scrum meeting

    今日任务一览: 导航栏诞生 前期准备的Latex文本将撰写完毕 生成燃尽图的问题已经解决 姓名 今日完成任务 所耗时间 刘乾 用Github成功生成了燃尽图(真是不容易啊...),与架构师继续每日面基 ...