Java 在Playframework中将资源文件作为InputStream获取
文件路径-相对于什么?项目根?playframework根目录?绝对路径Java 在Playframework中将资源文件作为InputStream获取,java,playframework,Java,Playframework,文件路径-相对于什么?项目根?playframework根目录?绝对路径 或者可能Play.classloader.getResourceAsStream的用法是错误的?相对于类路径根。也就是说,您的WEB-INF/classes+播放框架中WEB-INF/lib中的所有JAR“conf”目录位于类路径上,因此您可以将文件放在那里,并使用getResourceAsStream打开它 例如,如果您创建一个文件“conf/foo.txt”,您可以使用 Play.classloader.getReso
或者可能Play.classloader.getResourceAsStream的用法是错误的?相对于类路径根。也就是说,您的
WEB-INF/classes
+播放框架中WEB-INF/lib
中的所有JAR“conf”目录位于类路径上,因此您可以将文件放在那里,并使用getResourceAsStream打开它
例如,如果您创建一个文件“conf/foo.txt”,您可以使用
Play.classloader.getResourceAsStream(filepath);
作为使用
conf
dir(仅用于配置相关文件)的替代方法,您可以使用public
dir并通过以下方式访问它:
Play.classloader.getResourceAsStream("foo.txt");
或在Scala中使用:
Play.classloader.getResourceAsStream("public/foo.txt")
在Play2.5.x中,由于对类加载器之类的东西的全局访问正在慢慢地被淘汰,人们不赞成接受这个答案。处理这一问题的推荐方法是注入
play.api.Environment
,然后使用其classLoader
获取InputStream
,例如
Play.resourceAsStream("public/foo.txt")
注入
Environment
,然后调用Environment.resourceAsStream(“文件名”)代码>
例如:
class Controller @Inject()(env: Environment, ...){
def readFile = Action { req =>
...
//if the path is bad, this will return null, so best to wrap in an Option
val inputStream = Option(env.classLoader.getResourceAsStream(path))
...
}
}
文档:那么playframework wise可以在项目的“lib”文件夹中吗?getResourceAsStream的路径应该是“/filename”?它不能在/lib中。应该放在那个罐子里。我把它放在罐子里了。。还是不行。Playframework架构上的资源是否有不同的关联约定或方式?请尝试将其放入WEB-INF/classes
您是如何将该文件“发送”到getResourceAsStream的?如果该文件不是配置文件该怎么办?如果该文件不是配置文件则无所谓,您仍然可以将它放在conf目录中,并以这种方式访问它。对不起,我的观点是您不应该将非配置相关的文件放在conf目录中。其他开发人员在看你的代码时会感到混乱和困惑。我想你可以这样做,但对我来说还是有点脏。我在下面的另一个答案中添加了另一个选项(使用公用文件夹),但它也不是完美的。我认为Play 2需要为在生产模式下可以访问的私有资产/资源添加一个文件夹。Play 2.3不可用这是否会使具有URL的任何人都可以公开访问该文件?这是需要考虑的问题--这种方法不适合于您不想公开的资源。您的答案如下scala,而不是java
import javax.inject.Inject;
public class ExampleResource extends Controller{
private final Environment environment;
@Inject
public ExampleResource(Environment environment){
this.environment = environment;
}
public void readResourceAsStream() {
InputStream resource = environment.resourceAsStream("filename");
// Do what you want with the stream here
}
}