Fluxo de Dados Vs Queda de energia  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
ssousuke
Thread.start()

Membro desde: 04/04/2006 11:33:53
Mensagens: 28
Offline

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
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

flush()

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

- 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.)
[WWW]
ssousuke
Thread.start()

Membro desde: 04/04/2006 11:33:53
Mensagens: 28
Offline

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.....
takeshi10
Java Ninja

Membro desde: 08/08/2004 23:05:25
Mensagens: 254
Localização: Brasil
Offline

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


If the intended destination of this stream is an abstraction provided by the underlying operating system, for example a file, then flushing the stream guarantees only that bytes previously written to the stream are passed to the operating system for writing; it does not guarantee that they are actually written to a physical device such as a disk drive.

takeshi
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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
[WWW]
ssousuke
Thread.start()

Membro desde: 04/04/2006 11:33:53
Mensagens: 28
Offline

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???
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team