Scala Future实践踩坑了~
Posted 柚子聊大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala Future实践踩坑了~相关的知识,希望对你有一定的参考价值。
今天写了一段简单的Java IO代码去造数据,信心满满的等待结果,最后连文件都没有生成!代码如下:
val future = Future {
val writer = Files.newWriter(new File(s"F:\\stock5\\${Thread.currentThread().getName}"),Charsets.UTF_8)
var i = 1;
println(s"${Thread.currentThread().getName} is start .${LocalDateTime.now()}")
while (i < 10000000) {
val content = s"${org.get(i%orgSize)},${product.get(i%productSize)._1},${date.get(i%dateSize)},${style.get(i%styleSize)},${color.get(i%colorSize)._2},${size.get(i%sizeSize)._1},${product.get(i%productSize)._2},0,27,9,9,0,0,0,2021-05-26 17:02:02,0,0,${color.get(i%colorSize)._1},2021-05-26 17:02:02,0,0,9,${floor.get(i%floorSize)},${size.get(i%sizeSize)._2},${size.get(i%sizeSize)._3}"
writer.write(content)
writer.newLine()
i=i+1
}
writer.flush()
writer.close()
println(s"${Thread.currentThread().getName} is end .${LocalDateTime.now()}")
}(ec)
本地debug一下,发现由于输出目录不存在而导致Files.newWriter语句构造BufferedWriter对象时产生异常,但却没有打印出来~IDE也没提示要catch exception~那咋办?于是想到了scala 回调方法,如下所示:
// 每个future对象上添加回调函数(也是一个线程);
future.onComplete({
case Success(value)=>println(s"success :${value}")
case Failure(exception)=>println(s"failed :${exception}")
})(ec)
印象当中,Java 输出流会自动创建输出文件,也确实没有注意当文件所处的目录不存在时会不会自动创建目录(上述的代码其实已经给出了答案:不会创建,直接抛出异常)下面是两段测试代码:
@Test
public void writeFile() throws IOException {
// Java原生IO输出流不支持创建目录;
FileOutputStream fileOutputStream = new FileOutputStream(new File("F:\\stock2\\raw.txt"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
writer.write("hello duzer");
writer.flush();
writer.close();
}
@Test
public void guavaOutputFile() throws IOException {
// guava类库输出流方式创建;(底层也没有去判断输出目录是否存在,并创建;)
BufferedWriter writer = Files.newWriter(new File("F:\\stock3\\guava.txt"), Charsets.UTF_8);
writer.write("hello duzer");
writer.flush();
writer.close();
}
两个测试用例均会打印如下所示的堆栈信息:
java.io.FileNotFoundException: F:\stock2\raw.txt (系统找不到指定的路径。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at OutputStreamDemo.writeFile(OutputStreamDemo.java:10)
总结
1、使用scala Future创建对象时,防止Future 任务中会抛出异常,建议带上回调函数以监听任务执行情况。
2、Java 输出流并不会创建输出目录,不存在时会抛出异常~
以上是关于Scala Future实践踩坑了~的主要内容,如果未能解决你的问题,请参考以下文章