2013-08-16 3 views
0

나는 5 개의 EditText 입력을 기록하고 파일에 저장하는 안드로이드 앱을 만들고 있습니다. 내가 알아야 할 것은 개별적으로 각 파일을 가져 와서 결과를 다른 EditText 필드에 출력하는 방법입니다.파일에서 특정 문자열을 검색하는 방법은 무엇입니까? (안드로이드)

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 레이아웃 :이 그런 경우

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

을 가진 파일을 생성합니다

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

당신은이 파일을 읽었습니다. 한 번에 한 줄씩 읽으십시오. 줄을 '='(또는 사용하기로 결정한 구분자)으로 나눕니다. 구분 기호 왼쪽에있는 텍스트가 찾고있는 키와 같으면 구분 기호 오른쪽의 텍스트는 잡아야하는 텍스트입니다.

필자가 개인적으로이 방법으로 파일을 작성한다면 FileOutputStream 대신 PrintWriter을 사용하게 될 것입니다. 코드를 조금 더 깨끗하게 만들 수 있기 때문입니다. 그것은

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들이 꽤 많이 사용할 수있는 모든 정보를 얻을 수 있도록하기 위해 것 똑같은 일을하지만, 어떤 것은 다른 것을 우선합니다. 어느 것이 이제까지 잘 작동하고 당신에게 이해되는 사용.당신이 모두 익숙하지 않은 경우 여기 StringTokenizer 새 코드에 실망 것 같습니다 2 Android Split string

추가 편집를 사용하는 방법을 보여줍니다 좋은 게시물입니다. 자바 독에서 http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

"StringTokenizer는 사용이 새로운 코드에 실망하고 있지만 호환성을 위해 유지됩니다 레거시 클래스입니다.이 기능을 추구하는 사람이 Stringsplit 방법 또는 대신 java.util.regex 패키지를 사용하는 것이 좋습니다"

+0

어떻게 코드합니까? 그럼이 파일을 읽을 때. 한 번에 한 줄씩 읽으십시오. 줄을 '='(또는 사용하기로 결정한 구분자)으로 나눕니다. 구분 기호 왼쪽에있는 텍스트가 찾고있는 키와 같으면 구분 기호 오른쪽의 텍스트는 잡아야하는 텍스트입니다. 이 부분을 어떻게 코딩합니까? –

+0

파일에 쓰는 방법을 알고 있습니다. 필자가 알아야 할 것은 특정 입력을 읽는 방법입니다. –

+0

@ChuckBarnett 지연되어서 죄송합니다. 한 번에 한 줄씩 읽으면서'= '로 분리 할 수있는 새로운 코드를 게시했습니다 (일관성있는 한 이것을 구분 기호로 변경할 수 있습니다). 내 권고안은 일관성을 보장하기 위해 클래스에서 'private final String DELIMITER'를 사용하는 것입니다 (구분 기호를 변경하려는 경우 쉽게 유지 보수 할 수있는 코드와 함께). –

관련 문제