Java 在SD卡中创建和写入文件

Java 在SD卡中创建和写入文件,java,android,android-sdcard,Java,Android,Android Sdcard,令人烦恼的是,我在SD卡上创建并写入了下面的代码,然后继续开发更多的代码。但是我一定改变了什么,因为现在它不起作用了 这是漫长而烦人的一天,所以我想知道是否有人能指出我犯的简单错误 SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy / hh-mm-ss"); Date curDate = new Date(); String stringDate = sdf.format(curDate); String resultLogFile

令人烦恼的是,我在SD卡上创建并写入了下面的代码,然后继续开发更多的代码。但是我一定改变了什么,因为现在它不起作用了

这是漫长而烦人的一天,所以我想知道是否有人能指出我犯的简单错误

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy / hh-mm-ss");
Date curDate = new Date();
String stringDate = sdf.format(curDate);
String resultLogFile = "logFile " + stringDate;

File newFile = new File("sdcard/" + (resultLogFile));
if (!newFile.exists()) {
    try {
        newFile.createNewFile();
    }
    catch (IOException e) {
        e.printStackTrace();
    }

}
try {
    BufferedWriter buf = new BufferedWriter(new FileWriter(newFile, true));
    buf.append(writeToFileString);
    buf.newLine();
    buf.close();
} catch (IOException e) {
    e.printStackTrace();
}
这是控制台:

09-19 17:58:16.270: W/System.err(10411): java.io.IOException: open failed: ENOENT (No such file or directory)
09-19 17:58:16.275: W/System.err(10411):    at java.io.File.createNewFile(File.java:940)
09-19 17:58:16.275: W/System.err(10411):    at android.Maps.GeneticAlgorithm3.shufflePerm3(GeneticAlgorithm3.java:192)
09-19 17:58:16.275: W/System.err(10411):    at android.Maps.HomeScreen$6.onClick(HomeScreen.java:334)
09-19 17:58:16.275: W/System.err(10411):    at android.view.View.performClick(View.java:4084)
09-19 17:58:16.275: W/System.err(10411):    at android.view.View$PerformClick.run(View.java:16966)
09-19 17:58:16.275: W/System.err(10411):    at android.os.Handler.handleCallback(Handler.java:615)
09-19 17:58:16.275: W/System.err(10411):    at android.os.Handler.dispatchMessage(Handler.java:92)
09-19 17:58:16.275: W/System.err(10411):    at android.os.Looper.loop(Looper.java:137)
09-19 17:58:16.275: W/System.err(10411):    at android.app.ActivityThread.main(ActivityThread.java:4896)

我想您应该使用
“/sdcard/”
而不是
“sdcard/”

来获取根SD卡位置。

SD卡位置取决于制造商。 当您使用带有IDE的手机时,您可以选择USB大容量存储,也可以选择无USB连接。 如果选择USB大容量存储而不是SD卡,则应用程序无法使用它:)

我已使用示例代码检查它:

boolean mExternalStorageAvailable = false;
        boolean mExternalStorageWriteable = false;
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // We can read and write the media
            mExternalStorageAvailable = mExternalStorageWriteable = true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            // We can only read the media
            mExternalStorageAvailable = true;
            mExternalStorageWriteable = false;
        } else {
            // Something else is wrong. It may be one of many other states, but
            // all we need
            // to know is we can neither read nor write
            mExternalStorageAvailable = mExternalStorageWriteable = false;
        }

        if (mExternalStorageAvailable && mExternalStorageWriteable) {
            doWriteForExternalStorage();
        } else {
            Log.d(TAG, "mExternalStorageAvailable: " + mExternalStorageAvailable + ", mExternalStorageWriteable: " + mExternalStorageWriteable + " it is Connected to PC now?");
        }

@SuppressWarnings(“未使用”)
私有无效doWriteForExternalStorage(){
//TODO自动生成的方法存根
文件extDir=Environment.getExternalStorageDirectory();
d(标记“extDir:+extDir.getAbsolutePath());
if(extDir.isDirectory()&&extDir.canWrite()){
File fileData=新文件(extDir,“mydata.txt”);
d(标记“想要创建文件:”+fileData.toString());
FileOutputStream=null;
试一试{
布尔追加=真;
fos=新的FileOutputStream(fileData,追加);
BufferedOutputStream bos=新的BufferedOutputStream(fos,8192);//8KB字节
//牛,
//它
//应该
//是
//充足的
StringBuilder sb=新的StringBuilder(“\n”);
List runningTasks=activityManager.getRunningTasks(100);
if(runningTasks!=null){
对于(RunningTaskInfo runningTask:runningTasks){
sb.append(“runningTask:”).append(runningTask.baseActivity.getPackageName()).append(“,”).append(runningTask.baseActivity.getClassName());
}
}否则{
sb.追加(“无运行任务”);
}
byte[]data=sb.toString().getBytes();
写入(数据);
bos.flush();
bos.close();
fos=null;
}捕获(IOE异常){
e、 printStackTrace();
}最后{
如果(fos!=null){
试一试{
fos.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
}
要记录服务,请尝试使用:

File newFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + (resultLogFile));
对于时间戳,您可以使用以下方法获取它,然后将其添加到名称的末尾:

public String date() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss");  
        df.setTimeZone(TimeZone.getTimeZone("PST"));  
        return df.format(new Date());
}

另外,请确保您没有通过USB将SD卡挂载到您的计算机等设备上,因为这会使它在挂载时对应用程序不可用。

不,不幸的是,没有其他问题。您也可以尝试忽略
SimpleDateFormat
中使用的
/
。您可能想尝试/mnt/sdcard您不应该硬编码SD卡路径。使用Environment.getExternalStorageDirectory().getAbsolutePath()在大多数设备上,完整路径名为“/mnt/sdcard/”。这是getExternalStorageDirectory()通常返回的内容。在大多数新设备上,这是内置存储。在大多数设备上,可移动设备无法通过Android功能使用。你必须自己滚。Galaxy S3使用/mnt/extSdCard,Galaxy便笺(1而不是2)使用/mnt/sdcard/external\u sd。其他设备使用其他路径名。如果需要,我将发布一个类来扫描所有SD卡。因此它现在创建了文件,但我想知道如何在文件名的末尾添加时间戳。我想我可以添加字符串resultsLogFile或stringDate。有什么想法吗?很抱歉,只是休息了一天,但是我要把它附加到文件名的什么位置呢?String resultLogFile=“logFile”+date();恐怕不行09-19 19:36:38.625:W/System.err(31707):java.io.IOException:open失败:enoint(没有这样的文件或目录)它没有。因此,没有时间戳是可行的。有了时间戳,它就没有了
public String date() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss");  
        df.setTimeZone(TimeZone.getTimeZone("PST"));  
        return df.format(new Date());
}