相关内容原文地址:

简书:SunnyMore:Scala文件操作详解

CSDN:残缺的孤独:Scala 文件读写及Scala控制台输入

CSDN:power0405hf:Scala 文件操作

博客园:飞末:scala2.11读取文件



一、遍历一个文件中的每一行

必须导入scala.io.Source类: import scala.io.Source

import scala.io.Source
val source = Source.fromFile("myfile.txt", "UTF-8")
val lineIterator = source.getLines
val lines1 =lineIterator.toArray
val lines2 = lineIterator.toBuffer
//将文件内容读成字符串
val lines = source.mkString
source.close

方法一: 使用Source.getLines返回的迭代器

val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
val lineIterator = source.getLines
for (line <- lineIterator) println(line)
println("读取本地文件:")
val localfile = Source.fromFile("D:\\ww\\test.txt","GBK") //中文乱码
for(line <- localfile.getLines()){
println(line)
}
localfile.close()

方法二: 将Source.getLines返回的迭代器,转换成数组

一个BufferedSource对象的getLines方法,只能调用一次,一次调用完之后,遍历了迭代器里所有的内容,就已经把文件里的内容读取完了

如果反复调用source.getLines,是获取不到内容的

此时,必须重新创建一个BufferedSource对象

val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
val lines = source.getLines.toArray
for(line <- lines) println(line)

方法三: 调用Source.mkString,返回文本中所有的内容

val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
val lines = source.mkString

二、遍历一个文件中的每一个字符

使用完BufferedSource对象之后,调用BufferedSource.close方法,关闭IO流资源。

BufferedSource,也实现了一个Iterator[Char]的这么一个trait。

val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
for(c <- source) print(c)

三、从URL以及字符串中读取字符

val source = Source.fromURL("http://www.baidu.com", "UTF-8")
val source = Source.fromString("Hello World")

四、结合Java IO流,读取任意文件

spark的源码是由scala和java共同编写而成的,Java的多线程

scala,本身的编程语言的功能,就不是特别的强大和完善,比如说,scala甚至不能很方便地写文件,必须依赖于java的io流才可以

所以说,scala,其实主要就是针对某些特定领域的一些复杂系统的,比较适用的一种编程语言而已

完全无法替代java的,scala和java是相辅相成,荣辱与共的这么一种,共生关系

案例: 结合java IO流,做一个文件拷贝的案例

import java.io._

val fis = new FileInputStream(new File("C://Users//Administrator//Desktop//test.txt"))
val fos = new FileOutputStream(new File("C://Users//Administrator//Desktop//test3.txt")) val buf = new Array[Byte](1024)
fis.read(buf)
fos.write(buf, 0, 1024) fis.close()
fos.close()

4.1 结合Java IO流,写文件

val pw = new PrintWriter("C://Users//Administrator//Desktop//test4.txt")
pw.println("Hello World")
pw.close()
println("向文件中写数据:")
val writer = new PrintWriter(new File("test.txt")) //当前工程根目录下
for(i <- 1 to 100)
writer.println(i)
writer.close()
}

new FileWriter("/home/hadoop3/file/num1.txt",true)如果文件不存在,则会新建文件,true是在文件末尾追加写入,默认为false,从文件开头重新写,如果之前有内容,则会删除原有内容。

import java.io.FileWriter
println(Try{
val out = new FileWriter("/home/hadoop3/file/num1.txt",true)
for (i <- 0 to 15)
out.write(i.toString)
out.close()
})

4.2 递归遍历子目录

def getSubdirIterator(dir: File): Iterator[File] = {
val childDirs = dir.listFiles.filter(_.isDirectory)
childDirs.toIterator ++ childDirs.toIterator.flatMap(getSubdirIterator _)
} val iterator = getSubdirIterator(new File("C://Users//Administrator//Desktop")) for(d <- iterator) println(d)

访问目录:

import java.nio.file._
val dirname = "/home/cay/scala-impatient/code"
val entries = Files.walk(Paths.get(dirname)) // or Files.list
try {
entries.forEach(p => println(p))
} finally {
entries.close()
}

4.3 序列化以及反序列化(Java序列化和反序列化机制)

如果要序列化,那么就必须让类,有一个@SerialVersionUID,定义一个版本号

要让类继承一个Serializable trait。

@SerialVersionUID(42L) class Person(val name: String) extends Serializable
val leo = new Person("leo") import java.io._ val oos = new ObjectOutputStream(new FileOutputStream("C://Users//Administrator//Desktop//test.obj"))
oos.writeObject(leo)
oos.close() val ois = new ObjectInputStream(new FileInputStream("C://Users//Administrator//Desktop//test.obj"))
val restoredLeo = ois.readObject().asInstanceOf[Person]
restoredLeo.name

五、控制台输入

print("控制台输入,请输入:")
val content = Console.readLine() //2.11.0按照下面的方法
println(content)
print("控制台输入,请再次输入:")
val content1 = StdIn.readLine()
println(content1)

六、读取字符

val iter = source.buffered 

while(iter.hasNext){
if(iter.next == '王'){
println("wang")
}else{
println("-")
}
}
import scala.io.Source
val source = Source.fromFile("myfile.txt", "UTF-8")
for (c <- source) 处理 c //想查看某个字符但又不处理它的话,可以调用source对象的buffered方法
val source = Source.fromFile("myfile.txt", "UTF-8")
val iter = source.buffered
while (iter.hasNext){
if(iter.head 是符合预期的)
处理 iter.next
else ...
}
source.close()

七、读取词法单元或数字

val iter 2= source.mkString.split("\\s+") 

val num = for(w <- iter2) yield w.toDouble 

for(i <- num) println(i)
val tokens = source.mkString.split("\\s+")

val numbers = for(w <- tokens) yield w.toDouble
//或者
val numbers = tokens.map(_.toDouble)

八、从URL或其它资源读取

val source1 = Source.fromURL("http://baidu.com")//URL读取
val source2 = Source.fromString("hello")//读取给定的字符串-多用于调试
import scala.io.StdIn
val ms=StdIn.readLine()

九、读取二进制文件

import java.io.{File, FileInputStream}
val file = new File(" ")
val in = new FileInputStream(file)
val bytes = new Array[Byte](file.length.toInt)
in.read(bytes)
in.close()

十、RandomAccessFile

该对象特点:

1,该对象只能操作文件,所以构造函数接收两种类型的参数。

a.字符串路径。

b.File对象。

2,该对象既可以对文件进行读取,也可以写入。

在进行对象实例化时,必须要指定的该对象的操作模式,r rw等。

注意;该对象在实例化时,如果要操作的文件不存在,会自动建立。

如果要操作的文件存在,则不会建立。

如果存在的文件有数据,那么在没有指定指针位置的情况下,写入数据,会将文件开头的数据覆盖。

import java.io.RandomAccessFile
val randomFile = new RandomAccessFile("/home/hadoop3/file/num.txt","rw")
val fileLength = randomFile.length; //得到文件长度 randomFile.seek(fileLength);//指针指向文件末尾
for(i<- 'a' to 'g')
randomFile.writeBytes(i.toString);//写入数据
randomFile.close();

Scala-文件操作的更多相关文章

  1. Scala文件操作

    Scala中的文件操作基本可以依赖于Java的实现,包括输入.输出流的使用. object FileOps {def main(args: Array[String]) { val file = So ...

  2. scala简单的文件操作

    1.scala写入文件操作 package com.test import java.io.File import java.io.PrintWriter /** * scala文件写入 */ obj ...

  3. Spark RDD/Core 编程 API入门系列之动手实战和调试Spark文件操作、动手实战操作搜狗日志文件、搜狗日志文件深入实战(二)

    1.动手实战和调试Spark文件操作 这里,我以指定executor-memory参数的方式,启动spark-shell. 启动hadoop集群 spark@SparkSingleNode:/usr/ ...

  4. Python爬虫与数据分析之进阶教程:文件操作、lambda表达式、递归、yield生成器

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  5. 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档

    .net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ...

  6. 野路子出身PowerShell 文件操作实用功能

    本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...

  7. Node基础篇(文件操作)

    文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ...

  8. 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)

    ========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...

  9. SQL Server附加数据库报错:无法打开物理文件,操作系统错误5

    问题描述:      附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ...

  10. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

随机推荐

  1. Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?

    我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随 ...

  2. SalesForce学习——权限管理

    Salesforce 对于权限的管理是非常严谨的并且支持不同维度的权限控制.常用的有简档.权限集.角色层级机构.组织范围. 简档:Profiles是Salesforce为每个用户指定的标准配置文件,在 ...

  3. Kubernetes官方java客户端之四:内部应用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. Synchronized 精讲

    1.简介 1.1 作用 在并发场景中,保证同一时刻只有一个线程对有并发隐患的代码进行操作 1.2 错误案例 需求:两个线程对 count 变量进行200000次循环增加,预期结果是400000次 pu ...

  5. Redis Cluster 集群节点信息 维护篇(二)

    集群信息文件: # cluster 集群内部信息对应文件,由集群自动维护. /data/soft/redis/6379data/nodes-6379.conf 集群信息查看: ./redis-trib ...

  6. 【老孟Flutter】源码分析系列之InheritedWidget

    老孟导读:这是2021年源码系列的第一篇文章,其实源码系列的文章不是特别受欢迎,一个原因是原理性的知识非常枯燥,我自己看源码的时候特别有感触,二是想把源码分析讲的通俗易懂非常困难,自己明白 和 让别人 ...

  7. 透过现象看本质:Java类动态加载和热替换

    摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...

  8. JVM有哪些垃圾回收器

    JVM 的垃圾回收器 目录 JVM 的垃圾回收器 经典垃圾收集器 Serial 收集器 ParNew 收集器 Parallel Scavenge 收集器 Serial Old 收集器 Parallel ...

  9. CentOS系统内核升级(在线 离线)

    为什么要升级内核? Docker 在CentOS系统中需要安装在 CentOS 7 64 位的平台,并且内核版本不低于 3.10:CentOS 7.× 满足要求的最低内核版本要求,但由于 CentOS ...

  10. Spring Security,没有看起来那么复杂(附源码)

    权限管理是每个项目必备的功能,只是各自要求的复杂程度不同,简单的项目可能一个 Filter 或 Interceptor 就解决了,复杂一点的就可能会引入安全框架,如 Shiro, Spring Sec ...