Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Playframework中将资源文件作为InputStream获取_Java_Playframework - Fatal编程技术网

Java 在Playframework中将资源文件作为InputStream获取

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

文件路径-相对于什么?项目根?playframework根目录?绝对路径


或者可能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
     }
}