2012-03-01 26 views
0

ip2cを使用して、ユーザーのIPに基づいて国コードを取得しようとしています。今問題は、それが検索しなければならないバイナリファイルを見つけることができないということです。これは、次のecxepionファイルが存在するにもかかわらずjava.io.FileNotFoundException

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-fileの名前、つまりip-to-country.binです。私は完全に立ち往生していて、何が問題なのか分かりません。

+0

あなたのアプリをデバッグしようとしましたか? – davidfrancis

答えて

0

という相対番号パス名を使用してファイルにアクセスしようとしています。これを行うと、Javaランタイムシステムは、アプリケーションのカレントディレクトリに関連するファイルを検索しようとします。 1つのシナリオで動作する可能性が最も高い理由は、現在のディレクトリが2つのシナリオで異なることです。

代わりに絶対パス名を使用してください。

+0

私は使用している瓶のコードを変更できません。このバイナリファイルが必要なので、どこかで私のプロジェクトのどこかに置かなければなりません。どこにいてもわかりません: – khizar

+0

シンプルです。短期的な修正は、現在のディレクトリを調べてそこにファイルを置くことです。長期的な修正は、このJARのソースコードを取得し、それを変更してハードワイヤードパス名を取り除くことです。 (あなたができないのであれば、より良いベンダーを探してください。ハードワイヤードのパス名は品質の悪い製品の明確な兆候です。) –

+0

ok thanx、私はこれに関与していないソリューションを得ることを望んでいました。これは唯一の解決策ですので、私はこの答えを受け入れるでしょう:) – khizar

1

おそらく、Spring MVCアプリケーションは、クラス内のmain-functionとは逆のサーバーです。

ルートパスが異なる場合があります。このファイルはWEB-INFフォルダの横に置いてください。 warフォルダーに配置する必要があります。 (あなたが良いテンプレートから始まった場合)

5

「サーバはファイルを見つけることができませんが、そこにあります!問題は、これは(いつも私のために持っている)、それを解決します:

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

あなたは、サーバーが見ているディレクトリは、あなたはそれが思ったものではないことをすぐに発見するでしょう。通常、ホームディレクトリはあなたが思うものではないからです。

+0

thanx多くの仲間が、その奇妙なその日食のディレクトリ 'C:\開発\ eclipse \ ip - to - country.bin'で探している。そのWebプロジェクトを考えると、私はWebContentフォルダなどを見ていると思っていました。 jarファイルが絶対パスを提供するために使用しているコードを変更できないので、ホームディレクトリを変更してファイルを見つける方法がありますか? – khizar

0

Fileクラスは、抽象ファイル名を操作するためのラッパーです。このコード

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

このファイルは存在し、正常に実行されます。ファイルの存在を確認するにはFile.exists()メソッドを使用してください。相対パスでファイルにアクセスしようとすると、実行中のアプリケーションのカレントディレクトリにあることを確認してください。おそらくプロジェクトルートと同じフォルダではないでしょう。

+0

私はそれを試してみました、私はそれが私がそれだと思うフォルダー内の参照する標準的なパスを試しました。 – khizar

関連する問題