2016-06-28 2 views
-1

자력 센서의 값을 표시하고 이러한 데이터를 파일에 저장하는 응용 프로그램의 코드를 작성하려고합니다. 다음 코드를 작성했지만 문제는 내 파일에서 마지막 값을 포함하는 한 줄만 찾습니다.android studio를 사용하여 파일에 데이터를 쓰는 방법

FloatingActionButton fab; 
     fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener( new View.OnClickListener(){ 
      @Override 
      public void onClick(View view){ 
     final Thread t = new Thread() { 
      File openfilename= new File(Environment.getExternalStorageDirectory(),"myfile.txt"); 
      FileOutputStream f; 
      @Override 
      public void run() { 
       try { 
        while (!isInterrupted()) { 
         Thread.sleep(500); 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           TextView tv; 
           tv=(TextView)findViewById(R.id.tv); 

           tv.setText(" x="+Float.toString(xx)+" y="+Float.toString(yy)+" z="+Float.toString((zz))+"  Puissance="+Float.toString(magneticStrenght)); 

           try { 
            FileOutputStream f =new FileOutputStream(openfilename); 

            PrintWriter pw=new PrintWriter(f); 
            pw.append("\n x="+Float.toString(xx)+" y="+Float.toString(yy)+" z="+Float.toString((zz))+"  Puissance="+Float.toString(magneticStrenght)); 
            //close the file 
            pw.flush(); 
            pw.close(); 
            f.close(); 

           } catch (java.io.IOException e) { 
            //do something if an IOException occurs. 
            Log.e("Exception", "File write failed: " + e.toString()); 
           } 
          } 
         }); 
        } 
       } catch (InterruptedException e) { 
       } 
      } 
     }; 

     t.start(); 

제 코드에 어떤 문제가 있는지보십시오.

답변

1

당신은

FileOutputStream f = new FileOutputStream(openfilename, true); 

은 자세한 내용

에 대한 this을 참조 두 번째 매개 변수로 부울 true를 전달하여, 추가 모드에서 FileOutputStream를 열어야합니다
1

here을 문서화로서 당신은 파일을 열려면이 생성자를 사용한다 추가 모드 :

FileOutputStream fStream = new FileOutputStream(fileName, true); 

FileOutputStream 객체를 만드는 동안 추가 플래그를 사용하지 않았으므로 파일을 열거 나 쓸 때마다 파일의 이전 데이터를 덮어 쓰게됩니다.

1

다른 답변에는 문제가 없지만 코드의 문제는 특정 로직 오류 및 누락에 있습니다.

개념적으로 그릇된 점이있는 것 같습니다. 어떤 시점에서 텍스트를 파일에 쓰려고합니까? 루프를 만드는 것처럼 보이고 루프 내에서 데이터가 파일에 기록되는 각 반복마다 텍스트 파일을 만듭니다.

이렇게하면 항상 문제가 발생합니다.

뒤로 물러나서 로직을 생각한 다음 파일 쓰기 코드를 별도의 기능으로 배치하십시오. 데이터를 저장하려는 경우에만 해당 함수를 호출하십시오 (예 : 텍스트 뷰를 떠날 때, 활동에 버튼을 누르거나 다른 유용한 시간).

쓰기 절차를 호출하면 데이터 수집이 끝나고 활동이 화면에 나타나기 전에해야합니다. 작성된대로 논리가 여러 파일을 작성하는 경우도 있으며 해당 파일에 항상 한 줄의 코드 만 씁니다. 특정 작업을 감안할 때 StringBuffer를 사용하여 내용을 파일로 출력하려고 할 수 있습니다. SO와 Google을 검색하면 수많은 예제가 제공됩니다.

텍스트 뷰에 데이터를 표시하는 이유가 명확하지 않아서 텍스트 뷰와 별도로 해당 데이터를 캡처하고 필요할 때만 필요한 것을 보여줄 수 있습니다.

+0

사실 나는 500ms마다 magnetomere의 값을 저장하려고합니다. 그래서 나는 루프를 가지고 있습니다. – dou

관련 문제