Я не уверен, что не так с этим кодом? Он создает файл на SD-карте, но с 0 байт. Может ли один из вас заглянуть в него и сказать мне, что с этим не так?
Здесь я пытаюсь скопировать файл из папки с ресурсами, которая является кодом.db на SD-карту.
AssetManager assetManager = getResources().getAssets();
InputStream in = null;
OutputStream out = null;
BufferedInputStream buf = null;
try {
in = assetManager.open("codes.db");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Error jh: " + e.getMessage());
}
if (in != null) {
try {
out = new FileOutputStream("/sdcard/" + "codes.db");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Error Line : " + e.getLocalizedMessage());
}
}
System.out.println("IN VALUE : " + in);
System.out.println("OUT VALUE : " + out);
int chunkBytes = 0;
byte[] outputByte = new byte[1024];
if (in != null && out != null) {
try {
// while ((chunkBytes = in.read(outputByte, 0, 1024)) != -1) {
while ((chunkBytes = in.read()) != -1) {
// write contents to the file
System.out.println("I m here");
// out.write(outputByte, 0, (int) chunkBytes);
out.write(chunkBytes);
// publish the progress of downloading..
}
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("Error here: "
+ e.getLocalizedMessage().toString());
}
}
try {
in.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Error there: " + e.getLocalizedMessage());
}
}
Я получаю эту ошибку во всех случаях.. Я уверен, что у меня есть мой набор разрешений... code.db в sd card 0 байт... :(
05-24 09:59:34.221: W/System.err(5559): java.io.IOException
05-24 09:59:34.221: W/System.err(5559): at android.content.res.AssetManager.readAsset(Native Method)
05-24 09:59:34.221: W/System.err(5559): at android.content.res.AssetManager.access$700(AssetManager.java:36)
05-24 09:59:34.221: W/System.err(5559): at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:571)
05-24 09:59:34.221: W/System.err(5559): at com.bewo.copy.TestCopyActivity.copyStream(TestCopyActivity.java:136)
05-24 09:59:34.221: W/System.err(5559): at com.bewo.copy.TestCopyActivity.onCreate(TestCopyActivity.java:19)
05-24 09:59:34.221: W/System.err(5559): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2635)
05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2687)
05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread.access$2300(ActivityThread.java:127)
05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2035)
05-24 09:59:34.221: W/System.err(5559): at android.os.Handler.dispatchMessage(Handler.java:99)
05-24 09:59:34.221: W/System.err(5559): at android.os.Looper.loop(Looper.java:123)
05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread.main(ActivityThread.java:4635)
05-24 09:59:34.221: W/System.err(5559): at java.lang.reflect.Method.invokeNative(Native Method)
05-24 09:59:34.221: W/System.err(5559): at java.lang.reflect.Method.invoke(Method.java:521)
05-24 09:59:34.221: W/System.err(5559): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-24 09:59:34.221: W/System.err(5559): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-24 09:59:34.221: W/System.err(5559): at dalvik.system.NativeStart.main(Native
После многих поисков я просто хотел использовать метод, который мог бы использовать в потоке позже, вот что я использую для своего приложения:
static public void copyFileFromAssets(Context context, String file, String dest) throws Exception
{
InputStream in = null;
OutputStream fout = null;
int count = 0;
try
{
in = context.getAssets().open(file);
fout = new FileOutputStream(new File(dest));
byte data[] = new byte[1024];
while ((count = in.read(data, 0, 1024)) != -1)
{
fout.write(data, 0, count);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (in != null)
{
try {
in.close();
} catch (IOException e)
{
}
}
if (fout != null)
{
try {
fout.close();
} catch (IOException e) {
}
}
}
}
Пожалуйста, дайте мне знать, если это поможет!
Надеюсь, что ниже код может вам помочь -
package com.paresh.copyfileassetstoAssets;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
public class CopyFileAssetsToSDCardActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CopyAssets();
}
private void CopyAssets() {
AssetManager assetManager = getAssets();
String[] files = null;
try {
files = assetManager.list("Files");
} catch (IOException e) {
Log.e("tag", e.getMessage());
}
for(String filename : files) {
System.out.println("File name => "+filename);
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open("Files/"+filename); // if files resides inside the "Files" directory itself
out = new FileOutputStream(Environment.getExternalStorageDirectory().toString() +"/" + filename);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch(Exception e) {
Log.e("tag", e.getMessage());
}
}
}
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);
}
}
}
Лучший блог для копирования файлов с данными на SDCard. И также убедитесь, что требуемое разрешение для внешнего хранилища
Попробуйте увеличить размер SD-карты в AVD-менеджере независимо от того, что вы используете. Надеюсь, это вам поможет.