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实践踩坑了~的主要内容,如果未能解决你的问题,请参考以下文章

踩坑了!踩坑了!NHibernate使用批量插入Oracle数据,Batch属性

没错,使用 Nacos 踩坑了

为啥Spring事务失效了,你踩坑了吗?

Scala Future

踩坑了,BigDecimal 使用不当,造成P0事故!

Scala之Future