今天进行spark MLlib测试,修改了decisiontree的源码,准备将运行过程中的时间等参数都写入文件,以便后面对数据进行分析和可视化处理,在这过程中需要使用Scala对文件进行读写操作。就记录下了相关过程。对文件相关知识进行温习。
一、Java操作文件
1.1 写文件
①FileWritter
用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
在构造方法上,常用的主要有以下几个:
FileWriter(File file):
根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append)
根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
其中后面的bool变量用于指定是否覆盖原内容。
其对应的方法有:
close():关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。
flush():刷新该流的缓冲。
write(int c):写入单个字符。
write(String str, int off, int len):写入字符串
append(char c):将指定字符添加到此 writer
②BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 该类提供了 newLine() 方法,它使用平台自己的行分隔符概念。
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
常用方法有:
void close()
关闭此流,但要先刷新它。
void flush()
刷新该流的缓冲。
void newLine()
写入一个行分隔符。
void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(int c)
写入单个字符。
void write(String s, int off, int len)
写入字符串的某一部分。
③FileOutputStream
此类是过滤输出流的所有类的超类。这些流位于已存在的输出流(基础 输出流)之上,它们将已存在的输出流作为其基本数据接收器,但可能直接传输数据或提供一些额外的功能。 FilterOutputStream 类本身只是简单地重写那些将所有请求传递给所包含输出流的 OutputStream 的所有方法。FilterOutputStream 的子类可进一步地重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
FilterOutputStream(OutputStream out)
创建一个构建在指定基础输出流之上的输出流过滤器。
常用方法有:
void close()
关闭此输出流并释放与此流有关的所有系统资源。
void flush()
刷新此输出流,并强制将所有已缓冲的输出字节写入该流中。
void write(byte[] b)
将 b.length 个字节写入此输出流。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
void write(int b)
将指定 byte 写入此输出流。
下面写一些代码对以上方法进行测试:
①filewriter测试
package file;
import java.io.FileWriter;
import java.io.IOException;
public class main {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileWriter fw=null;//要实现建立引用,否则finally找不到
try {
fw=new FileWriter("1.txt");
fw.write('e');
fw.write("hello");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
②BufferedWriter
package file;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class main {
public static void main(String[] args) {
BufferedWriter bw=null;
try {
bw=new BufferedWriter(new FileWriter("1.txt"));
bw.newLine();//自有换行符
bw.append('3');
bw.write("hello");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
bw.flush();
//使用BufferedWriter一定要在关闭前刷新
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二、Scala操作文件
Scala本身并未并未提供写文件的API,如果需要些文件,我们可以使用Java的API,例如FileWriter等或者引入scala.io库。
下面看一个例子
import java.io._
import scala.io.Source
object WriteFile {
def main(args: Array[String]): Unit = {
val bw=new BufferedWriter(new FileWriter("1.txt"))
bw.append("Hello")
bw.close()
val rf=Source.fromFile("1.txt").getLines.toList
rf.foreach(println)
}
}