HEJ,
我有一些随应用程序发送的数据,应该复制到外部存储器上.它嵌套在几个子文件夹中,我想复制整个结构.
我很难为任何ressource获取File对象/assets.但我认为我依赖于那个'因为我需要像File.isDirectory()这样的东西来确定我是否必须开始复制或深入了解系统.
我的第一种方法是使用资产管理器,但似乎课程没有提供我需要的信息.最有希望的是为了获得一个AssetFileDescriptor并且下降到一个[FileDescriptor][2].然而,没有他们似乎有一个isDirectory方法.
所以我的另一种方法很简单:创建一个文件对象并开心.然而,似乎我正在运行这个缺少正确路径来实例化文件对象的问题.我知道file://android_asset但它似乎不适用于file构造函数.
我的最后一个想法是利用InputStream(无论如何我需要进行复制)并以某种方式过滤该字节的重要位,这表明该资源是一个目录.这是一个非常hacky的解决方案,可能是在无效的地狱,但我没有看到另一种解决方法.
Fab*_*ndl 13
我有同样的问题.在某些时候,我意识到这list()真的很慢(每次通话50ms),所以我现在使用不同的方法:
我有一个(eclipse)ant-builder,每次我的asset-folder更改时都会创建一个索引文件.该文件每行只包含一个文件名,因此目录被隐含列出(如果它们不为空).
建造者:
<?xml version="1.0"?>
<project default="createAssetIndex">
<target name="createAssetIndex">
<fileset id="assets.fileset" dir="assets/" includes="**"
excludes="asset.index" />
<pathconvert pathsep="${line.separator}" property="assets"
refid="assets.fileset">
<mapper>
<globmapper from="${basedir}/assets/*" to="*"
handledirsep="yes" />
</mapper>
</pathconvert>
<echo file="assets/asset.index">${assets}</echo>
</target>
</project>
Run Code Online (Sandbox Code Playgroud)
加载asset.index到字符串列表中的类,因此您可以使用它快速执行任意操作:
import android.content.ContextWrapper;
import com.google.common.collect.ImmutableList;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* uses asset.index file (which is pregenerated) since asset-list()s take very long
*
*/
public final class AssetIndex {
//~ Static fields/initializers -------------------------------------------------------------------------------------
private static final Logger L = LoggerFactory.getLogger(AssetIndex.class);
//~ Instance fields ------------------------------------------------------------------------------------------------
private final ImmutableList<String> files;
//~ Constructors ---------------------------------------------------------------------------------------------------
public AssetIndex(final ContextWrapper contextWrapper) {
ImmutableList.Builder<String> ib = ImmutableList.builder();
L.debug("creating index from assets");
InputStream in = null;
Scanner scanner = null;
try {
in = contextWrapper.getAssets().open("asset.index");
scanner = new Scanner(new BufferedInputStream(in));
while (scanner.hasNextLine()) {
ib.add(scanner.nextLine());
}
scanner.close();
in.close();
} catch (final IOException e) {
L.error(e.getMessage(), e);
} finally {
if (scanner != null) {
scanner.close();
}
if (in != null) {
try {
in.close();
} catch (final IOException e) {
L.error(e.getMessage(), e);
}
}
}
this.files = ib.build();
}
//~ Methods --------------------------------------------------------------------------------------------------------
/* returns the number of files in a directory */
public int numFiles(final String dir) {
String directory = dir;
if (directory.endsWith(File.separator)) {
directory = directory.substring(0, directory.length() - 1);
}
int num = 0;
for (final String file : this.files) {
if (file.startsWith(directory)) {
String rest = file.substring(directory.length());
if (rest.charAt(0) == File.separatorChar) {
if (rest.indexOf(File.separator, 1) == -1) {
num = num + 1;
}
}
}
}
return num;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试获取文件上的列表,但在目录上获取有效响应,则 AssetManager 上的list()可能会给出 null/零长度数组/IOException。
但否则它应该是 file:///android_asset (带有 3 /)
| 归档时间: |
|
| 查看次数: |
3975 次 |
| 最近记录: |