Fluxo de Dados Vs Queda de energia

6 respostas
ssousuke

e ai Pessoal, beleza???

a minha pergunta é relacionada a Fluxo de dados…
eu estou fazendo um jogo em java onde é imprescindível que o mesmo retorne exatamente do ponto onde estava caso haja a queda de luz…
na secao de testes eu fiz um programa teste e fazia o seguinte:
mandava gravar o arquivo e em seguida tirava o PC da tomada… e qdo retornava o arquivo estava corrompido (mesmo com mais ou menos 1 segundo de diferença entre o momento da gravacao e “tirar da tomada”)…
Ou seja quando vc manda gravar com o comando “output.writeInt(5);” por exemplo, o java passa dessa linha me retornando o controle mas na realidade o arquivo ainda nao foi gravado…
eu gostaria de saber se existe alguma maneira de se certificar que o arquivo foi gravado antes de continuar…

entao é isso, valeu

6 Respostas

louds

flush()

T
  • Não tire seu PC da tomada para testar. Basta apertar o botão de reset, ou então o que é melhor, use uma máquina virtual (como o VMWare ou o Microsoft Virtual PC, ou o QEMU) e teste o desligamento.
  • O melhor que você pode fazer é usar o “flush” mesmo. Isso lhe dá alguns segundos (que é o tempo que algum buffer do sistema operacional leva para ser gravado no disco, e o dado enviado ao disco seja efetivamente gravado em algum dos pratos de seu HD.)
ssousuke

eu escrevo e logo em seguida chamo o output.close()

e eu esperava que pelo menos em menos de um segundo o PC conseguisse efetivamente gravar o arquivo, mas parece que nao é isso que ocorre… Gostaria de saber se isso é proprio do Java ou é natural do computador mesmo…

T

chamando flush() (e close()) vc esta fazendo o possivel para que as informacoes sejam escritas… algumas vezes, porem, o SO pode atrasar a escrita (colocando em buffers para melhorar o desempenho) no FS…
em geral, chamando flush(), ateh o buffer da JVM eh esvaziado, como diz o javadoc

T

Entre seu programa e o disco físico existem as seguintes camadas de software:

  • BufferedWriter ou BufferedOutputStream, se você usou isso;
  • FileOutputStream ou FileWriter;
  • A API do Windows WriteFile;
  • A API do kernel do Windows ZwWriteFile;
  • O device driver que trata o filesystem NTFS;
  • O device driver que trata do sistema IDE, SATA ou SCSI;
    (Isso tudo no seu computador. Agora vamos para o seu disco:)
  • O firmware que recebe os dados que vieram do computador, via IDE, SATA ou SCSI;
  • O buffer do disco rígido;
  • Do buffer, os dados são escritos (ufa!)
    Você viu que para percorrer todas essas camadas deve levar um certo tempo :slight_smile:
ssousuke

eu observei o seguinte…
qdo mando gravar apenas um inteiro (pouca coisa) é bem rapido que grava no HD…
mas qdo grava muita coisa de uma vez, seja um arquivo “grande” (4Kb) ou varios arquivos q totalizam isso a gravacao demora pelo menos um segundo para efetivar-se…

entao pelo jeito nao jeito mesmo né?!?!?!?

se for feito em java nao importa utilizar java.io ou java.nio ou java.* pois existe um tempo de gravacao mesmo… qual outra possibilidade eu poderia utlizar??? usar c ou c++ ???

o q vcs acham???

Criado 4 de abril de 2006
Ultima resposta 4 de abr. de 2006
Respostas 6
Participantes 4