使用Scala实现文件读写操作详解
创作时间:
作者:
@小白创作中心
使用Scala实现文件读写操作详解
引用
1
来源
1.
http://www.cdweb.net/article/igijip.html
本文详细介绍了使用Scala进行文件读写操作的各种方法,包括读取行、读取字符、读取词法单元和数字、读取二进制文件、写入文本文件、访问文件目录、序列化以及正则表达式等。通过丰富的代码示例,帮助读者全面掌握Scala文件操作的相关知识。
读取行
要读取文件的所有行,可以使用scala.io.Source对象的getLines方法:
val source = Source.fromFile("a.txt", "utf-8")
val lineIterator = source.getLines
结果是一个迭代器,可以使用for循环处理这些行:
for (i <- lineIterator) println(i)
也可以使用迭代器的toArray或toBuffer方法,将这些行放到数组或数组缓冲区中。若想将读取的文件作为一个字符串,只需:
val contents = source.mkString
下面是读取桌面上的a.txt文件的完整代码示例:
object ReadFile {
def main(args: Array[String]): Unit = {
val read = new ReadFile()
val resource: String = "C:\\Users\\DonnieGao\\Desktop\\a.txt"
val encode = "UTF-8"
read.readFile(resource, encode)
println(read.readFileToStr(resource, encode))
}
}
class ReadFile {
/**
* 一行行读取文件的内容
*
* @param resource 文件路径
* @param code 文件编码格式
*/
def readFile(resource: String, code: String): Unit = {
var source: BufferedSource = null
try {
// 获取文件的Source对象,第一个参数是文件的路径,第二个文件的编码格式
source = Source.fromFile(resource, code)
val lineIterator = source.getLines()
while (true) {
if (lineIterator.hasNext) {
println(lineIterator.next())
} else {
return
}
}
} finally {
// 释放资源
source.close()
}
}
/**
* 将文本文件所有内容作为字符串
*
* @param resource 文件路径
* @param code 文件编码格式
* @return
*/
def readFileToStr(resource: String, code: String): String = {
// 获取文件的Source对象,第一个参数是文件的路径,第二个文件的编码格式
var source: BufferedSource = null
try {
source = Source.fromFile(resource, code)
source.mkString
} finally {
source.close()
}
}
}
读取字符
要将文件中读取单个字符,可以把Source对象当作迭代器。若仅仅只是想查看字符,可以调用Source对象的buffered方法。
读取词法单元和数字
读取源文件中所有空格隔开的词法单元:
val tokens = source.mkString.split("\\s+")
若有个基本都是浮点型的文件,可以将其读取到数组中:
val numbers = for (w <- tokens) yield w.toDouble
// 或者也可
val numbers = tokens.map(_.toDouble)
读取二进制文件
Scala并没有提供读取二进制文件的方法,可以使用Java读取二进制的方法:
val file = new File(fileName)
val in = new FileInputStream(file)
val bytes = new Array[Byte](file.length.toInt)
in.read(bytes)
in.close()
写入文本文件
Scala没有内建对写入文件的支持,可借助Java进行文件写入操作,例如使用java.io.PrintWriter:
def write(): Unit = {
val out = new PrintWriter("C:\\Users\\DonnieGao\\Desktop\\test.txt")
for (i <- 0 to 100) out.println(i)
out.close()
}
访问文件目录
Scala中没有直接访问某个目录下的所有文件的方式或者递归遍历有目录的类,可以使用Java的File类:
def dir(dir: String) = {
val dirFile = new File(dir)
val arrayFile = dirFile.listFiles()
for (i <- arrayFile) {
println(arrayFile.toBuffer)
}
}
序列化
在Java中声明一个可以被序列化的类通常是下面这种:
public class Person implements java.io.Serializable {
private static final long serialVersionUID = 4436475322569107137L;
}
在Scala中声明一个可以被序列化的类通常是下面这种:
@SerialVersionUID(12356L) class ReadFile extends Serializable {
}
正则表达式
Scala中提供了正则操作处理scala.util.matching.Regex让这件事情可以变得简单。构造一个Regex对象,用String类的r方法即可:
object RegexDemo {
def main(args: Array[String]): Unit = {
// 初始化正则对象
val numPattern = "[0-9]+".r
val regex = "13 welcome to beijing"
// findAllIn方法返回遍历所有匹配的迭代器,可以在for循环中使用
for (matchString <- numPattern.findAllIn(regex)) {
println(matchString)
}
// 查询字符串首个匹配项
println(numPattern.findFirstIn(regex))
// 检查某个字符串的开始部分能匹配,可以使用findPrefixOf
println(numPattern.findPrefixOf(regex))
}
}
通过上述内容,读者可以全面掌握使用Scala进行文件读写操作的各种方法。这些知识对于Scala开发者来说非常实用,可以帮助他们更好地处理文件操作相关的任务。
热门推荐
金骨莲胶囊治疗风湿病效果有限,专家建议作为辅助用药
广州塔下的宝藏景点:大佛寺&北京路步行街
郭子仪家族的那些事儿:从唐朝名将到清朝剃头匠
2025年中国道教协会招5人,应届毕业生可报名
胃病常用药奥美拉唑被重点监控,专家详解安全用药指南
超加工食品VS营养分级,谁更能帮你吃得健康?
浙江考古双重发现:雷峰塔地宫文物与良渚五千年水利文明
鸡胗营养价值超牛肉,三种家常做法详解
无人机专业迎来发展黄金期,应用广就业前景广阔
白萝卜助消化,慢性萎缩性胃炎患者食用需谨慎
清光绪年间传承至今,天津罾蹦鲤鱼制作详解
《走走停停》获三项大奖,高圆圆凭细腻演技摘最佳女配
广州塔周边打卡圣地,你去过几个?
研发团队管理的最佳实践与经验分享
《长恨歌》观演攻略:打卡大唐爱情圣地
维生素B族补充有讲究:过量有害,均衡为宜
成都地铁回应市民关切:班次、支付、建设进度全解析
免费西瓜、夜游岷江:眉山水街夏日纳凉全攻略
520表白攻略:从准备到应对的完整礼仪指南
手机连不上WiFi是什么原因?揭秘常见的连接故障及其解决方案
梅西VS C罗:世界杯预选赛的巅峰对决
高中生心理健康报告出炉:14.8%青少年存抑郁风险,家庭、学业压力成主因
周末游莆田九龙谷,赏瀑布群、探古道,65元起玩转4A景区
常用胃药奥美拉唑:疗效显著但需警惕长期使用风险
中老铁路三年成绩单:跨境货物运输覆盖19国,客流量增近三倍
解码胸痛:从轻微拉伤到致命信号,一文读懂如何应对
甘草泡水,秋冬养生神器!
从“滴血验亲”看甄嬛的职场智慧:冷静观察,化危为机
阿甘正传:慢语速南方口音,英语学习最佳影片
皮薄汁多,无锡灌汤包的百年味道与现代新变