求问:哪里出错??已经取得写入权限了。代码如下:
package com.beak.android.diarybook;import java.text.SimpleDateFormat;
import java.util.Date;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import com.beak.android.diarybook.output.FileUtils;public class DiaryBookActivity extends Activity {
EditText titleText = null;
EditText contentText = null;
TextView titleDate = null;
FileUtils fu = new FileUtils();
SimpleDateFormat YMD = new SimpleDateFormat("yyyy-MM-dd EEE");
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
titleText = (EditText)findViewById(R.id.title);
contentText = (EditText)findViewById(R.id.content);
titleDate = (TextView)findViewById(R.id.titleDate);
contentText.setLines(25);
contentText.setTextSize(15);
titleText.setText(R.string.secondtitle);
titleText.setTextSize(1, 15);
titleDate.setText(YMD.format(new Date()));
} public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, 1, R.string.write);
menu.add(0, 2, 2, R.string.save);
menu.add(0, 3, 3, R.string.open);
menu.add(0, 4, 4, R.string.self);
menu.add(0, 5, 5, R.string.exit);
return super.onCreateOptionsMenu(menu);
} public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1: Toast.makeText(DiaryBookActivity.this, R.string.writetoast, Toast.LENGTH_LONG).show();break;
case 2: fu.write2SDcard(fu.getSDPATH(), titleDate.getText().toString(), contentText.getText().toString());
System.out.println("saved????");
Toast.makeText(DiaryBookActivity.this, R.string.savetoase, Toast.LENGTH_SHORT).show();break;
case 3: Toast.makeText(DiaryBookActivity.this, R.string.opentoast, Toast.LENGTH_SHORT).show();break;
case 4: System.out.println("self-control");Log.d("debug", "see it?");break;
case 5: finish();
}
return super.onOptionsItemSelected(item);
}
}通过输出System.out.println("saved???");发现,那句话应该执行了,但是在存储卡位置就是没有文件,应该是那句话有问题。这个是我改造别人写的类:
package com.beak.android.diarybook.output;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import android.os.Environment;public class FileUtils { private String SDPATH; public String getSDPATH() { return SDPATH; } public FileUtils() { SDPATH = Environment.getExternalStorageDirectory() + "/"; } public File creatSDFile(String fileName) throws IOException { File file = new File(SDPATH + fileName); file.createNewFile(); return file; } public File creatSDDir(String dirName) { File dir = new File(SDPATH + dirName); dir.mkdirs(); return dir; } public boolean isFileExist(String fileName){ File file = new File(SDPATH + fileName); return file.exists(); } public File write2SDcard(String path,String fileName,String content){ File file = null; OutputStream output = null; try{ creatSDDir(path); file = creatSDFile(path + fileName); output = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(output); osw.append(content); osw.flush(); osw.close(); } catch(Exception e){ e.printStackTrace(); } finally{ try{ output.close(); } catch(Exception e){ e.printStackTrace(); } } return file; }}
package com.beak.android.diarybook;import java.text.SimpleDateFormat;
import java.util.Date;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import com.beak.android.diarybook.output.FileUtils;public class DiaryBookActivity extends Activity {
EditText titleText = null;
EditText contentText = null;
TextView titleDate = null;
FileUtils fu = new FileUtils();
SimpleDateFormat YMD = new SimpleDateFormat("yyyy-MM-dd EEE");
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
titleText = (EditText)findViewById(R.id.title);
contentText = (EditText)findViewById(R.id.content);
titleDate = (TextView)findViewById(R.id.titleDate);
contentText.setLines(25);
contentText.setTextSize(15);
titleText.setText(R.string.secondtitle);
titleText.setTextSize(1, 15);
titleDate.setText(YMD.format(new Date()));
} public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, 1, R.string.write);
menu.add(0, 2, 2, R.string.save);
menu.add(0, 3, 3, R.string.open);
menu.add(0, 4, 4, R.string.self);
menu.add(0, 5, 5, R.string.exit);
return super.onCreateOptionsMenu(menu);
} public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1: Toast.makeText(DiaryBookActivity.this, R.string.writetoast, Toast.LENGTH_LONG).show();break;
case 2: fu.write2SDcard(fu.getSDPATH(), titleDate.getText().toString(), contentText.getText().toString());
System.out.println("saved????");
Toast.makeText(DiaryBookActivity.this, R.string.savetoase, Toast.LENGTH_SHORT).show();break;
case 3: Toast.makeText(DiaryBookActivity.this, R.string.opentoast, Toast.LENGTH_SHORT).show();break;
case 4: System.out.println("self-control");Log.d("debug", "see it?");break;
case 5: finish();
}
return super.onOptionsItemSelected(item);
}
}通过输出System.out.println("saved???");发现,那句话应该执行了,但是在存储卡位置就是没有文件,应该是那句话有问题。这个是我改造别人写的类:
package com.beak.android.diarybook.output;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import android.os.Environment;public class FileUtils { private String SDPATH; public String getSDPATH() { return SDPATH; } public FileUtils() { SDPATH = Environment.getExternalStorageDirectory() + "/"; } public File creatSDFile(String fileName) throws IOException { File file = new File(SDPATH + fileName); file.createNewFile(); return file; } public File creatSDDir(String dirName) { File dir = new File(SDPATH + dirName); dir.mkdirs(); return dir; } public boolean isFileExist(String fileName){ File file = new File(SDPATH + fileName); return file.exists(); } public File write2SDcard(String path,String fileName,String content){ File file = null; OutputStream output = null; try{ creatSDDir(path); file = creatSDFile(path + fileName); output = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(output); osw.append(content); osw.flush(); osw.close(); } catch(Exception e){ e.printStackTrace(); } finally{ try{ output.close(); } catch(Exception e){ e.printStackTrace(); } } return file; }}
1. fu.write2SDcard(fu.getSDPATH(), titleDate.getText().toString(), contentText.getText().toString());
观察到内部实现方式,你应该会创建这样一个目录:/mnt/sdcard//mnt/sdcard。因为你拿到SD卡的路径,同时以此为相对路径,作为 creatSDDir() 方法的参数。同时可能有“两根斜线”的问题
2. creatSDFile 实现方式最好为:
public File creatSDFile (String filename) { File dir = new File(SDPATH); return new File(dir, filename); }
3. 最后记得将output 关闭:
output.close();
4. SD卡上创建文件的权限是否已申请才疏学浅,找不到明显错误。但是我相信,尽量将代码规范化,可以避免大部分的错误。