2012-04-15 37 views
1

我在Android中測試tuProlog。我有一個活動TuProlog類parser與prolog代碼和包含prolog代碼的data.pl進行交互。作爲一個java項目,輸出到控制檯,我可以很好地運行它,但是我作爲一個Android項目遇到了麻煩。對於Android,即使我的文件data.pl複製到項目的根目錄,src內部和我的包中,但我仍然得到FileNotFoundException。我只想將結果作爲字符串獲取並在TextView中顯示我的結果。這裏是我的代碼在Android中運行序言

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(); 
} 
} 

Data.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) 

回答

1

我以前就已經做過,並且發佈了審訊的(非常,非常非常β的概念驗證)源代碼,請參閱下文。

要下載Eclipse(Helios)項目源代碼,請轉到:versaggi.biz,下載Adrea,TuProlog開發項目,Eclipse(Helios)Java源項目,最後到TuProlog Android Eclipse Porject Source。這應該讓你開始。請記住,這只是概念代碼的證明,並且在最終版本發佈之前將被完全重寫。鑑於此,它確實可以讓你深入瞭解我是如何做到的。如果您需要任何幫助,請直接與我聯繫,我很樂意幫助您。 :-)

+0

感謝@ProfVersaggi – Yogesh 2012-04-25 01:05:58

1

I get FileNotFoundException even though my file data.pl is copied in root of project

但看看錯誤:

java.io.FileNotFoundException: /data.pl (No such file or directory)

它試圖從文件系統的根目錄中讀取data.pl

您可以嘗試使用FileInputStream(File)構造函數來更好地控制路徑。看看例如this如何獲取應用程序目錄的問題。

1
  1. 在Eclipse中,在項目中創建
  2. 的res文件夾的文件夾 「plFiles」
  3. 將您的PL文件到這個文件夾(如:RES/plFiles/data.pl)
  4. 使用活動訪問使用該文件(一個是當前活動)

    InputStream in = a.getResources().openRawResource(R.plFiles.data); 
    
  5. 上述線返回一個InputStream。您現在可以使用Scanner或BufferedReader或您喜歡的任何閱讀器類繼續解析或閱讀文件。

另一種方式來訪問這裏提到的文件... Access resource files in Android