Android写入SD卡文件夹

Rai*_*Son 80 java android http download android-sdcard

我使用以下代码从我的服务器下载文件,然后将其写入SD卡的根目录,一切正常:

package com.downloader;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.Environment;
import android.util.Log;

public class Downloader {

    public void DownloadFile(String fileURL, String fileName) {
        try {
            File root = Environment.getExternalStorageDirectory();
            URL u = new URL(fileURL);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            FileOutputStream f = new FileOutputStream(new File(root, fileName));

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = in.read(buffer)) > 0) {
                f.write(buffer, 0, len1);
            }
            f.close();
        } catch (Exception e) {
            Log.d("Downloader", e.getMessage());
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,使用Environment.getExternalStorageDirectory();意味着文件将始终写入根目录/mnt/sdcard.是否可以指定要将文件写入的特定文件夹?

例如: /mnt/sdcard/myapp/downloads

干杯

EEF

plu*_*ind 158

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/dir1/dir2");
dir.mkdirs();
File file = new File(dir, "filename");

FileOutputStream f = new FileOutputStream(file);
...
Run Code Online (Sandbox Code Playgroud)

  • 根据doc:*注意:不要在这里混淆"外部"这个词.此目录最好被视为媒体/共享存储.它是一个文件系统,可以容纳相对大量的数据,并在所有应用程序之间共享(不强制执行权限).**传统上这是一张SD卡**,但它也可以作为内置存储器实现,该设备不同于受保护的内部存储器,可以作为文件系统安装在计算机上* (15认同)
  • 别忘了添加互联网并向Android写入外部存储权限。 (2认同)

hcp*_*cpl 29

添加Android Manifest的权限

将此WRITE_EXTERNAL_STORAGE权限添加到您的应用程序清单中.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your.company.package"
    android:versionCode="1"
    android:versionName="0.1">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <!-- ... -->
    </application>
    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest> 
Run Code Online (Sandbox Code Playgroud)

检查外部存储的可用性

您应该首先检查可用性.来自外部存储的官方android文档的片段.

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;
}
Run Code Online (Sandbox Code Playgroud)

使用Filewriter

最后但并非最不重要的是忘记FileOutputStream并使用一个FileWriter代替.有关该类的更多信息构成了FileWriter javadoc.您可能希望在此处添加更多错误处理以通知用户.

// get external storage file reference
FileWriter writer = new FileWriter(getExternalStorageDirectory()); 
// Writes the content to the file
writer.write("This\n is\n an\n example\n"); 
writer.flush();
writer.close();
Run Code Online (Sandbox Code Playgroud)

  • @aga`FileWriter`具有直接编写字符串的便捷方法,这些方法不存在于`FileOutputStream`中.如果你不是在编写文本文件,那么`FileWriter`就没有多大帮助.事实上,如果你正在编写*image*文件,那么使用`FileWriter`根本无法完成它.当然,如果你真的*想要一个很好的文本API,请将你的`FileOutputStream`包装成一个`PrintStream`,你将拥有与`System.out`相同的所有方法. (3认同)
  • 我正在阅读的书的作者建议使用“FileOutputStream”(好吧,它不包括替代方案)。为什么最好使用“FileWriter”——它更快/更可靠/还有其他什么吗? (2认同)