2013-08-16 80 views
0

我正在創建一個android應用程序,它記錄五個EditText輸入並將它們存儲在一個文件中。我需要知道的是如何單獨檢索每個文件並將結果輸出到另一個EditText字段。如何從文件中檢索特定的字符串? (android)

MyExampleCode:

package chuck.com; 

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.app.Activity; 
import android.content.Intent; 

public class FillFile extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fill_file); 





    Button submit = (Button) findViewById(R.id.button1); 
    submit.setOnClickListener(sub); 
    Button disp = (Button) findViewById(R.id.button2); 
    disp.setOnClickListener(dis); 
} 
private OnClickListener sub = new OnClickListener(){ 
    public void onClick(View v){ 

     try { 
      EditText one = (EditText) findViewById(R.id.editText1); 
      EditText two = (EditText) findViewById(R.id.editText2); 
      EditText three = (EditText) findViewById(R.id.editText3); 
      EditText four = (EditText) findViewById(R.id.editText4); 
      EditText five = (EditText) findViewById(R.id.editText5); 

      FileOutputStream fos; 
      fos = openFileOutput("XML.txt", MODE_APPEND); 

      String uno = one.getText().toString(); 
      String dos = two.getText().toString(); 
      String tres = three.getText().toString(); 
      String quatro = four.getText().toString(); 
      String cinco = five.getText().toString(); 

      fos.write(uno.getBytes()); 
      fos.write(dos.getBytes()); 
      fos.write(tres.getBytes()); 
      fos.write(quatro.getBytes()); 
      fos.write(cinco.getBytes()); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}; 
private OnClickListener dis = new OnClickListener(){ 
    public void onClick(View v){ 
     Intent transf = new Intent(v.getContext(), MainActivity.class); 
     startActivityForResult(transf, 0); 
    } 
}; 
} 

的XML佈局,我想將文件導出到:

package chuck.com; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    File fileDir = getFilesDir(); 
    String fileName = ("XML.txt"); 
    File backup = new File(fileDir, fileName); 
    boolean content = backup.length() == 0; 

    try { 
     backup.createNewFile(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    TextView one = (TextView) findViewById(R.id.textView1); 
    TextView two = (TextView) findViewById(R.id.textView2); 
    TextView three = (TextView) findViewById(R.id.textView3); 
    TextView four = (TextView) findViewById(R.id.textView4); 
    TextView five = (TextView) findViewById(R.id.textView5); 

    EditText eOne = (EditText) findViewById(R.id.editText1); 
    EditText eTwo = (EditText) findViewById(R.id.editText2); 
    EditText eThree = (EditText) findViewById(R.id.editText3); 
    EditText eFour = (EditText) findViewById(R.id.editText4); 

    Button input = (Button) findViewById(R.id.input_button); 
    input.setOnClickListener(insert); 
    if (content) 
    { 
     one.setVisibility(View.GONE); 
     two.setVisibility(View.GONE); 
     three.setVisibility(View.GONE); 
     four.setVisibility(View.GONE); 

     eOne.setVisibility(View.GONE); 
     eTwo.setVisibility(View.GONE); 
     eThree.setVisibility(View.GONE); 
     eFour.setVisibility(View.GONE); 
    } 
    else 
    { 
     five.setVisibility(View.GONE); 

     FileInputStream fis; 
     fis = openFileInput("XML.txt"); 

     eOne.setText(uno); 
     eTwo.setText(dos); 
     eThree.setText(tres); 
     eFour.setText(quatro, cinco); 
    } 
    } 
    private OnClickListener insert = new OnClickListener(){ 
    public void onClick(View v) { 
     Intent trans = new Intent(v.getContext(), FillFile.class); 
     startActivityForResult(trans, 0); 
    } 
}; 
    } 
+3

當你開始爲變量名使用數字時,你應該考慮使用一個數組或'List'。這些工具以及適當的循環將使您的代碼更短,更容易閱讀。 –

+0

由於您正在使用'FileOutputStream'來寫入文件,因此嘗試使用'FileInputStream'來讀取文件是有意義的。 –

回答

2
fos.write("uno=".getBytes()); 
fos.write(uno.getBytes()); 
fos.write("\n".getBytes()); 
fos.write("dos=".getBytes()); 
fos.write(dos.getBytes()); 
... 

這將產生具有

uno=<editText1 text> 
dos=<editText2 text> 
... 

然後,當一個文件你讀這個文件。一次只讀一行。在'='分隔線(或者您決定使用的分隔符)。如果分隔符左側的文本等於您正在查找的鍵,則您知道分隔符右側的文本是您需要抓取的文本。

就個人而言,如果我要這樣寫一個文件,我只會使用PrintWriter而不是FileOutputStream,這是因爲它會使代碼變得更簡潔。它看起來像

PrintWriter pw = new PrintWriter(fos); 
pw.println("uno=" + uno); 
pw.println("dos=" + dos); 
... 

編輯

這樣做是一行一行讀(由由OP請求的代碼)。它將每一行分成'='。然後比較分割字符串的第0個位置(這將是'='左側的)與你的鍵。如果它等於你想要的鍵,那麼分割字符串的第一個位置就是你想要抓取的實際文本。

BufferedReader br = new BufferedReader(new FileReader("file.txt")); 

String line; 
whlie((line = br.readLine()) != null){ 
    String[] separated = line.split("="); 
    if("uno".equals(separated[0])) 
     // Key is uno seaparated[1] has <editText1 text> (assuming example above) 
    if("dos".equals(separated[0])) 
     // Key is dos separated[1] has <editText2 text> (assuming example above) 
    ... 
} 

注意你或許應該增加更多的錯誤檢查 - 我排除它的簡單性。

就像一個例子 - 你可以想象的情況下,用戶輸入的東西編輯文本中的'='(比如用戶輸入editText1「1 + 1 = 2」)。在這種情況下,separated將有3個部分。

0您的鍵(在該示例UNO)

1用戶輸入到所述用戶輸入 '='(在 '1 + 1' 的例子)

2的左側的第一部分第二部分用戶在用戶輸入'='的右側輸入(示例中爲'2')。

一個簡單的解決方案,這個就簡單地遍歷分離的字符串的其餘部分,以確保您得到的所有信息

if("uno".equals(separated[0])){ 
    String info = ""; 
    for(int i=1; i<separated.length; i++){ 
     info += separated[i]; 
     if((i+1) < separated.length){ 
     info += "="; // This replaces the user input '=' that you split out 
     } 
    } 
    // After this loop info has the exact String the user entered even if it contained your delimiter ('=' in this example) 
} 

另注而不是使用.split()的你也可以使用StringTokenizer他們幾乎做同樣的事情,但有些人比另一人更喜歡。使用哪種方法最好,對你有意義。如果你不熟悉的都在這裏是一個很好的職位,顯示了使用2 Android Split string

其他編輯看來,StringTokenizer在新代碼望而卻步。從的Javadoc http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

StringTokenizer是保留兼容性的原因,雖然它的使用是在新代碼氣餒的遺留類,它建議任何尋求此功能使用的Stringsplit方法或java.util.regex軟件包,而不是」

+0

我將如何編碼?然後當你讀這個文件。一次只讀一行。在'='分隔線(或者您決定使用的分隔符)。如果分隔符左側的文本等於您正在查找的鍵,則您知道分隔符右側的文本是您需要抓取的文本。我如何編碼這部分? –

+0

我知道如何寫入文件。我需要知道的是如何從中讀取特定的輸入。 –

+0

@ChuckBarnett對不起,延遲。我已經發布了新代碼,您可以一次讀取一行代碼,在'='上分割(只要您保持一致,您可以將其更改爲任何分隔符)。我的建議是在你的班級中使用私人最終的字符串DELIMITER來確保一致性(如果你決定改變你的分隔符,也可以很容易地維護代碼)。 –

相關問題