我正在尝试使用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。我完全陷入困境,不知道这个问题是什么。
答案 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()
方法检查文件是否存在。当您尝试使用相对路径访问文件时,请确保它位于正在运行的应用程序的当前目录中。可能它与项目根目录不同。