Java—Java web应用程序中文件的相对路径

Java—Java web应用程序中文件的相对路径,java,web-applications,Java,Web Applications,我想从java web应用程序中读取一个文件。我不想给出文件的绝对路径。我只想把文件放在我的web应用程序的某个目录中 或 它可以与.war文件(打包的web应用程序)一起放置 要为文件指定的相对路径。我尝试了/filename.csv,但没有成功 =======已更新======== 我将向我的客户交付WAR文件(打包的web应用程序)。此web应用程序将读取一个文件(比如SuppliedFile.csv),该文件将由客户端复制到服务器。因此,我需要一种机制(无论应用程序服务器是否取消标记WA

我想从java web应用程序中读取一个文件。我不想给出文件的绝对路径。我只想把文件放在我的web应用程序的某个目录中

它可以与.war文件(打包的web应用程序)一起放置

要为文件指定的相对路径。我尝试了
/filename.csv
,但没有成功

=======已更新========

我将向我的客户交付
WAR
文件(打包的web应用程序)。此web应用程序将读取一个文件(比如
SuppliedFile.csv
),该文件将由客户端复制到服务器。因此,我需要一种机制(无论应用程序服务器是否取消标记
WAR
都可以工作),以便web应用程序可以读取该文件

注:
我没有在servlet中使用
SuppliedFile.csv
。。。我在普通Java类中使用它…

您真的需要从文件加载它吗?如果将其放置在类中(在WEB-INF/classes中),则可以使用类加载器获得输入流:

InputStream csv = 
   SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");

如果您在web服务器中有该文件的路径,则可以使用获取服务器文件系统中的实际路径。请注意,它并不能保证在每个容器中都能工作(因为不需要容器来解包WAR文件并将内容存储在文件系统中,但大多数都需要)。而且我猜它对/WEB-INF中的文件不起作用,因为它们没有虚拟路径


另一种方法是使用返回URI的。此URI可能是一个“文件:”URL,但不能保证这一点。

您可以简单地访问系统上预先安排的文件路径。由于添加到webapp目录的文件可能会丢失或webapp可能无法解压缩,这一点更可取,具体取决于系统配置

在我们的服务器中,我们在应用服务器的JVM中定义了一个系统属性集,它指向应用程序外部数据的“主目录”。当然,这需要修改应用服务器的配置(-DAPP_HOME=…在启动时添加到JVM_OPTS),我们这样做主要是为了简化在应用服务器上下文之外运行的代码的测试

您可以同样轻松地从servlet配置中检索路径:

<web-app>
<context-param>
    <param-name>MyAppHome</param-name>
    <param-value>/usr/share/myapp</param-value>
</context-param>
...
</web-app>
正如我提到的,您最可能遇到的问题是安全限制。没有任何东西可以保证webapps可以准备其webapp根目录上的任何文件。但通常有一些简单的方法可以为特定Web应用程序的特定路径授予例外

无论您需要访问该文件的代码是什么,由于您在web应用程序中运行,因此可以保证首先初始化该文件,并且可以将其值隐藏在便于其他代码参考的位置,如我的示例中所示,或者更好,只需将路径作为参数传递给需要它的代码即可

另一种方法是使用ServletContext.getResource()返回URI。此URI 可能是一个“文件:”URL,但这不能保证

您不需要将其作为文件:。。。网址。您只需要将其作为JVM可以访问的URL
阅读——它将是。

许多流行的Java Web应用程序,包括和,都使用这种机制:

  • 或者,检查servlet上下文参数/init-param。这允许使用
    context.xml
    为每个servlet容器配置多个webapp实例,这可以通过修改WAR或更改服务器设置(在Tomcat的情况下)来完成

  • 检查环境变量(使用),如果已设置,则将该文件夹用作应用程序数据文件夹。e、 g.詹金斯使用
    Jenkins\u HOME
    和Nexus使用
    PLEXUS\u Nexus\u WORK
    。这允许灵活配置,而无需对WAR进行任何更改

  • 否则,使用用户主文件夹中的子文件夹,例如
    $home/.yourapp
    。在Java代码中,这将是:

    final File appFolder = new File(System.getProperty("user.home"), ".yourapp");
    
  • 还有另外一种方式,, 如果您使用的是像Tomcat这样的容器:

    String textPath = "http://localhost:8080/NameOfWebapp/resources/images/file.txt";
    

    还有别的办法吗。。。就像我们在独立应用程序中所做的那样,例如,File File=new File(“./fileName.csv”);这取决于您无法控制的“当前工作目录”。即便如此,除非webapp已经解包,否则它将无法工作。这种方法使它更容易实现test@Tim我将向我的客户机交付一个WAR文件(打包的web应用程序)。此web应用程序将读取一个文件(比如
    SuppliedFile.csv
    ),该文件将由客户端复制到服务器。所以我需要一种机制(无论应用程序服务器是否解除WAR标记,该机制都会工作),以便web应用程序可以读取该文件。。。。如果应用服务器未解压缩WAR文件,您的第一个解决方案(getRealPath())将失败。。。我认为您的第二个解决方案不起作用,因为我没有在servlet中使用
    SuppliedFile.csv
    。。。我在一个普通Java类中使用它……如果你不能保证webapp会被解包,那么让客户将文件放在webapp目录中就不是一个选项。无论哪种方法都不好。+1:不要让客户将文件放入(或编辑)webapp目录(或war文件)。这是首选方法。许多流行的预构建WAR,例如Jenkins和Nexus,都使用
    $HOME
    (系统属性
    user.HOME
    )来实现此目的。
    String textPath = "http://localhost:8080/NameOfWebapp/resources/images/file.txt";