java.io.FileNotFoundException, хотя файл присутствует - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь использовать ip2c для получения кодов стран, основанных на IP-адресе пользователя. Теперь проблема в том, что он не может найти двоичный файл, который должен искать. Бросает следующий экшепион

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)

Файл находится в базовой папке проекта, и если я выполняю основную функцию и создаю дескриптор файла, он правильно находит файл и все хорошо.

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

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

Но когда я запускаю свое приложение, которое является весенним приложением MVC, а затем ip2c не может найти файл. Вот как ip2c пытается его найти.

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

где file - это просто имя файла bin, т.е. ip-to-country.bin. Я полностью застрял и понятия не имею, в чем проблема.

Ответы [ 4 ]

5 голосов
/ 01 марта 2012

В случае «сервер не может найти файл, но он есть!» проблемы, это решит это (всегда для меня):

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

Вы быстро обнаружите, что каталог, в котором находится сервер, не тот, о котором вы думали. Обычно потому, что домашний каталог - это не то, что вы думаете.

1 голос
/ 01 марта 2012

Приложение Spring MVC, вероятно, работает на каком-то сервере - наоборот, с main-функцией в классе.

Ваш корневой путь будет другим.Вы должны поместить этот файл прямо рядом с папкой WEB-INF.Должен находиться в папке war.(Если вы начали с какого-то хорошего шаблона)

0 голосов
/ 01 марта 2012

Класс File является просто оболочкой для манипулирования абстрактными именами файлов. Этот код

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

не требует, чтобы файл существовал и выполнялся нормально. Используйте метод File.exists(), чтобы проверить наличие файла. Когда вы пытаетесь получить доступ к файлу с относительным путем, убедитесь, что он находится в текущем каталоге запущенного приложения. Вероятно, это не та же папка, что и у корня проекта.

0 голосов
/ 01 марта 2012

Вы явно пытаетесь получить доступ к файлу, используя относительный путь. Когда вы сделаете это, система времени выполнения Java попытается найти файл относительно текущего каталога приложения . И наиболее вероятная причина, по которой он работает в одном сценарии, а не в другом, заключается в том, что текущий каталог отличается в двух сценариях.

Попробуйте вместо этого использовать абсолютный путь.

...