Olá galera, gostaria de saber qual é a melhor maneira para se criar um “banco de dados” que será armazenado em um arquivo. Neste arquivo ficará armazenado os dados dos usuários cadastrados. Por exemplo:
Será que apenas com as classes PrintWriter e BufferedReader eu consigo ler, modificar e adicionar qualquer registro (tupla: nome, senha, email) ao arquivo?
Sim. Só não creio (e não sei, se é possível) que a criptografia seja eficaz.
G
gabrielost
Seria um bkp :?:
Sim. Só não creio (e não sei, se é possível) que a criptografia seja eficaz.
bkp de backup? Creio que esteja mais para um banco de dados mesmo. Pois eu posso precisar ler as informações de um usuário cadastrado específico, assim como alterá-las.
Quanto a criptografia não tem problema, o que estou a fazer não é comercial e é bastante simples.
Não sei como estas classes que citei funcionam perfeitamente, mas creio que elas vão lendo o arquivo sequencialmente, linha por linha. Por esta perspectiva o que eu quero fazer é o seguinte:
Eu quero obter as informações do usuário lucas.sp
As linhas são lidas uma a uma até que “lucas.sp” é encontrado
Se esta linha foi encontrada então as duas seguintes correspondem as suas informações: senha e e-mail
Então leio as duas linhas seguintes e guardo suas informações em objetos String
Meu problema de verdade é com a ALTERAÇÃO dessas informações. Se eu quisesse alterar a senha do usuário lucas.sp de lucia123 para 123456, o procedimento anterior seria necessário para saber em qual linha está as informações deste usuário, mas como eu poderia alterar a linha “senha lucia123” para “senha 123456”? Será que é possível fazer isso utilizando a PrintWriter?
Dakon
Melhor forma é usar o banco de dados sqlite!
ul1sses
Cara, como você está trabalhando com arquivo é recomendado salvar cada registro como uma linha, por exemplo:
Etc…
A modo de separação dos dados ficaria a seu critério.
Consegue ver como é mais simples trabalhar assim, quando um registro corresponde à uma linha?
mauricioadl
tbm acho! um milhao de vezes mais simples!
jaboot
Concordo! E ainda acrescentaria que seria melhor se você trabalhasse como um banco de dados. Além de colocar tudo em uma linha, e ter um separador para cada “campo”, colocaria um número de registro, caso você queira acessar seus registros mais rapidamente. Tipo:00001;fernandoLC;201278;[email removido]
A gente tem que colaborar para a insanidade alheia!
ul1sses
Concordo! E ainda acrescentaria que seria melhor se você trabalhasse como um banco de dados. Além de colocar tudo em uma linha, e ter um separador para cada “campo”, colocaria um número de registro, caso você queira acessar seus registros mais rapidamente. Tipo:00001;fernandoLC;201278;[email removido]
A gente tem que colaborar para a insanidade alheia!
Se ele estiver trabalhando com apenas esse arquivo, não vai fazer diferença alguma ter ID.
E por que seria insanidade? Ele pode estar fazendo isso para algum trabalho, tarefa, exercício, estudo… sei lá… se não, realmente, seria recomendado fazer o que os colegas anteriormente indicaram.
PS: Não sei se você foi irônico ou não. rs
InicianteJavaHenriqu
Sim.
Você quer persistir os dados.
Se é para aprendizado, todas as dicas dos colegas lá em cima serve e são eficazes.
gabrielost:
Não sei como estas classes que citei funcionam perfeitamente, mas creio que elas vão lendo o arquivo sequencialmente, linha por linha. Por esta perspectiva o que eu quero fazer é o seguinte:
Eu quero obter as informações do usuário lucas.sp
As linhas são lidas uma a uma até que “lucas.sp” é encontrado
Se esta linha foi encontrada então as duas seguintes correspondem as suas informações: senha e e-mail
Então leio as duas linhas seguintes e guardo suas informações em objetos String
Meu problema de verdade é com a ALTERAÇÃO dessas informações. Se eu quisesse alterar a senha do usuário lucas.sp de lucia123 para 123456, o procedimento anterior seria necessário para saber em qual linha está as informações deste usuário, mas como eu poderia alterar a linha “senha lucia123” para “senha 123456”? Será que é possível fazer isso utilizando a PrintWriter?
Esta organização também pode ser feita com arquivo XML.
ul1sses
Você só tem que entender que não tem como alterar apenas uma linha no arquivo. Se você quiser alterar uma informação, terá que ler todo o arquivo, e salvar todo o arquivo novamente com a linha alterada.
jaboot
ul1sses:
Você só tem que entender que não tem como alterar apenas uma linha no arquivo. Se você quiser alterar uma informação, terá que ler todo o arquivo, e salvar todo o arquivo novamente com a linha alterada.
De forma alguma. Se ele colocar o código, ele varre o arquivo até encontrar esse código, altera a linha do arquivo, grava e sai. Não precisa varrer o resto, foi isso que eu quis dizer em colocar um código.
mauricioadl
acho que nao tem como fazer isso, que eu saiba nao tem como gravar no meio do arquivo. eu pelo menos desconheco como faz isso.
[]'s
ul1sses
Quem vai saber desse código se ele não tiver outra “tabela/arquivo” relacionada?
Outra coisa, ele está trabalhando com arquivo, se você for alterar um arquivo (não apenas salvar na última linha) é necessário ler todo ele e salvar todo ele. Não tem pra onde correr.
Resumidamente o que você vai pra alterar um registro é, por exemplo:
Ler linha por linha do arquivo, e enquanto não encontrar o registro, ir salvando as linhas em um StringBuffer por exemplo…
Ao encontrar a linha, alterar as informações que você deseja e incluir no StringBuffer.
Continuar lendo o resto do arquivo para dentro do StringBuffer até o final…
Salvar o resultado no arquivo…
Ataxexe
Concordo com meus colegas acima sobre o sqlite! Use sqlite e não irá se arrepender.
jaboot
Que vai ter que salvar todo o arquivo, vai. Isso eu concordo. Mas para toda ação que for feita, não é necessário fazer um full table scan (no caso, um full file scan), a não ser que seja o último registro do arquivo.
O legal aqui é pensar como um banco de dados mesmo.
Eu faria um esquema de índice, de acordo com a quantidade de linhas, pra varrer pelo menos metade do arquivo a cada ação.
jaboot
acho que nao tem como fazer isso, que eu saiba nao tem como gravar no meio do arquivo. eu pelo menos desconheco como faz isso.
[]'s Entendi o que você quis dizer. Será que não tem como pegar o número da linha e alterar só ela e gravar o arquivo todo?
heat
Utilize o sqlite para evitar um retrabalho descomunal, fora que você teria que levar em consideração coisas como concorrência lock e outras questões de banco de dados. A não ser que você esteja fazendo aula de estrutura de dados e esteja vendo organização de dados em memória secundária. Ai vai uma implementação na mão mesmo.
ul1sses
jaboot:
Que vai ter que salvar todo o arquivo, vai. Isso eu concordo. Mas para toda ação que for feita, não é necessário fazer um full table scan (no caso, um full file scan), a não ser que seja o último registro do arquivo.
O legal aqui é pensar como um banco de dados mesmo.
Eu faria um esquema de índice, de acordo com a quantidade de linhas, pra varrer pelo menos metade do arquivo a cada ação.
Criar um esquema de acordo com linhas é interessante quando você sabe o que tem nessa linha… Eu quero alterar o nome do Tio Chico, que linha ele se encontra? Se for um arquivo com 100 registros já fica chato.
Se for para pesquisa, realmente não precisa ler todo o arquivo. Quando achar o dado necessário, para ai.
Mas para alterar, tem que ler todo.
mauricioadl
que eu saiba nao!
a solucao eh muito simples.
1 - se ele for obrigado a usar arquivo.
use serializacao de objetos (assim ele coloca e tira um arraylist sem precisar percorrer o arquivo).
2 - se for obrigado a usar a arquivo e nao poder usar serializacao de objetos
percorra todo o arquivo manipule ele em memoria depois grava ele todo alterado
3 - se puder fazer da melhor forma use sqlite
[]'s
ul1sses
que eu saiba nao!
a solucao eh muito simples.
1 - se ele for obrigado a usar arquivo.
use serializacao de objetos (assim ele coloca e tira um arraylist sem precisar percorrer o arquivo).
2 - se for obrigado a usar a arquivo e nao poder usar serializacao de objetos
percorra todo o arquivo manipule ele em memoria depois grava ele todo alterado
3 - se puder fazer da melhor forma use sqlite
[]'s
Realmente, seria muito interessante usar serialização de objetos. Você só precisaria salvar e recuperar a lista do arquivo. Mas internamente, não tem pra onde correr… vai ser percorrido todo o arquivo.
Mas eu entendi seu ponto. Realmente iria abstrair bastante a rotina do rapaz.
Dakon
Ainda acho que não precisa reinventar a roda, usa SQLITE que é uma solução já consolidada, testada e amplamente utilizada. Mas se for apenas para estudo, como os colegadas falaram, tá valendo.
jaboot
Hhahahaha… eu fico pensando no COBOL. Os mainframes ainda funcionam até hoje (aqui onde trabalho tem um) e na maior parte das vezes são arquivos, percorridos por um programa em COBOL, com vários índices. E o pior é que o lance fica rápido, não tem como negar.
Mas a lógica é essa… o COBOL abre o arquivo (tabela), percorre ele (query) e te devolve o que quer, em uma String.
ul1sses
jaboot:
Hhahahaha… eu fico pensando no COBOL. Os mainframes ainda funcionam até hoje (aqui onde trabalho tem um) e na maior parte das vezes são arquivos, percorridos por um programa em COBOL, com vários índices. E o pior é que o lance fica rápido, não tem como negar.
Mas a lógica é essa… o COBOL abre o arquivo (tabela), percorre ele (query) e te devolve o que quer, em uma String.
Criar índices em um arquivo de texto lido pelo java não vai criar nenhuma melhora em desempenho. Vai?
A não ser que ele crie índices para cada informação (linha) e consiga fazer o java pular diretamente para essa posição sem ler o resto do arquivo. Tem como?
Esses arquivos do mainframe que você diz, são arquivos legíveis (puro texto) ?
A única coisa que eu já ouvi falar é que no COBOL teria como alterar um registro de um arquivo diretamente, sem ter que percorrer ele todo … pois ele tem um modo adicional de IO para tratar isso… esta correto isso?
E perdão, acho que comecei a fugir do assunto do tópico. Mas é a curiosidade que domina. rs
G
gabrielost
Galera, é que realmente estou sendo obrigado a trabalhar com arquivos. =D
Acho que vou fazer como alguns disseram, ler todo o arquivo, manipulá-lo na memória, e quando terminar as modificações, gravá-lo por completo no arquivo.
Obrigado pelas dicas galera. =D
Ataxexe
gabrielost:
Galera, é que realmente estou sendo obrigado a trabalhar com arquivos. =D
Acho que vou fazer como alguns disseram, ler todo o arquivo, manipulá-lo na memória, e quando terminar as modificações, gravá-lo por completo no arquivo.
Obrigado pelas dicas galera. =D
O sqlite trabalha justamente com arquivos. Claro que de uma forma muito diferente.