English 中文(简体)
Java - j网应用中文档的相对途径
原标题:Java - Relative path of a file in a java web application

我想从Java Web应用程序中读取一个文件。我不想提供文件的绝对路径。我只想将文件放在我的Web应用程序的某个目录中。

或者

该文件可与“瓦尔号”文件一起存放。

文件要给什么相对路径。我尝试过./filename.csv,但它没有起作用。

Sorry, there is nothing for me to translate. Please provide the text you would like translated.

Updated

Sorry, there is nothing for me to translate. Please provide the text you would like translated.

我将向我的客户提供<代码>WAR文档(包装式网络应用程序)。 这一网络应用将读成一个文档(SuppliedFile.csv),用户将将其复制到服务器上。 因此,我需要一种机制(无论应用服务器是否会打开>,以便网络应用能够读到该文档)。

Note: I am not using the SuppliedFile.csv in a servlet... I am using it in a plain Java class...

最佳回答

你真的需要从文件中加载它吗?如果你把它放在你的类旁边(在WEB-INF/classes中),你可以使用类加载器获得它的InputStream:

InputStream csv = 
   SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");
问题回答

您可以简单地访问系统上预先安排的文件路径。这是更可取的,因为添加到Web应用程序目录中的文件可能会丢失,或者根据系统配置可能无法解压缩Web应用程序。

在我们的服务器中,我们定义了一个在应用服务器 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>

然后检索此路径并将其用作基本路径以读取客户提供的文件。

public class MyAppConfig implements ServletContextListener {

    // NOTE: static references are not a great idea, shown here for simplicity
    static File appHome;
    static File customerDataFile;

    public void contextInitialized(ServletContextEvent e) {

        appHome = new File(e.getServletContext().getInitParameter("MyAppHome"));
        File customerDataFile = new File(appHome, "SuppliedFile.csv");
    }
}

class DataProcessor {
    public void processData() {
        File dataFile = MyAppConfig.customerDataFile;
        // ...
    }
}

正如我所提到的,你可能会遇到的最大问题是安全限制。没有什么可以保证 Web 应用程序可以读取其 Web 应用程序根目录上方的任何文件。但通常可以使用简单的方法为特定路径授予特定 Web 应用程序的例外。

无论您需要访问此文件的代码是什么,由于您正在运行Web应用程序,因此您可以保证此文件将首先初始化,并且可以将其值存储在其他代码方便引用的地方,例如我的示例或更好的选择是将路径作为参数传递给需要它的代码。

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

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

  2. 检查一个环境变量(使用System.getenv),如果它被设置,则将该文件夹用作您的应用程序数据文件夹。例如,Jenkins使用JENKINS_HOME,而Nexus使用PLEXUS_NEXUS_WORK。这样可以进行灵活的配置,而无需对WAR进行任何更改。

  3. 否则,请在用户主目录下使用子文件夹,例如$HOME/.yourapp。在Java代码中,此操作将为:

    final File appFolder = new File(System.getProperty("user.home"), ".yourapp");
    

The alternative would be to use ServletContext.getResource() which returns a URI. This URI may be a file: URL, but there s no guarantee for that.

You don t need it to be a file:... URL. You just need it to be a URL that your JVM can read--and it will be.





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签