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…
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
takeshi10
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
thingol
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
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++ ???