java.io.FileNotFoundException虽然该文件存在

时间:2012-03-01 13:17:13

标签: java spring-mvc filenotfoundexception

我正在尝试使用ip2c根据用户的IP获取国家/地区代码。现在的问题是它无法找到它必须搜索的二进制文件。它抛出以下ecxepion

java.io.FileNotFoundException: ip-to-country.bin (The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at net.firefang.ip2c.input.RandomAccessBuffer.<init>(Unknown Source)
    at net.firefang.ip2c.IP2Country.<init>(Unknown Source)
    at net.firefang.ip2c.IP2Country.<init>(Unknown Source)
    at com.em.ss.controllers.CalendarController.postReminder(CalendarController.java:96)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:427)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:415)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:788)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:717)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.em.ss.filter.GzipFilter.doFilter(GzipFilter.java:86)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

该文件位于项目的基本文件夹中,如果我创建一个main函数并创建一个文件描述符,它会正确找到该文件,一切都很好。

public static void main(String[] args) throws IOException
    {

        File file=new File("ip-to-country.bin");
        System.out.println(file.getCanonicalPath());
    }

但是当我运行我的应用程序时,这是一个spring mvc应用程序然后ip2c找不到该文件。以下是ip2c试图寻找它的方法。

  

m_input = new MemoryMappedRandoeAccessFile(file,“r”);

其中file只是bin文件的名称,即ip-to-country.bin。我完全陷入困境,不知道这个问题是什么。

4 个答案:

答案 0 :(得分:5)

如果“服务器找不到文件,但它就在那里!”问题,这将解决它(总是对我而言):

File file = new File("somefilename");
System.out.println(file.getAbsolutePath());    

您将很快发现服务器正在查找的目录不是您想象的那样。通常是因为主目录不是你想象的那样。

答案 1 :(得分:1)

Spring MVC应用程序可能运行的是某个服务器 - 与类中的main-function相反。

你的根路径会有所不同。您应该将此文件放在WEB-INF文件夹旁边。应该位于war文件夹中。 (如果你从一些好的模板开始)

答案 2 :(得分:0)

您显然正在尝试使用 relative 路径名来访问该文件。执行此操作时,Java运行时系统将尝试查找与应用程序的当前目录相关的文件。并且最可能的原因是它在一个场景中而不是另一个场景中,当前目录在两种场景中是不同的。

请尝试使用绝对路径名。

答案 3 :(得分:0)

File类只是操作抽象文件名的包装器。这段代码

File file=new File("ip-to-country.bin");
System.out.println(file.getCanonicalPath());

不要求文件存在并正常执行。使用File.exists()方法检查文件是否存在。当您尝试使用相对路径访问文件时,请确保它位于正在运行的应用程序的当前目录中。可能它与项目根目录不同。