如何读取在运行时创建的文件?

时间:2016-11-13 02:37:29

标签: java file intellij-idea

使用Java 8.

基本上,在单元测试(junit)中我有这个代码:

callSomeCode();
assertTrue(new File(this.getClass().getResource("/img/dest/someImage.gif").getFile()).exists());

callSomeCode()中,我有这个:

InputStream is = bodyPart.getInputStream();
File f = new File("src/test/resources/img/dest/" + bodyPart.getFileName()); //filename being someImage.gif
FileOutputStream fos = new FileOutputStream(f);
byte[] buf = new byte[40096];
int bytesRead;
while ((bytesRead = is.read(buf)) != -1)
   fos.write(buf, 0, bytesRead);
fos.close(); 

第一次运行测试时,this.getClass().getResource("/img/dest/someImage.gif")会返回null,尽管文件已经很好地创建了。

第二次(当文件在第一次测试运行期间已经创建然后被覆盖时),它是非空的并且测试通过。

如何让它第一次运作?
我应该在IntelliJ中配置一个特殊设置来自动刷新创建文件的文件夹吗?

请注意,我有这个基本的maven结构:

--src
----test
------resources   

2 个答案:

答案 0 :(得分:2)

正如nakano531的评论所指出的那样 - 你的问题不是文件系统,而是类路径。您正在尝试使用类加载器通过调用getClass().getResource(...)方法来读取文件,而不是使用直接访问文件系统的类来读取文件。

例如,如果您已经按照以下方式编写了测试:

callSomeCode();
File file = new File("src/test/resources/img/dest/someImage.gif");
assertTrue(file.exists());

你现在不会遇到这个问题。

您的另一个选择是通过nakano531提供的链接实施解决方案:https://stackoverflow.com/a/1011126/1587791

答案 1 :(得分:0)

我陷入了同样的情况,一种解决方法是延迟行的执行,该行从运行时创建的文件中读取行。使用这个:

callSomeCode();
Thread.sleep(6000);
assertTrue(new File(this.getClass().getResource("/img/dest/someImage.gif").getFile()).exists());