我正在尝试写入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
及时索引您的文件,请执行以下操作:
-
使用
FileOutputStream
(可选地包装在OutputStreamWriter
中),而不是FileWriter
-
在
FileOutputStream
上调用flush()
、getFD().sync()
和close()
,而不是在FileWriter
上调用flush()
和close()
(sync()
将确保字节在继续之前写入磁盘) -
使用
MediaScannerConnection
和scanFile()
告诉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
我希望这对你有所帮助。谢谢。