首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解上下文和上下文的问题

理解上下文和上下文的问题
EN

Stack Overflow用户
提问于 2014-05-21 09:38:26
回答 1查看 1.5K关注 0票数 0

我听不懂这些课。我一直试图在内部存储的一个新目录中创建一个新文件,将一些文本放入其中,然后读取出来。如果没有ContextWrapper,这似乎是行不通的。所以我试了一下:

代码语言:javascript
复制
public class DownloadActivity extends Activity {
  ...
 class Download extends AsyncTask<String, Void, String>{

 ....
 private void searchAndSave(String s) throws IOException {
....
   ContextWrapper cw = new ContextWrapper(getBaseContext());
   File folder = cw.getDir("folder", Context.MODE_PRIVATE);
   File fileInFolder = new File(folder, "fileInFolder");

   String string = "Hello world!";
   FileOutputStream outputStream = openFileOutput("fileInFolder",
                                Context.MODE_PRIVATE);
   outputStream.write(string.getBytes());
   outputStream.close();

   File fl = new File(cw.getDir("folder", Context.MODE_PRIVATE)+"/fileInFolder");
   FileInputStream fin = new FileInputStream(fl);

   BufferedReader reader = new BufferedReader(
                                new   InputStreamReader(fin));
   StringBuilder sb = new StringBuilder();
   String line = null;
   while ((line = reader.readLine()) != null) {
       sb.append(line).append("\n");
   }
   String result = sb.toString();
   reader.close();
   fin.close();
   }
}

没有ContextWrapper,创建文件就无法工作。我已经读了很多书,但是我仍然有一些问题要理解,上下文和Contextwrapper到底做了什么,以及为什么我需要它们来创建一个文件。此外,在我的代码中,创建FileInputStream不起作用。当程序到达

代码语言:javascript
复制
FileInputStream fin = new FileInputStream(fl);

我总是会犯错误:

代码语言:javascript
复制
05-21 11:18:25.721: W/System.err(7344): java.io.FileNotFoundException: 
/data/data/com.example.dice/app_folder/fileInFolder: open failed: 
ENOENT (No such file or directory)

我真的很感激能帮助我理解和解决这个问题。

更新:我做了一个更多的业余活动,也许现在更容易重建整件事。(我应该在一个新的答案中这样做,还是可以编辑我的第一篇帖子?)尽管在尝试创建文件时没有收到错误消息,但似乎不起作用。这里我试着阅读"Hello“字符串,但是我得到了一个FileNotFoundException (EISDIR)。只想让你知道:)

代码语言:javascript
复制
public class FolderActivity extends Activity {
public final static String TAG = "FolderActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_folder);

    Button button = (Button) findViewById(R.id.button_folder);

    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            try {
                folder();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
}
    private void folder() throws IOException{
        Log.d(TAG, "folder");
        ContextWrapper cw = new ContextWrapper(getBaseContext());
        Log.d(TAG, "cw = new ContextWrapper");
        File folder = cw.getDir("folder", Context.MODE_PRIVATE);
        Log.d(TAG, "folder = cw.getDir");
        File fileInFolder = new File(folder, "fileInFolder");
        Log.d(TAG, "fileInFolder = new File");
        /*Log.d(TAG,
                "fileInFolder.getAbsolutePath()"
                        + fileInFolder.getAbsolutePath());*/

        String string = "Hello world!";
// Aksioms suggestion
        if (!fileInFolder.exists() && !fileInFolder.mkdirs()) {
            Log.e("file", "Couldn't create file " + fileInFolder);
        } else { Log.d(TAG, "file created"); }
        FileOutputStream outputStream = openFileOutput("fileInFolder",
                Context.MODE_PRIVATE);
        outputStream.write(string.getBytes());
        outputStream.close();
        Log.d(TAG,
                "fileInFolder.getAbsolutePath()"
                        + fileInFolder.getAbsolutePath());
        String s = fileInFolder.getAbsolutePath();
        try {
            getStringFromFile(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

public static String getStringFromFile (String filePath) throws Exception {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();        
    return ret;
}

public static String convertStreamToString(InputStream is) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
      sb.append(line).append("\n");
    }
    reader.close();
    return sb.toString();
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-21 13:12:07

您正在尝试打开一个不存在的文件。如果文件不存在,请确保检查并创建该文件:

代码语言:javascript
复制
if (!fl.exists() && !fl.mkdirs()) { 
                Log.e("file", "Couldn't create file " + fl);
}

编辑:

是的,如果没有创建文件夹,getDir会创建该文件夹。

代码语言:javascript
复制
File folder = cw.getDir("folder", Context.MODE_PRIVATE);

但问题在这里

代码语言:javascript
复制
 File fileInFolder = new File(folder, "fileInFolder");
   String string = "Hello world!";
   FileOutputStream outputStream = openFileOutput("fileInFolder",
                                Context.MODE_PRIVATE);

在这里,您尝试打开一个不存在的文件,您只构建了一个名为fileInFolder的新文件,但实际上还没有该文件夹。

尝试使用我首先编写的代码,在openFileOutput("fileInFolder",Context.MODE_PRIVATE)之前;:

代码语言:javascript
复制
if (!fileInFolder.exists() && !fileInFolder.mkdirs()) { 
                    Log.e("file", "Couldn't create file " + fileInFolder);
    }

试试这个告诉我是怎么回事。

编辑2:

好的,我发现问题很明显。错误是我们将fileInFolder创建为一个目录,您不能在其中写入任何内容:D

我们应该做的是:

删除创建fileInFolder的代码。

代码语言:javascript
复制
if (!fileInFolder .exists() && !fileInFolder .mkdirs()) {
    Log.e("file", "Couldn't create file " + fileInFolder );
} else {
    Log.d(TAG, "file created");
}

我们不需要创建它,因为我们将使用它作为一个文件。因此,我在您的代码中所做的更改是:

代码语言:javascript
复制
FileOutputStream outputStream = new FileOutputStream(fileInFolder);
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream));
    out.write(string);
    out.close();

在字符串字符串= "Hello!“和第一个Log.d之间添加以下内容.这是写入文件的正确方法。

整个代码:

代码语言:javascript
复制
public class MainActivity extends Activity {
public final static String TAG = "FolderActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button) findViewById(R.id.button_folder);

    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            try {
                folder();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
}

private void folder() throws IOException {
    Log.d(TAG, "folder");
    ContextWrapper cw = new ContextWrapper(getBaseContext());
    Log.d(TAG, "cw = new ContextWrapper");
    File folder = cw.getDir("folder", Context.MODE_PRIVATE);
    Log.d(TAG, "folder = cw.getDir");
    File fileInFolder = new File(folder, "fileInFolder");
    Log.d(TAG, "fileInFolder = new File");
    /*
     * Log.d(TAG, "fileInFolder.getAbsolutePath()" +
     * fileInFolder.getAbsolutePath());
     */

    String string = "Hello world!";

    FileOutputStream outputStream = new FileOutputStream(fileInFolder);
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream));
    out.write(string);
    out.close();
    Log.d(TAG,
            "fileInFolder.getAbsolutePath()"
                    + fileInFolder.getAbsolutePath());
    String s = fileInFolder.getAbsolutePath();
    try {
        getStringFromFile(s);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static String getStringFromFile(String filePath) throws Exception {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    // Make sure you close all streams.
    fin.close();
    return ret;
}

public static String convertStreamToString(InputStream is) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line).append("\n");
    }
    reader.close();
    return sb.toString();
}}

检查您的清单中是否有此权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我希望现在一切都清楚了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23779398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档