在 Android 上写入外部文件---文件不会注册,但 Java 可以读取



我正在尝试写入Android的外部txt(或csv)文件。我可以运行一个应用程序,关闭它,然后再次运行它,readData() 会将我存储的内容读回我的日志。但是,dirFile(文件目录)在我的Android文件中没有出现(即使我将其连接到计算机并进行搜索)。

不过,有趣的是:如果我清除日志(类似于 Eclipse 中显示的打印语句列表)并断开手机与计算机的连接,然后重新连接它,日志会重新出现我曾经写入文件的所有内容(即使我后来覆盖了它)......然而,该应用程序甚至没有运行!

这是我的代码。请帮助我理解为什么我找不到我的文件!

(注意:我尝试将"myFile.txt"扩展名附加到目录中,但它只会导致EISDIR异常。

public void writeData(String dirName){
    try
    {
        File root = new File(getExternalFilesDir(null), dirName);
        // Writes to file
        //
        // The "true" argument allows the file to be appended. Without this argument (just root),
        // the file will be overwritten (even though we later call append) rather than appended to.
        FileWriter writer = new FileWriter(root, true);
        writer.append("Append This Textn");
        writer.flush();
        writer.close();
        // Checks if we actually wrote to file by reading it back in (appears in Log)
        //readData(dirName);
    }
    catch(Exception e)
    {
         Log.v("2222", "2222 ERROR: " + e.getMessage());
    }
}

如果你有兴趣,这是我写的用于读取数据的函数:

public void readData(String dirName){
    try
    {
        File root = new File(getExternalFilesDir(null), dirName);
        // Checks to see if we are actually writing to file by reading in the file
        BufferedReader reader = new BufferedReader(new FileReader(root));
        try {
            String s = reader.readLine();
            while (s != null) {
                Log.v("2222", "2222 READ: " + s);
                s = reader.readLine();
            }
        }
        catch(Exception e) {
             Log.v("2222", "2222 ERROR: " + e.getMessage());
        }
        finally {
            reader.close();
        }
    }
    catch(Exception e) {
         Log.v("2222", "2222 ERROR: " + e.getMessage());
    }
}

谢谢!

即使我将其连接到计算机并搜索

如果我清除日志(类似于 Eclipse 中显示的打印语句列表)并断开手机与计算机的连接,然后重新连接它,日志会重新出现我曾经写入文件的所有内容(即使我后来覆盖了它)。

您在计算机上看到的是按 MediaStore 索引的内容,可能是其中的子集,具体取决于您的计算机是否根据"目录"内容缓存从设备获取的信息。

要帮助确保 MediaStore 及时索引您的文件,请执行以下操作:

  1. 使用FileOutputStream(可选地包装在OutputStreamWriter中),而不是FileWriter

  2. FileOutputStream上调用flush()getFD().sync()close(),而不是在FileWriter上调用flush()close()sync()将确保字节在继续之前写入磁盘)

  3. 使用MediaScannerConnectionscanFile()告诉MediaStore为文件编制索引

然后,您可以使用桌面操作系统文件管理器中的任何"重新加载"或"刷新"或任何选项,并且您的文件应该会显示出来。

这篇博文详细介绍了所有这些内容。

public void create(){
folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES),"video");
    boolean success = true;
    if (!folder.exists()) {
    success=folder.mkdirs();
    }
    if (success) {
                    readfile();
    } else {
        System.out.println("failed");
    }
}

上面的代码将用于在所需路径上创建移动中的目录

private void readfile() {
// TODO Auto-generated method stub
AssetManager assetManager = getResources().getAssets();
String[] files = null;
try {
    files = assetManager.list("clipart");
} catch (Exception e) {
    Log.e("read clipart ERROR", e.toString());
    e.printStackTrace();
}
for(String filename : files) {
    System.out.println("File name => "+filename);
    InputStream in = null;
    OutputStream out = null;
    try {
      in = assetManager.open("clipart/" + filename);
      out = new FileOutputStream(folder + "/" + filename);
      copyFile(in, out);
      in.close();
      in = null;
      out.flush();
      out.close();
      out = null;
    } catch(Exception e) {
        Log.e("copy clipart ERROR", e.toString());
        e.printStackTrace();
    }       
}}private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
  out.write(buffer, 0, read);
}}

这是我用于从项目中的资产文件夹在内部存储器中写入文件的代码。此代码可以将文件的所有类型(扩展名)从资产文件夹读取到移动设备。

不要忘记在清单文件中添加权限

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

并通过以下方式调用上述函数

readfile();//this call the function to read and write the file

我希望这对你有所帮助。谢谢。

相关内容

  • 没有找到相关文章

最新更新