1

AndroidでtuPrologをテストしています。私はActivity TuProlog、prologコードと対話するクラスParser、およびprologコードを含むdata.plを持っています。コンソールに出力するJavaプロジェクトとして問題なく実行できますが、Androidプロジェクトとして実行するのに問題があります。Android の場合、ファイル data.pl がプロジェクトのルート、src 内、およびパッケージ内にコピーされていても、FileNotFoundException が発生します。結果を文字列としてフェッチし、結果を TextView に表示したいだけです。これが私のコードです

public class TuProlog extends Activity implements OnClickListener{

TextView tv;
Button b1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    tv = (TextView)findViewById(R.id.label);
    b1 = (Button)findViewById(R.id.button1);
    b1.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    Parser custom = new Parser();
    String result = custom.parse();
    tv.setText(result);
}   
}


public class Parser {

Prolog engine;
PrintStream orgStream   = System.out;

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream psout = new PrintStream(baos, Boolean.TRUE); // Using autoFlush
String myResult ;

public String parse()
{
    engine  = new Prolog();
    try{
        Theory t = new Theory(new FileInputStream("data.pl"));
        try{
            engine.setTheory(t);
            try{
                SolveInfo answer = engine.solve("likes(john,X).");
                try{
                    Term derivative = answer.getTerm("X");
                    return myResult;;
                }
                catch (NoSolutionException e){
                    e.printStackTrace();
                }
                catch (UnknownVarException e){
                    e.printStackTrace();
                }
            }
            catch (MalformedGoalException e){
                e.printStackTrace();
            }
        }
        catch (InvalidTheoryException e){
            e.printStackTrace();
        }
    } 
    catch (FileNotFoundException e){
        e.printStackTrace();
    }
    catch (IOException e){
        e.printStackTrace();
    }
    return null;
}
    @Override
public void onSpy(SpyEvent e) {
    // TODO Auto-generated method stub
    Log.d("TAG", "** LG'd onSpy => SpyEvent Occured ** " );
    System.out.println("** onSpy => SpyEvent Occured ** \n ");
    myResult =  e.getMsg();
}


@Override
public void onOutput(OutputEvent e) {
    // TODO Auto-generated method stub
     Log.d("TAG", "** LG'd: onOutput => OutputEvent Occured ** " );
        System.out.println("** onOutput => OutputEvent Occured ** \n ");
        myResult =  e.getMsg();

}


@Override
public void onWarning(WarningEvent e) {
    // TODO Auto-generated method stub
    Log.d("TAG", "** LG'd: onWarning => WarningEvent Occured ** " );
    System.out.println("** onWarning => WarningEvent Occured ** \n ");
    myResult = e.getMsg();
}
}

データ.pl

likes(john,mary).
likes(mary,wine).

これが私のlogcat出力です。System.errについてはわかりません

04-15 18:51:25.480: W/System.err(23813): java.io.FileNotFoundException: /data.pl (No such file or directory)
04-15 18:51:25.484: W/System.err(23813): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
04-15 18:51:25.484: W/System.err(23813): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
04-15 18:51:25.484: W/System.err(23813): at java.io.FileInputStream.<init>(FileInputStream.java:80)
04-15 18:51:25.484: W/System.err(23813): at java.io.FileInputStream.<init>(FileInputStream.java:132)
04-15 18:51:25.484: W/System.err(23813): at com.tuprolog.alicia.Parser.parse(Parser.java:32)
04-15 18:51:25.484: W/System.err(23813): at com.tuprolog.alicia.TuProlog.onClick(TuProlog.java:51)
04-15 18:51:25.484: W/System.err(23813): at android.view.View.performClick(View.java:2485)
04-15 18:51:25.484: W/System.err(23813): at android.view.View$PerformClick.run(View.java:9080)
04-15 18:51:25.484: W/System.err(23813): at android.os.Handler.handleCallback(Handler.java:587)
4

3 に答える 3

1
  1. Eclipse で、プロジェクトの res フォルダーにフォルダー "plFiles" を作成します。
  2. pl ファイルをこのフォルダーに移動します (例: res/plFiles/data.pl)。
  3. アクティビティを使用して、このファイルにアクセスします (a は現在のアクティビティです)。

    InputStream in = a.getResources().openRawResource(R.plFiles.data);
    
  4. 上記の行は InputStream を返します。Scanner または BufferedReader または任意のリーダー クラスを使用して、ファイルの解析または読み取りを続行できます。

ファイルにアクセスする別の方法については、こちらで説明しています... Android でリソース ファイルにアクセスする

于 2012-06-11T17:56:12.657 に答える
1

私は以前にそれを行ったことがあり、尋問のために(非常に非常にベータ的な概念実証のみの)ソースコードを投稿しました.plsは以下を参照してください.

Eclipse (Helios) プロジェクトのソース コードをダウンロードするには、versaggi.biz、Downloads Adrea、TuProlog Dev Project、Eclipse (Helios) Java Source Project、そして最後に TuProlog Android Eclipse Porject Source に移動します。これで始められるはずです。これは概念実証コードのみであり、最終バージョンがリリースされる前に完全に書き直されることに注意してください。それを考えると、私がしたことをどのように行ったかについての洞察を得るには十分に機能します。何かサポートが必要な場合は、私に直接ご連絡ください。喜んでお手伝いさせていただきます。:-)

于 2012-04-24T06:40:05.527 に答える
1

ファイル data.pl がプロジェクトのルートにコピーされているにもかかわらず、FileNotFoundException が発生します。

しかし、エラーを見てください:

java.io.FileNotFoundException: /data.pl (そのようなファイルまたはディレクトリはありません)

ファイルシステムのルートから data.pl を読み取ろうとしています!

FileInputStream(File)パスをより詳細に制御するには、コンストラクターを使用してみてください。たとえば、アプリケーションのディレクトリを取得する方法に関するこの質問を見てください。

于 2012-04-16T05:08:10.637 に答える