2013-03-02 12 views
0

首先我想感謝大家對我最近幾個問題的幫助。我已經搜索並盡力找出最新的問題,但即使在此處搜索,我也沒有運氣。我試圖檢查「heapFile.csv」是否存在,如果不存在,則創建該文件,然後向其中寫入一個字符串。如果它確實,那麼我只是想爲它添加一個字符串。我認爲我所擁有的將會這樣做,但我一直在收到一個IOException,它說文件系統是隻讀的。我確實已將manifest文件更改爲包含訪問sdcard,甚至還使用android來製作虛擬SD卡,以防出現問題。將字符串寫入或追加到文件。獲取只讀文件系統錯誤

首先,這裏的主要活動的Java ...

package com.loch.meaptracker; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import android.os.Bundle; 
import android.os.Environment; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.DatePicker; 
import android.widget.EditText; 
import android.widget.SeekBar; 
import android.widget.SeekBar.OnSeekBarChangeListener; 
import android.widget.TimePicker; 

public class MainActivity extends Activity implements OnSeekBarChangeListener { 

private SeekBar happyBar, energyBar, anxietyBar, painBar; 
private EditText noteField; 
private DatePicker dPick; 
private TimePicker tPick; 
@SuppressWarnings("unused") 
private Button enterButton; 
private int happyValue = 4, energyValue = 4, anxietyValue = 4, 
     painValue = 4; 
private static final String TAG = "heapApp"; 
private String Mood = "Blah"; 
final Context context = this; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    try { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // bars 
     happyBar = (SeekBar) findViewById(R.id.happinessBarID); 
     happyBar.setOnSeekBarChangeListener(this); 
     energyBar = (SeekBar) findViewById(R.id.energyBarID); 
     energyBar.setOnSeekBarChangeListener(this); 
     anxietyBar = (SeekBar) findViewById(R.id.anxietyBarID); 
     anxietyBar.setOnSeekBarChangeListener(this); 
     painBar = (SeekBar) findViewById(R.id.painBarID); 
     painBar.setOnSeekBarChangeListener(this); 
     // end bars 
     dPick = (DatePicker) findViewById(R.id.datePicker1); 
     tPick = (TimePicker) findViewById(R.id.timePicker1); 
     noteField = (EditText) findViewById(R.id.noteTextFieldID); 
     enterButton = (Button) findViewById(R.id.enterButtonID); 
    } catch (Exception onCreateException) { 
     Log.e(TAG, "Exception received", onCreateException); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

// Bar listener methods 
@Override 
public void onProgressChanged(SeekBar arg0, int barValue, boolean hFromUser) { 
    try { 

     switch (arg0.getId()) { 
     case R.id.happinessBarID: 
      happyValue = barValue + 1; 
      break; 
     case R.id.energyBarID: 
      energyValue = barValue + 1; 
      break; 
     case R.id.anxietyBarID: 
      anxietyValue = barValue + 1; 
      break; 
     case R.id.painBarID: 
      painValue = barValue + 1; 
      break; 
     } 
     String debugBarValue = "Happy is " + happyValue + ", Energy is " 
       + energyValue + ", Anxiety is " + anxietyValue 
       + ", Pain is " + painValue + "."; 
     System.out.println(debugBarValue); 

    } catch (Exception BarValueException) { 
     Log.e(TAG, "Exception received", BarValueException); 
    } 

} 

@Override 
public void onStartTrackingTouch(SeekBar happyBar) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStopTrackingTouch(SeekBar happyBar) { 
    // TODO Auto-generated method stub 

} 

// end Bar listener methods 

// Enter Button listener Method 

public void dialogPop(View v) { 
    try { 
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
       context); 

     // set Title 
     alertDialogBuilder.setTitle("title"); 

     // set dialog message 
     alertDialogBuilder.setMessage("You entered: " + getMood()) 
       .setCancelable(false).setPositiveButton("Okay", 
       // When Okay button clicked the write mood string to file 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 
           try { 
            // This is the string that should be 
            // written to file 
            String data = getMood(); 
            // This is the file that should be 
            // written to 
            File heapFile = new File(Environment.getExternalStorageDirectory(), "/heapFile.csv"); 

            // if file doesn't exists, then create 
            // it 
            if (!heapFile.exists()) { 
             heapFile.createNewFile(); 
            } 

            // true = append file 
            FileWriter heapFileWritter = new FileWriter(
              heapFile.getName(), true); 
            BufferedWriter heapBufferWritter = new BufferedWriter(
              heapFileWritter); 
            heapBufferWritter.write(data); 
            heapBufferWritter.close(); 

            System.out.println("Done"); 

           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } 

         }) 
       // If they press either the cancel button or the back button 
       // on their device (Same thing) then close the dialog and 
       // give the user a chance to change what they've entered 
       .setNegativeButton("Cancel", 
         new DialogInterface.OnClickListener() { 

          @Override 
          public void onClick(DialogInterface dialog, 
            int id) { 
           // TODO Auto-generated method stub 
           dialog.cancel(); 
          } 
         }); 

     // create alert dialog 
     AlertDialog alertDialog = alertDialogBuilder.create(); 

     // show it 
     alertDialog.show(); 
    } catch (Exception buttonListenerException) { 
     Log.e(TAG, "Exception received", buttonListenerException); 
    } 
    return; 
} 

public String getMood() { 
    try { 
     int month = dPick.getMonth(); 
     int day = dPick.getDayOfMonth(); 
     int year = dPick.getYear(); 
     int minute = tPick.getCurrentMinute(); 
     String moodAntePost = "AM"; 
     boolean hourType = tPick.is24HourView(); 
     int moodHour = tPick.getCurrentHour(); 
     if (hourType == false && moodHour > 12) { 
      moodHour = (moodHour - 12); 
      moodAntePost = "PM"; 
     } else if (hourType == false && moodHour <= 0) { 
      moodHour = 12; 
     } else { 
     } 
     String noteText = noteField.getText().toString(); 
     Mood = "Happiness," + happyValue + ",Energy," + energyValue 
       + ",Anxiety," + anxietyValue + ",Pain," + painValue 
       + ",Date," + month + "/" + day + "/" + year + ",Time," 
       + moodHour + ":" + minute + "," + moodAntePost + ",Note," 
       + noteText; 
     System.out.println(Mood); 
    } catch (Exception getMoodException) { 
     Log.e(TAG, "Exception received", getMoodException); 
    } 

    return Mood; 
} 

} 

而且清單...

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.loch.meaptracker" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.loch.meaptracker.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

回答

1

我認爲問題是在這一行:

FileWriter heapFileWritter = new FileWriter(
              heapFile.getName(), true); 

代替試試這個:

FileWriter heapFileWritter = new FileWriter(
               heapFile, true); 

解釋:

heapFile.getName()是指你的文件名,所以可以說heapFile.txt。 所以當你問FileWriter寫入這個文件。它不知道你指的是哪個文件。所以它嘗試創建該文件。可是等等!它將在那裏創建文件,因爲它只有文件名,而不是完整的路徑。

因此,即使我確信它會在創建文件的位置,我的猜測是根(我不確定)。這是隻讀的,因此是錯誤。

public FileWriter(String fileName, 
      boolean append) 
      throws IOException 

IOException - 如果指定文件存在,但它是一個目錄,而不是 常規文件,不存在,但不能被創建,或無法 打開任何其他原因

+0

我意圖是File HeapFile = new File(Environment.getExternalStorageDirectory(),「/heapFile.csv」);會告訴它在哪裏創建文件,在這種情況下,無論外部存儲在任何設備上。我看到你對getname部分可能是正確的。我甚至不知道爲什麼那裏。我會試試看看它是否有效。非常感謝! – fauxfire76 2013-03-02 23:46:43

+0

剛試過,它的工作!當然,現在我意識到我還需要做更多的事情,例如在文件保存後關閉應用程序,並使文件的路徑變得更好,更容易找到,但除此之外我已經完成了!好極了!!!謝謝!!! – fauxfire76 2013-03-03 00:10:47

+0

另外,如果我有足夠的聲譽,我會完全投票。 > _ < – fauxfire76 2013-03-03 00:11:24

相關問題