【问题标题】:read/copy file inside dynamic web project in java在java中的动态Web项目中读取/复制文件
【发布时间】:2014-10-23 12:50:29
【问题描述】:

我使用 JSP/Servlet 和 Eclipse 创建了一个动态 Web 应用程序项目。我想在同一个地方创建一个“db.xls”文件的副本。

我尝试创建“db.xls”的副本,该副本将命名为 out.xls,但不会。这些文件应位于同一文件夹“文件”内。我的代码编译,db.xls 被正确读取,但文件 out.xls 没有创建。

我的方法有什么问题?请帮忙!

public void readExcel()
    {
        try{

            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            URL url1 = classLoader.getResource("");

            // read db.xls
            wbook = Workbook.getWorkbook(new File(url1.getPath()+"/db.xls"));

            // create a copy of db.xls nammed out.xls
            wwbCopy = Workbook.createWorkbook(new File(url1.getPath()+"/out.xls"), wbook);
            shSheet = wwbCopy.getSheet(0);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

我在 WEB-INF 中移动文件“db.xls”并使用 getServletContext().getRealPath("/WEB-INF"),但仍未创建输出文件“out.xls”。

public void readExcel()
    {
        try{

//          ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//          URL url1 = classLoader.getResource("");

            String tomcatRoot = getServletContext().getRealPath("/WEB-INF");

            wbook = Workbook.getWorkbook(new File(tomcatRoot+"/db.xls"));
            wwbCopy = Workbook.createWorkbook(new File(tomcatRoot+"/out.xls"), wbook);
            shSheet = wwbCopy.getSheet(0);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    System.out你的文件,你会发现有什么问题

    System.out.println(new File(tomcatRoot+"/db.xls").getAbsolutePath());
    System.out.println(new File(tomcatRoot+"/out.xls").getAbsolutePath());
    

    您希望该文件是您的项目目录,但它不是从该位置读/写到该位置,因为您已在 Eclipse 中将 files forlder 设置为 source 文件夹,因此它是我们的一部分在你可以从资源中读取的类路径中,即使用类加载器和 getResource / getResourceAsStream 但你不能也不应该写入它,因为几个原因,最明显的是你的网络应用程序可能没有被解包来自战争文件。

    事实上,您不知道从哪里读取/写入文件。

    您可以将您的文件与 war 文件打包并从中读取,这是正确的。但是对于编写最好的方法是在文件系统上有一个明确的位置,您可以在其中编写输出文件。检查此answer 以了解如何使用上下文初始化参数来邻接它

    【讨论】:

    • 我使用 System.out 进行验证,路径似乎是正确的:C:\serverurs\apache-tomcat-7.0.47\wtpwebapps\h2test\WEB-INF\db.xls C:\serverurs \apache-tomcat-7.0.47\wtpwebapps\h2test\WEB-INF\out.xls.谢谢你的回答!
    • C:\serverurs\apache-tomcat-7.0.47\wtpwebapps\h2test\WEB-INF\db.xls C:\serverurs\apache-tomcat-7.0.47\wtpwebapps\h2test\WEB -INF\out.xls。它可以工作,并且“out.xls”是在我的机器上本地创建的。我真正想做的是使用像数据库这样的文件。例如,如果我创建一个新用户,新用户将被添加到一个文件中。如果我关闭应用程序并重新打开它,应用程序会识别用户,因为他已经添加到文件“db.xls”中。请问我该怎么做?
    • @cozla,为了简单起见,我想这是出于学习目的,只需将其保存在一个文件中,但请考虑我建议的有关使用目录的内容,因为您不能依赖该功能写信给getServletContext().getRealPath("/WEB-INF")。并且只需使用csv 而不是xls,它更容易处理,并且有很多 csv 阅读器也很容易使用。
    【解决方案2】:

    检查 WEB-INF/classes 文件夹,它可能在里面

    【讨论】:

    • 谢谢,但没有。
    【解决方案3】:

    我认为您缺少 write 和 close 语句。 试试:

        wwbCopy.write();
        wwbCopy.close();
    

    【讨论】:

    • 谢谢我已经有了这些调用,但是在另一个名为 closeFile() 的方法中
    【解决方案4】:

    为了在 Web 应用程序中读取文件,文件需要存储在 WEB-INF 文件夹下的某个位置,否则它们将不会作为应用程序的一部分进行部署。

    将文件夹移到那里后,您可以在 servlet 中使用以下方法:

      String tomcatRoot = getServletContext().getRealPath("/");
    

    这将为您提供 Web 应用程序的根目录。然后你必须从那里构建路径(包括WEB-INF 文件夹):

      String sourceFile = tomcatRoot + "/WEB-INF/folder/source.file"
      String targetFile = tomcatRoot + "/WEB-INF/folder/target.file"
    

    编辑:我最初说getRealPath() 会给你WEB-INF 位置。它没有,它提供了父文件夹。

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 2012-05-15
      • 2012-08-17
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      相关资源
      最近更新 更多