Java 将文件从资产复制到SD卡上的文件夹失败
我正在我的应用程序(Spl!t)中使用tesseract OCR。当我从Eclipse向手机启动应用程序时,eng.traineddata被复制到/storage/simulated/0/Pictures/Receipts/tessdata/。但是当我从市场上安装应用程序时,eng.traineddata文件没有复制到文件夹中。我的代码有问题吗Java 将文件从资产复制到SD卡上的文件夹失败,java,android,android-asynctask,tesseract,mkdir,Java,Android,Android Asynctask,Tesseract,Mkdir,我正在我的应用程序(Spl!t)中使用tesseract OCR。当我从Eclipse向手机启动应用程序时,eng.traineddata被复制到/storage/simulated/0/Pictures/Receipts/tessdata/。但是当我从市场上安装应用程序时,eng.traineddata文件没有复制到文件夹中。我的代码有问题吗 私有文件getOutputPhotoFile(){ 目录=新文件( 环境 .getExternalStoragePublicDirectory(Envi
私有文件getOutputPhotoFile(){
目录=新文件(
环境
.getExternalStoragePublicDirectory(Environment.DIRECTORY\u图片),
“收据”);
dataPath=directory.getAbsolutePath();
如果(!directory.exists()){
mkdirs()目录;
Toast.makeText(Trans_List.this,“Receipts Folder Created”,Toast.LENGTH_SHORT.show();
File tessDir=新文件(目录,“tessdata”);
如果(!tessDir.exists()){
tessDir.mkdirs();
Toast.makeText(Trans_List.this,“创建的数据文件夹”,Toast.LENGTH_SHORT.show();
文件培训数据=新文件(tessDir,“eng.traineddata”);
如果(!trainingData.exists())
新建CopyLibrary().execute(LANG);
}
}
字符串时间戳=新的SimpleDataFormat(“yyyyMMdd\u HHmmss”)
.格式(新日期());
返回新文件(directory.getPath()+File.separator+“receivement\ux”
+时间戳+“.jpg”);
}
私有类CopyLibrary扩展了异步任务{
私有void复制文件(输入流输入,输出流输出)
抛出IOException{
字节[]缓冲区=新字节[1024];
int-read;
while((read=in.read(buffer))!=-1)
输出。写入(缓冲区,0,读取);
}
@凌驾
受保护的空doInBackground(字符串…s){
AssetManager AssetManager=getAssets();
String[]files=null;
试一试{
files=assetManager.list(“”);
}捕获(IOE异常){
Log.e(“Spl!t”,“无法获取资产文件列表”);
}
用于(字符串文件名:文件){
InputStream in=null;
OutputStream out=null;
试一试{
in=assetManager.open(文件名);
File outFile=新文件(dataPath+File.separator
+“tessdata”+File.separator,LANG
+“.traineddata”);
out=新文件输出流(输出文件);
复制文件(输入、输出);
in.close();
in=null;
out.flush();
out.close();
Toast.makeText(Trans_List.this,“数据已复制”,Toast.LENGTH_SHORT.show();
out=null;
}捕获(IOE异常){
Log.e(标记“未能复制资产文件”);
}
}
返回null;
}
}
“需要创建数据路径/pictures/receipts/tessdata/eng.trainededdata”--这是不可能的,因为您不能从文件系统根目录(
/
)创建新目录,可能除了在根目录设备上之外。@commonware我的手机已根目录,但我正在使用.getExternalStoragePublicDirectory(Environment.DIRECTORY\u pictures)正在/storage/emulated/0/pictures/下创建目录。这是根文件夹吗?“这是根文件夹吗”--不,但您不会知道/storage/emulated/0/pictures/
不是/pictures/receipts/tessdata/eng.traineddata
。您也许可以创建/storage/simulated/0/pictures/receipts/tessdata/eng.traineddata
。抱歉@commonware,我不明白您的意思?这正是我要将eng.traineddata复制到的路径。
private File getOutputPhotoFile() {
directory = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"Receipts");
dataPath = directory.getAbsolutePath();
if (!directory.exists()) {
directory.mkdirs();
Toast.makeText(Trans_List.this, "Receipts Folder Created", Toast.LENGTH_SHORT).show();
File tessDir = new File(directory, "tessdata");
if (!tessDir.exists()) {
tessDir.mkdirs();
Toast.makeText(Trans_List.this, "Tessdata Folder Created", Toast.LENGTH_SHORT).show();
File trainingData = new File(tessDir, "eng.traineddata");
if(!trainingData.exists())
new CopyLibrary().execute(LANG);
}
}
String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss")
.format(new Date());
return new File(directory.getPath() + File.separator + "Receipt_"
+ timeStamp + ".jpg");
}
private class CopyLibrary extends AsyncTask<String, Void, Void> {
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);
}
@Override
protected Void doInBackground(String... s) {
AssetManager assetManager = getAssets();
String[] files = null;
try {
files = assetManager.list("");
} catch (IOException e) {
Log.e("Spl!t", "Failed to get asset file list.");
}
for (String filename : files) {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(filename);
File outFile = new File(dataPath + File.separator
+ "tessdata" + File.separator, LANG
+ ".traineddata");
out = new FileOutputStream(outFile);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
Toast.makeText(Trans_List.this, "Tessdata copied", Toast.LENGTH_SHORT).show();
out = null;
} catch (IOException e) {
Log.e(TAG, "Failed to copy asset file");
}
}
return null;
}
}