有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

SpringMVCJava。木卫一。尽管文件存在,但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());
    }

但是当我运行我的应用程序时,它是一个SpringMVC应用程序,然后ip2c找不到该文件。以下是ip2c如何尝试寻找它

m_input = new MemoryMappedRandoeAccessFile(file, "r");

其中file只是bin文件的名称,即ip到国家/地区。箱子我完全卡住了,不知道出了什么问题


共 (4) 个答案

  1. # 1 楼答案

    File类只是用于处理抽象文件名的包装器。此代码

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

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

  2. # 2 楼答案

    SpringMVC应用程序可能运行在某个服务器上,与类中的主函数相反

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

  3. # 3 楼答案

    显然,您正试图使用相对路径名访问该文件。执行此操作时,Java运行时系统将尝试查找与应用程序的当前目录相关的文件。最有可能的原因是当前目录在两种情况下是不同的

    尝试改用绝对路径名

  4. # 4 楼答案

    在“服务器找不到文件,但它在那里!”问题,这将解决它(对我来说总是有):

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

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