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) }
}
访问成功的话,在控制端会打印如下信息: