[RESOLVIDO] FileOutputStream e mkdir() não funcionam!

Gente que desespero…

Rodei esse método (que copia o banco de dados para o memória externa do celular):

public String exportacaoBanco() {

    File from = new File("//data/data/sistema.escola/databases/Escola.db");
    File to = new File(Environment.getExternalStorageDirectory()+"/BACKUP_ESCOLA");

    try{
        to.mkdir();

        FileChannel in = new FileInputStream( from ).getChannel();
        FileChannel out = new FileOutputStream( to ).getChannel();

        out.transferFrom( in, 0, in.size() );

        return "Sucesso!";
    }
    catch(IOException e){
        return "falha";
    }
}

E ele funcionou, mas só uma vez. O bendito parou de rodar o Try do nada!

Excluí a pasta e o arquivo que foram criados na memória externa do celular e rodei o app novamente pra ver se era isso. Não era!

Então fui ver oq estava dando erro no Try e comentei essa parte:

FileChannel out = new FileOutputStream( to ).getChannel();

out.transferFrom( in, 0, in.size() );

return “Sucesso!”;

E ele rodou o Try. Então descomentei a linha:

FileChannel out = new FileOutputStream( to ).getChannel();

Ele parou de rodar o Try e rodou o catch. Sem falar que ele nem criou mais a pasta “BACKUP_ESCOLA”!

Alguém sabe o pq tá acontecendo isso?

Grata!

Pq vc tá criando tópicos duplicados? Não tem problema em editar um só e manter ele! Para o problema:

Troca return falha por e.printStackTrace()

E nos diga o erro.


obs:

vc está criando a pasta mesmo ela existindo, faz assim:

File to = new File(.........);

try {
   if(!to.exists()){
      to.mkdir();
      //pode ate fazer um toast pra confirmar q ta criando
   } else {
      //pra TESTE::: vc pode fazer um toast pra confirmar q ja existe
   }
 
   ......

} catch (Exception e){
   e.printStacktrace();
}

Tive problemas com a edição, releve

A princípio eu estava tendo problemas com o FileOutpoutStream, mas fui testando o código por partes e aconteceu dele não criar mais a pasta “BACKUP_ESCOLA” com o mkdir() . Ele roda, mas a pasta não é criada na memória do celular.

vc usou o e.printStackTrace(); pra saber se ta acusando algum erro?

Usei. Não dá erro. O problema é que a pasta não está sendo criada. Mudei os nomes das variáveis só pra não me enrolar, o código está assim:

public String exportacaoBanco() {
    File de = new File("//data/data/sistema.escola/databases/Escola.db");
    File para = new File(Environment.getExternalStorageState()+"/BACKUP_ESCOLA/");

    try {
        if(!para.exists()){
            para.mkdir();
            return "Criou!";                
        }
        else {                
            return "já existe!";
        }
    }
    catch(Exception e){
        e.printStackTrace();
        return "falha";
    }
}

Só tô tentando criar a pasta, a princípio, pra depois ver o FileOutputStream e o FileChannel.

Estou retornando a string, pq esse método está na classe do banco de dados e o retorno eu exibo em outra classe, no Toast, só por isso.

Tenta criar em outra pasta, na pasta music por exemplo:

 File backupPasta = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/BACKUP_ESCOLA");

Nossa que bug miserável…
Msm coisa, ele dá o “Criou”, mas a pasta não é criada na memória do celular. Nada feito…
Não dá nem pra continuar com o que foi problema no começo, o FileOutputStream e o FileChannel.

Acho que não é bug não, se ta falando que criou é pq criou kkkkkk, vc olhou a pasta music pra ver se tem algo?

outra coisa, seu manifest tá permitindo gravações? se sim, ve nas configurações do app se o mesmo ta permitindo a gravação de arquivos

Olhei, orochimaru, sério, a danada não aparece aki! Não sei se foi alguma coisa que aconteceu quando o método rodoui da primeira vez. Ele não só criou a pasta como o .transferFrom transferiu/copiou o arquivo pra pasta. Depois disto ele ficou assim.
As permissões já estão no Manifest e as permissões do aparelho tbm estão ativadas.

vc ta fazendo alguma operação antes de chegar nessa parte aí?

Não… Só tentando criar essa bendita pasta, pra transferir o meu .db pra ela.

isso daria pra entender se vc tivesse esquecido de fechar a gravação do arquivo, então ele nao poderia ser excluido até vc fechar o app…

faz o debug nas linhas então, aí vê o que ta acontecendo

Ah… Debug is on the table!

O que o Debug mostrou:

04/11 23:48:07: Launching 'app' on motorola moto g(6) play.
$ adb shell am start -n "sistema.escola/sistema.escola.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D
Waiting for application to come online: sistema.escola.test | sistema.escola
Waiting for application to come online: sistema.escola.test | sistema.escola
Waiting for application to come online: sistema.escola.test | sistema.escola
Connecting to sistema.escola
Connected to the target VM, address: 'localhost:8600', transport: 'socket'
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
I/System.out: Debugger has connected
I/System.out: waiting for debugger to settle...
I/chatty: uid=10449(sistema.escola) identical 4 lines
I/System.out: waiting for debugger to settle...
I/System.out: waiting for debugger to settle...
I/System.out: waiting for debugger to settle...
I/System.out: waiting for debugger to settle...
I/System.out: debugger has settled (1341)
W/sistema.escola: Accessing hidden method Landroid/graphics/drawable/Drawable;->getOpticalInsets()Landroid/graphics/Insets; (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->left:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->right:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->top:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->bottom:I (light greylist, linking)
W/sistema.escola: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/widget/TextView;->getTextDirectionHeuristic()Landroid/text/TextDirectionHeuristic; (light greylist, linking)
W/sistema.escola: Accessing hidden method Landroid/graphics/FontFamily;-><init>()V (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->addFontFromAssetManager(Landroid/content/res/AssetManager;Ljava/lang/String;IZIII[Landroid/graphics/fonts/FontVariationAxis;)Z (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/graphics/FontFamily;->addFontFromBuffer(Ljava/nio/ByteBuffer;I[Landroid/graphics/fonts/FontVariationAxis;II)Z (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->freeze()Z (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->abortCreation()V (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/graphics/Typeface;->createFromFamiliesWithDefault([Landroid/graphics/FontFamily;Ljava/lang/String;II)Landroid/graphics/Typeface; (light greylist, reflection)
D/OpenGLRenderer: Skia GL Pipeline
I/Adreno: QUALCOMM build                   : 7adeec4758, I21281c58c8
    Build Date                       : 12/27/18
    OpenGL ES Shader Compiler Version: EV031.25.03.02
    Local Branch                     : 
    Remote Branch                    : refs/tags/AU_LINUX_ANDROID_LA.UM.7.5.R1.09.00.00.464.037
    Remote Branch                    : NONE
    Reconstruct Branch               : NOTHING
    Build Config                     : S L 6.0.7 AArch32
I/Adreno: PFP: 0x005ff110, ME: 0x005ff066
I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 2
I/Choreographer: Skipped 59 frames!  The application may be doing too much work on its main thread.
I/OpenGLRenderer: Davey! duration=1183ms; Flags=0, IntendedVsync=6681602663235, Vsync=6682585996529, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=6682591977427, AnimationStart=6682592317062, PerformTraversalsStart=6682600523469, DrawStart=6682604451699, SyncQueued=6682719315668, SyncStart=6682719486971, IssueDrawCommandsStart=6682719876293, SwapBuffers=6682782631977, FrameCompleted=6682786142238, DequeueBufferDuration=1747000, QueueBufferDuration=558000, 
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@59d2653
I/Choreographer: Skipped 43 frames!  The application may be doing too much work on its main thread.
I/OpenGLRenderer: Davey! duration=1349ms; Flags=1, IntendedVsync=6696440193831, Vsync=6697156860469, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=6697161516951, AnimationStart=6697161886847, PerformTraversalsStart=6697167379295, DrawStart=6697785118367, SyncQueued=6697787050242, SyncStart=6697787095138, IssueDrawCommandsStart=6697787213888, SwapBuffers=6697788715659, FrameCompleted=6697789927274, DequeueBufferDuration=234000, QueueBufferDuration=369000, 
I/Choreographer: Skipped 36 frames!  The application may be doing too much work on its main thread.
I/OpenGLRenderer: Davey! duration=706ms; Flags=0, IntendedVsync=6697175257488, Vsync=6697775257464, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=6697791469878, AnimationStart=6697792015660, PerformTraversalsStart=6697796764358, DrawStart=6697799629462, SyncQueued=6697870335147, SyncStart=6697870492438, IssueDrawCommandsStart=6697870630459, SwapBuffers=6697880858950, FrameCompleted=6697881997648, DequeueBufferDuration=1387000, QueueBufferDuration=335000, 
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@33a2212
I/Choreographer: Skipped 69 frames!  The application may be doing too much work on its main thread.
I/OpenGLRenderer: Davey! duration=1171ms; Flags=0, IntendedVsync=6727184245610, Vsync=6728334245564, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=6728342903651, AnimationStart=6728343322818, PerformTraversalsStart=6728345306932, DrawStart=6728347693599, SyncQueued=6728352799016, SyncStart=6728352863079, IssueDrawCommandsStart=6728353006933, SwapBuffers=6728354462194, FrameCompleted=6728355391413, DequeueBufferDuration=201000, QueueBufferDuration=305000, 
I/Choreographer: Skipped 62 frames!  The application may be doing too much work on its main thread.
I/OpenGLRenderer: Davey! duration=1188ms; Flags=0, IntendedVsync=6728350577491, Vsync=6729383910783, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=6729393570474, AnimationStart=6729393840162, PerformTraversalsStart=6729402373184, DrawStart=6729409425684, SyncQueued=6729524882467, SyncStart=6729525048717, IssueDrawCommandsStart=6729525249498, SwapBuffers=6729537952260, FrameCompleted=6729538967155, DequeueBufferDuration=1390000, QueueBufferDuration=321000, 
I/OpenGLRenderer: Davey! duration=1194ms; Flags=0, IntendedVsync=6728350577491, Vsync=6729383910783, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=6729393570474, AnimationStart=6729393840162, PerformTraversalsStart=6729402373184, DrawStart=6729541693041, SyncQueued=6729541931531, SyncStart=6729542078302, IssueDrawCommandsStart=6729542185854, SwapBuffers=6729543732521, FrameCompleted=6729544941896, DequeueBufferDuration=246000, QueueBufferDuration=383000,

Era isso?

Tente trocar o mkdir() por mkdirs().

staroski, já fiz isso, não muda nd… Eu não sei oq está acontecendo.

Quando passo o mouse pelo mkdir() diz assim “Result of File.mkdir() is ignored”, será que tem alguma coisa a ver? (Não sei se seria isso, pq quando tava criando a pasta, ele estava assim tbm)

Alguma luz, por favor!

image

brincadeiras a parte, vc fez os breakpoints nas linhas?

image

faz assim:

    if(!para.exists()){
      if(para.mkdir()){
        return "Criou!";
      } 
    } else {                
        return "já existe!";
    }

orochimaru, funcinou antes de vc falar! kkk q resenha

eu estava colocando o mkdirs() e tbm não estava fazendo nada, mas HOJE, AGORA, esta M… pegou! Isso existe?

Tanto assim:

File backupPasta = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/BACKUP_ESCOLA");

Como assim:

File backupPasta = new File(Environment.getExternalStorageDirectory()+ "/BACKUP_ESCOLA");

Pegou. Está assim:

try {
    if(!backupPasta.exists()){
        backupPasta.mkdir();
        return "Criou!";
    }
    else {
        return "já existe!";
    }
}
catch(Exception e){
    e.printStackTrace();
    return "falha";
}

Ontem esse bunito tava do msm jeito e agr pegou tanto com o mkdir() quando com o mkdirs(). Ah… eu quero saber esse mistério ¬¬

Sem falar que o problema começou com o FileOutputStream e o FileChannel que não estava funcionando, essa do mkdirs() e mkdir() foi depois. Se eles não funcionarem, eu posto aki! Obrigada a todos!

1 curtida

Olha aí! Esse código ta tirando onda…

2 Coisas:

1ª) Se eu colocar o:

    FileChannel dentro = new FileInputStream(de).getChannel();
    FileChannel fora = new FileOutputStream(para).getChannel();

Fora do IF ou ELSE, a avariável “de” dá essa emnsagem:

2ª) Então coloquei dentro do IF, blz, sem erros:

Só que ao rodar, ele até cria a pasta, mas no:

FileChannel fora = new FileOutputStream(para).getChannel();

Ele não roda, sai do try e vai pro catch();

A pasta está criando normalmente, mas voltei ao problema inicial, o:

FileChannel fora = new FileOutputStream(para).getChannel();

que não funciona. Algo trivial que não estou vendo ou sabendo implementar?

Obg.

Ah, blz, coloquei:

File arquivo = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/BACKUP_ESCOLA/"+"w");

e

FileChannel fora = new FileOutputStream(arquivo).getChannel();

Rodou! Ele criou a pasta e o arquivo kkk…

Mas uma dúvida, tem alguma forma de colocar o:

FileChannel dentro = new FileInputStream(de).getChannel();
FileChannel fora = new FileOutputStream(arquivo).getChannel();

Fora do IF ou ELSE sem dar problemas como os prints mostram? Tipo, minha intensão é de criar ou não a pasta e depois resolver a vida do arquivo com os FileChannel e FileOutputStream.

1 curtida