2012-06-29 1 views
1

Ce n'est pas que mon code ne fonctionne pas, mais je doute que ce soit très efficace ou non. Ma théorie est, que ce n'est pas xDPlus de manière efficace de choisir une partie une chaîne de JTextPane?

J'ai un JTextPane où je dois prendre le texte dedans (Faire une nouvelle ligne chaque fois que le JTextPane a une nouvelle ligne), et le mettre dans un fichier .txt fichier. Comme je l'ai dit tout fonctionne mais je doute de la mise en œuvre de celui-ci. C'est la partie que je suis doutant:

public void printLog() { 
    String s = logTextArea.getText(); 
    ArrayList<String> log = new ArrayList<>(); 
    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < s.length(); i++) { 
     if(s.charAt(i) != '\n') { 
      sb.append(s.charAt(i)); 
     } else { 
      log.add(sb.toString()); 
      sb.delete(0, sb.length()); 
     } 
    } 

C'est la chose entière juste pour la référence:

public void printLog() { 
    String s = logTextArea.getText(); 
    ArrayList<String> log = new ArrayList<>(); 
    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < s.length(); i++) { 
     if(s.charAt(i) != '\n') { 
      sb.append(s.charAt(i)); 
     } else { 
      log.add(sb.toString()); 
      sb.delete(0, sb.length()); 
     } 
    } 
    File f = new File("JServer_Log.txt"); 
    BufferedWriter bw = null; 
    FileWriter fr = null; 
    try { 
     if(f.exists()) { 
      fr = new FileWriter(f,true); 
     } else { 
      fr = new FileWriter(f); 
     } 
    } catch (IOException e) { 
     // Nothing to do really. 
    } 

    try { 
     bw = new BufferedWriter(fr); 
     Iterator<String> itr = log.iterator(); 
     bw.newLine(); 
     while(itr.hasNext()) { 
      bw.write(itr.next()); 
      bw.newLine(); 
     } 
    } catch (IOException e) { 
     // Nothing to do really. We lost the log? 
    } finally { 
     try { 
      bw.close(); 
     } catch(IOException ioe) { 
      // The program is closing any way. 
     } 
    } 
} 

Répondre

2

Il semble que vous devez juste vous assurer que vous utilisez la séquence de retour à la ligne appropriée de la plate-forme. Vous pouvez simplement dire s = s.replace("\n", System.getProperty("line.separator")) puis écrire toute la chaîne directement dans le fichier. En fait, la façon dont je le vois, cela est tout le code dont vous avez besoin (sauf peut-être pour la gestion des exceptions, à vous):

public void printLog() throws IOException { 
    final FileWriter w = new FileWriter("JServer_Log.txt", true); 
    try { 
    w.write(logTextArea.getText().replace("\n", 
            System.getProperty("line.separator"))); 
    } finally { w.close(); } 
} 
+0

Merci. Regarde plus élégant si quelque chose au moins xD – OmniOwl

2

Pour plus d'informations, le premier code peut être remplacé par:

List<String> log = Arrays.asList(logTextArea.getText().split("\n")); 

mais d'autres réponses vous donnent un moyen de remplacer la méthode entière.

0

utilisation split:

String[] log = s.split("\n"); 
2

Pourquoi prendre la peine, d'utiliser JTextComponents.write(Writer out) throws IOExceptionwrite() cela est assez accepte newline, onglets, E.I qui vient de l'OS natif

+0

Je n'utilise pas un JTextArea. J'utilise un JTextPane. – OmniOwl

+0

De plus, un 'Writer' gère l'encodage du texte, mais pas les sauts de ligne, autant que je sache. C'est pourquoi nous devons utiliser les méthodes '... Line'. –

+0

@both a modifié JTextArea en JTextComponent, avez-vous essayé, à la fois read() et write() pour prendre/ajouter String de/to Document (modèle pour JTextComponents) – mKorbel

Questions connexes