2017-10-14 12 views
0

Je cherche un moyen simple d'ouvrir un fichier .txt, modifier et lire en temps réel les modifications appliquées à ce sujet. J'ai créé un panneau de connexion, avec deux JTextField où l'utilisateur insère ID/passe.Quelle est la manière la plus simple d'ouvrir, de modifier et de lire les modifications sur un fichier .txt en Java?

Je veux mettre en œuvre une méthode de changement de mot de passe , donc je dois ouvrir le fichier .txt, supprimez l'ancien mot de passe et d'écrire le nouveau (ou remplacer). Ensuite, je dois lire à nouveau le fichier pour mettre à jour le mot de passe.

C'est le code du panneau:

import static java.awt.Color.WHITE; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import linteati_ced.GUI.frame.MainFrame; 
import linteati_ced.HotArea; 
import static linteati_ced.utils.Constants.*; 
import linteati_ced.utils.Resources; 

public class LoginPanel extends JPanel { 

    private MainFrame mf; 

    private BufferedImage background; 

    private FileReader file; 
    private BufferedReader reader; 

    private JTextField userArea, passwordArea; 
    private String user, password; 

    private HotArea confirm; 
    private HotArea exit; 
    private String message; 

    private Thread dialogue; 
    private String code; 

    public LoginPanel(MainFrame mainFrame) throws FileNotFoundException, IOException { 
     this.setSize(PANEL_X, PANEL_Y); 
     this.setLayout(null); 

     this.mf = mainFrame; 

     this.background = Resources.getImage(BACKGROUND_LOGIN); 
     this.message = DEFAULT_MESSAGE; 

     this.confirm = new HotArea(1178, 922, 60, 60); 
     this.exit = new HotArea(1178, 25, 60, 60); 

     this.file = new FileReader(Resources.extract(LOGIN)); 
     this.reader = new BufferedReader(file); 

     this.userArea = new JTextField(""); 
     this.userArea.setBounds(600, 460, 200, 30); 
     this.userArea.setFont(new Font("Arial", 0, 24)); 
     this.passwordArea = new JTextField(""); 
     this.passwordArea.setBounds(600, 550, 200, 30); 
     this.passwordArea.setFont(new Font("Arial", 0, 24)); 

     this.add(this.userArea); 
     this.add(this.passwordArea); 

     try { 
      this.user = reader.readLine(); 
      this.password = reader.readLine(); 
      this.code = reader.readLine(); 
      System.err.println(this.user); 
      System.err.println(this.password); 
     } catch (IOException ex) { 
     } 

     file.close(); 

     this.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mousePressed(MouseEvent e) { 

       if (confirm.isClicked(e)) { 
        if (user.equals(userArea.getText()) && password.equals(passwordArea.getText())) { 
         mf.log_in(); 
        } else { 
         System.out.println("Error"); 
         message = ERROR_MESSAGE; 
         dialogue = new Thread(new MessageDialogue()); 
         dialogue.start(); 
         repaint(); 
        } 
       } 

       if (exit.isClicked(e)) { 
        System.exit(0); 
       } 
      } 
     }); 
    } 

    public String getCode() { 
     return this.code; 
    } 

    public void resetTextField() { 
     this.userArea.setText(""); 
     this.passwordArea.setText(""); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     g.drawImage(background, 0, 0, null); 
     g.setColor(WHITE); 
     g.setFont(new Font("Arial", 0, 22)); 
     g.drawString(message, 560, 660); 
    } 

    private class MessageDialogue implements Runnable { 

     @Override 
     public void run() { 
      try { 
       Thread.sleep(1500); 
      } catch (InterruptedException ex) { 
      } 
      message = DEFAULT_MESSAGE; 
      repaint(); 
     } 

    } 

} 

Ce sont le contenu du fichier.txt: utilisateur mot de passe

+0

Si vous modifiez un fichier, vous n'avez pas besoin de le relire. Vous connaissez déjà les modifications. Aussi, il n'y a vraiment rien de tel que de modifier un fichier.Vous pouvez y ajouter ou vous pouvez l'écraser complètement. – Kayaman

+0

@Kayaman il est possible d'écraser des parties d'un fichier sans avoir à le remplacer complètement. Il n'est tout simplement pas possible de supprimer ou d'insérer des données, mais seulement de les modifier. – puhlen

+0

Dans le fichier.txt j'ai 2 mots: un pour l'id de l'utilisateur, un pour le mot de passe de l'utilisateur. Je dois supprimer/écraser la deuxième ligne avec le nouveau mot de passe. –

Répondre

0

Lorsque nous lisons notre dossier, nous utilisons généralement chaîne pour stocker le contenu de un fichier, mais le problème est les chaînes sont immuables qui ne peuvent pas être modifiées, mais ce que vous voulez faire pourrait être fait de cette manière:

  1. Lorsque w Riting votre mot de passe dans un fichier essayer de l'écrire dans un autre pour l'amour de la simplicité .
  2. lire ensuite que le contenu et le stocker dans une variable de chaîne.

  3. Utilisez méthode replace pour le changer.

  4. puis réécrire cette chaîne modifiée sur votre fichier.

+0

Et si le jargon ci-dessus n'est pas utile, n'hésitez pas à demander un exemple de code. –

+0

Oui excellent point ... c'est pourquoi les bases de données sont une bénédiction, mais si vous voulez stocker chaque utilisateur dans un seul fichier, vous devez utiliser une condition par exemple, lire le fichier jusqu'à ce que le nom d'utilisateur spécifique est atteint ... cela pourrait fait en utilisant la méthode hasNext() du scanner, et une condition if qui utilise la méthode contains() de la classe String. –

+0

vous venez de supprimer votre commentaire -_- –

0

Une façon de le faire est de lire la ligne de texte à partir du fichier et, puisque vous utilisez la délimitation de l'espace, diviser la chaîne en un tableau à l'aide string.split(" "). Mettez à jour le mot de passe dans string[1], reformatez la chaîne en username password et écrivez-la dans le fichier en utilisant FileOutputString (..., false) pour écraser le contenu.

Si vous avez prévu de quitter le fichier ouvert pour des mises à jour périodiques, au besoin, vous pouvez utiliser un RandomAccessFile qui maintient un pointeur vers la dernière seek et remplacer simplement le mot de passe à l'aide ' ' pour masquer les caractères précédents sont laissés derrière le mot de passe précédent.

De toute façon, voici ma suggestion, mais, comme d'autres l'ont déjà signalé, pour des raisons de sécurité et de facilité d'entretien, l'utilisation d'une base de données est beaucoup plus facile. Là où je travaillais, j'avais accès à une telle base de données et on m'a récemment demandé de crypter les mots de passe dans la table. Cela peut être un désir de votre part en utilisant la cryptographie.

0

Dans votre contexte:

Path path = Paths.get("... .txt"); 
List<String> = Files.readAllLines(path, StandardCharsets.UTF_8); 
user = lines.get(0); 
password = lines.get(1); 
code = lines.get(2); 

List<String> lines = new LinkedList<>(); 
Collections.addAll(lines, user, password, code); 
Files.write(path, lines, StandardCharsets.UTF_8); 

Vous pouvez également utiliser .properties avec des paires clé = valeur, avec une variante sous forme XML.

Si vous pensez à changer plus tard votre logiciel avec un nouveau format, peut-être un numéro de version dans les données serait bien aussi.