我正在尝试创建一个用户选择一些复选框的应用,然后当他们点击提交时,会为每个选中的复选框创建一个带有句子的.txt文件。
我已成功构建了一个,并且它正确地创建了文件,但我需要将其保存到可访问的文件位置,以便它可以附加到电子邮件中。只要它可以访问,我并不关心它保存在哪里。
以下代码在Android虚拟设备和我的Galaxy 2中运行时会导致崩溃。该应用程序是后续应用程序的概念验证。谢谢。
@Override
public void onClick(View v)
{
String nochartOutput = " ";
if (sitting.isChecked())
nochartOutput += "The patient was sitting in a chair. ";
if (breathing.isChecked())
nochartOutput += "The patient was breathing. ";
if (alert.isChecked())
nochartOutput += "The patient was alert. ";
FileOutputStream fOut = null;
File sdDir = Environment.getExternalStorageDirectory();
try {
fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
OutputStreamWriter osw = new OutputStreamWriter(fOut);
try {
osw.write(nochartOutput);
osw.flush();
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
03-04 18:39:53.604:W / dalvikvm(10453):threadid = 1:线程退出时未捕获异常(group = 0x40c211f8)
03-04 18:39:53.624:E / AndroidRuntime(10453):致命异常:主
03-04 18:39:53.624:E / AndroidRuntime(10453):java.lang.IllegalArgumentException:文件/mnt/sdcard/samplefile.txt包含路径分隔符
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.app.ContextImpl.makeFilename(ContextImpl.java:1703)
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.app.ContextImpl.openFileOutput(ContextImpl.java:723)
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.content.ContextWrapper.openFileOutput(ContextWrapper.java:165)
03-04 18:39:53.624:E / AndroidRuntime(10453):at com.example.com.dresdor.autowriter.MainActivity $ 1.onClick(MainActivity.java:48)
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.view.View.performClick(View.java:3620)
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.view.View $ PerformClick.run(View.java:14292)
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.os.Handler.handleCallback(Handler.java:605)
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.os.Handler.dispatchMessage(Handler.java:92)
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.os.Looper.loop(Looper.java:137)
03-04 18:39:53.624:E / AndroidRuntime(10453):在android.app.ActivityThread.main(ActivityThread.java:4507)
03-04 18:39:53.624:E / AndroidRuntime(10453):at java.lang.reflect.Method.invokeNative(Native Method)
03-04 18:39:53.624:E / AndroidRuntime(10453):at java.lang.reflect.Method.invoke(Method.java:511)
03-04 18:39:53.624:E / AndroidRuntime(10453):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)
03-04 18:39:53.624:E / AndroidRuntime(10453):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
03-04 18:39:53.624:E / AndroidRuntime(10453):at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:3)
您现有的代码是写入内部存储和外部存储的混搭。这条线
fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE);
尝试在应用程序的私有数据目录中创建文件,并且只能将文件名传递给此方法,而不是更深的路径。这就是崩盘的来源,但这不是你想要的。
您开始创建外部存储路径,但从未实际使用过它。要将文件写入外部SD卡上的该位置,请修改代码,如下所示:
FileOutputStream fOut = null;
//Since you are creating a subdirectory, you need to make sure it's there first
File directory = new File(Environment.getExternalStorageDirectory(), "AutoWriter");
if (!directory.exists()) {
directory.mkdirs();
}
try {
//Create the stream pointing at the file location
fOut = new FileOutputStream(new File(directory, "samplefile.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
OutputStreamWriter osw = new OutputStreamWriter(fOut);
//...etc...
使用SD卡可以让任何人访问该文件。
答案 1 :(得分:2)
openFileOutput()将文件写入内部存储器而不是SD卡。所以改变
fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE);
到
fOut = openFileOutput("samplefile.txt", MODE_WORLD_READABLE);
此外,文件名不能包含路径分隔符。见Android Developers Reference
public abstract FileOutputStream openFileOutput(String name,int mode)
打开与此Context的应用程序包关联的私有文件 写作。如果文件尚不存在,则创建该文件。
参数name要打开的文件的名称; 无法包含路径 分离器强>
然后可以像这样访问该文件。
FileInputStream fis = openFileInput("samplefile.txt");
注意:强> 对于大尺寸的文件,最好将其保存在SD卡中。这是代码段。
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
FileOutputStream fos = null;
try {
File rootPath = new File(Environment.getExternalStorageDirectory(), "AutoWriter");
if (!rootPath.exists())
rootPath.mkdirs();
File file = new File(rootPath, "samplefile.txt");
fos = new FileOutputStream(file);
// ... more lines of code to write to the output stream
} catch (FileNotFoundException e) {
Toast.makeText(this, "Unable to write file on external storage", Toast.LENGTH_LONG).show();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {}
}
}
}