gpt4 book ai didi

java - 理解上下文和上下文包装器时出现问题

转载 作者:行者123 更新时间:2023-12-01 12:57:11 26 4
gpt4 key购买 nike

我无法理解这些类(class)。我一直在尝试在内部存储的新目录中创建一个新文件,在其中放入一些文本,然后将其读出。如果没有 ContextWrapper,这似乎不起作用。所以我尝试了这个:

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,则无法创建文件。我已经读了很多书,但我仍然有一些问题需要理解,Context 和 Contextwrapper 实际做什么以及为什么我需要它们来创建文件。另外,在我的代码中,创建 FileInputStream 不起作用。当程序达到

FileInputStream fin = new FileInputStream(fl);

我总是收到错误:

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)

我真的很希望能得到一些帮助来理解和解决这个问题。

更新:我做了一个更备用的 Activity ,也许现在重建整个事情更容易了。 (我应该在新答案中完成此操作,还是可以编辑我的第一篇文章?)尽管我在尝试创建文件时没有收到错误消息,但似乎不起作用。在这里,我尝试读取“Hello world”字符串,但收到 FileNotFoundException (EISDIR)。只是为了让你知道:)

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();
}
}

最佳答案

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

if (!fl.exists() && !fl.mkdirs()) { 
Log.e("file", "Couldn't create file " + fl);
}

编辑:

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

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);

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

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

if (!fileInFolder.exists() && !fileInFolder.mkdirs()) { 
Log.e("file", "Couldn't create file " + fileInFolder);
}

试试这个并告诉我效果如何。

编辑2:

好吧,我发现问题是如此明显。错误是我们将 fileInFolder 创建为目录,并且您不能在那里写入任何内容 :D

我们应该做的是:

删除我用于创建 fileInFolder 的代码。

if (!fileInFolder .exists() && !fileInFolder .mkdirs()) {
Log.e("file", "Couldn't create file " + fileInFolder );
} else {
Log.d(TAG, "file created");
}

我们不需要创建它,因为我们将把它用作文件。所以我在你的代码中所做的更改是这样的:

FileOutputStream outputStream = new FileOutputStream(fileInFolder);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream));
out.write(string);
out.close();

在 String string = "Hello world!"; 行之间添加此内容还有第一个Log.d...这是写入文件的正确方法。

整个代码:

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();
}}

检查您的 list 中是否具有此权限:

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

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

关于java - 理解上下文和上下文包装器时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23779398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com