2012-12-22 4 views
0

Je ne sais pas si c'est possible et je suis très nouveau donc j'espère que certains d'entre vous peuvent faire la lumière là-dessus, j'ai une fonction qui lit tout le contenu d'un fichier txt puis imprime ceci dans une fenêtre de terminal, mais je veux être en mesure de stocker les données du fichier texte dans une variable afin que je puisse l'utiliser plus tard est-ce possibleComment utiliser une variable dans une boucle plus tard

Heres le bit snip de code:

String mText; 
     while((mText = br.readLine()) != null) { 
      //Displays the contents of the file in terminal 
      System.out.println(mText); 
     } 
Parce que je comprends une fois que la boucle finit le contenu de la variable mText dans ce cas est supprimé?

Ok parce que dans mon code ci-dessous, je veux imprimer sur une imprimante, le contenu de ce fichier mais quand je l'exécute, je peux afficher le contenu du fichier très bien, mais il ne vient jamais avec l'option de l'imprimante boîte, je pensais que ce serait le problème, il semble que c'est quelque chose d'autre dans mon code:

import java.awt.*; 
import java.awt.font.*; 
import java.awt.geom.*; 
import java.awt.print.*; 
import java.text.*; 
import java.io.*; 
import javax.swing.*; 

public class PrintText implements Printable { 
    private static String mText; 

    // Below the code will allow the user to select a file and then print out the contents of the file 
    public static void main(String[] args) throws IOException { 

     //selects the file 
     JFileChooser chooser = new JFileChooser(); 
     chooser.showOpenDialog(null); 
     File file = chooser.getSelectedFile(); 
     String filename = file.getName(); 
     //System.out.println("You have selected: " + filename); testing to see if file seleected was right 
     String path = file.getAbsolutePath(); 

     //Reads contents of file into terminal 
     //FileReader fr = new FileReader("filename"); 
     // FileReader fr = new FileReader("D:/Documents/" + "filename")); 

     FileReader fr = new FileReader(path); 
     BufferedReader br = new BufferedReader(fr); 
     String mText; 
     while((mText = br.readLine()) != null) { 
      //Displays the contents of the file in terminal 
      System.out.println(mText); 
     } 
     //fr.close(); 
    } 

    //private static final String mText = 
    // "This is a test to see if this text will be printed "; //This works perfectly fine 

    AttributedString mStyledText = new AttributedString(mText); 


    /** 
    * Print a single page containing some sample text. 
    */ 
    static public void printer(String args[]) { 
     /* Get the representation of the current printer and 
     * the current print job. 
     */ 
     PrinterJob printerJob = PrinterJob.getPrinterJob(); 
     /* Build a book containing pairs of page painters (Printables) 
     * and PageFormats. This example has a single page containing 
     * text. 
     */ 
     Book book = new Book(); 
     book.append(new PrintText(), new PageFormat()); 
     /* Set the object to be printed (the Book) into the PrinterJob. 
     * Doing this before bringing up the print dialog allows the 
     * print dialog to correctly display the page range to be printed 
     * and to dissallow any print settings not appropriate for the 
     * pages to be printed. 
     */ 
     printerJob.setPageable(book); 
     /* Show the print dialog to the user. This is an optional step 
     * and need not be done if the application wants to perform 
     * 'quiet' printing. If the user cancels the print dialog then false 
     * is returned. If true is returned we go ahead and print. 
     */ 
     boolean doPrint = printerJob.printDialog(); 
     if (doPrint) { 
      try { 
       printerJob.print(); 
      } catch (PrinterException exception) { 
       System.err.println("Printing error: " + exception); 
      } 
     } 
    } 

    /** 
    * Print a page of text. 
    */ 
    public int print(Graphics g, PageFormat format, int pageIndex) { 
     /* We'll assume that Jav2D is available. 
     */ 
     Graphics2D g2d = (Graphics2D) g; 
     /* Move the origin from the corner of the Paper to the corner 
     * of the imageable area. 
     */ 
     g2d.translate(format.getImageableX(), format.getImageableY()); 
     /* Set the text color. 
     */ 
     g2d.setPaint(Color.black); 
     /* Use a LineBreakMeasurer instance to break our text into 
     * lines that fit the imageable area of the page. 
     */ 
     Point2D.Float pen = new Point2D.Float(); 
     AttributedCharacterIterator charIterator = mStyledText.getIterator(); 
     LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext()); 
     float wrappingWidth = (float) format.getImageableWidth(); 
     while (measurer.getPosition() < charIterator.getEndIndex()) { 
      TextLayout layout = measurer.nextLayout(wrappingWidth); 
      pen.y += layout.getAscent(); 
      float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance()); 
      layout.draw(g2d, pen.x + dx, pen.y); 
      pen.y += layout.getDescent() + layout.getLeading(); 
     } 
     return Printable.PAGE_EXISTS; 
    } 
} 

Voici le code original que je l'ai fait, il imprime un pré tapé dans le texte du programme, i ont essayé d'ajouter le lecteur de fichier dans comme ci-dessus et maintenant il ne fonctionne pas

import java.awt.*; 
import java.awt.font.*; 
import java.awt.geom.*; 
import java.awt.print.*; 
import java.text.*; 
import java.io.*; 
import javax.swing.*; 
import java.util.List; 
import java.util.ArrayList; 

public class PrintText implements Printable { 
    /** private static String mText; 

    // Below the code will allow the user to select a file and then print out the contents of the file 
    public static void main(String[] args) throws IOException { 

     //selects the file 
     JFileChooser chooser = new JFileChooser(); 
     chooser.showOpenDialog(null); 
     File file = chooser.getSelectedFile(); 
     String filename = file.getName(); 
     //System.out.println("You have selected: " + filename); testing to see if file seleected was right 
     String path = file.getAbsolutePath(); 

     //Reads contents of file into terminal 
     //FileReader fr = new FileReader("filename"); 
     // FileReader fr = new FileReader("D:/Documents/" + "filename")); 

     FileReader fr = new FileReader(path); 
     BufferedReader br = new BufferedReader(fr); 
     List<String> list = new ArrayList<String>(); 
     while((mText = br.readLine()) != null) { 
      //Displays the contents of the file in terminal 
      System.out.println(mText); 
      list.add(mText); 
     } 
     //fr.close(); 
    } 
*/ 
    private static final String mText = 
     "This is a test to see if this text will be printed "; //This works perfectly fine 

    AttributedString mStyledText = new AttributedString(mText); 

    /** 
    * Print a single page containing some sample text. 
    */ 
    static public void main(String args[]) { 
     /* Get the representation of the current printer and 
     * the current print job. 
     */ 
     PrinterJob printerJob = PrinterJob.getPrinterJob(); 
     /* Build a book containing pairs of page painters (Printables) 
     * and PageFormats. This example has a single page containing 
     * text. 
     */ 
     Book book = new Book(); 
     book.append(new PrintText(), new PageFormat()); 
     /* Set the object to be printed (the Book) into the PrinterJob. 
     * Doing this before bringing up the print dialog allows the 
     * print dialog to correctly display the page range to be printed 
     * and to dissallow any print settings not appropriate for the 
     * pages to be printed. 
     */ 
     printerJob.setPageable(book); 
     /* Show the print dialog to the user. This is an optional step 
     * and need not be done if the application wants to perform 
     * 'quiet' printing. If the user cancels the print dialog then false 
     * is returned. If true is returned we go ahead and print. 
     */ 
     boolean doPrint = printerJob.printDialog(); 
     if (doPrint) { 
      try { 
       printerJob.print(); 
      } catch (PrinterException exception) { 
       System.err.println("Printing error: " + exception); 
      } 
     } 
    } 

    /** 
    * Print a page of text. 
    */ 
    public int print(Graphics g, PageFormat format, int pageIndex) { 
     /* We'll assume that Jav2D is available. 
     */ 
     Graphics2D g2d = (Graphics2D) g; 
     /* Move the origin from the corner of the Paper to the corner 
     * of the imageable area. 
     */ 
     g2d.translate(format.getImageableX(), format.getImageableY()); 
     /* Set the text color. 
     */ 
     g2d.setPaint(Color.black); 
     /* Use a LineBreakMeasurer instance to break our text into 
     * lines that fit the imageable area of the page. 
     */ 
     Point2D.Float pen = new Point2D.Float(); 
     AttributedCharacterIterator charIterator = mStyledText.getIterator(); 
     LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext()); 
     float wrappingWidth = (float) format.getImageableWidth(); 
     while (measurer.getPosition() < charIterator.getEndIndex()) { 
      TextLayout layout = measurer.nextLayout(wrappingWidth); 
      pen.y += layout.getAscent(); 
      float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance()); 
      layout.draw(g2d, pen.x + dx, pen.y); 
      pen.y += layout.getDescent() + layout.getLeading(); 
     } 
     return Printable.PAGE_EXISTS; 
    } 
} 
+3

Non, il ne fonctionne pas. Il a juste la dernière valeur que vous lui avez assignée. C'est juste que la dernière valeur est 'null'. –

+0

duplicata possible de [Ne peut trouver le symbole - variable mText] (http://stackoverflow.com/questions/14006348/cannot-find-symbol-variable-mtext) – Makoto

Répondre

2

que je comprends une fois que la boucle se termine le contenu de la variable mText dans ce cas est supprimé?

Si vous lisez plusieurs lignes à partir de votre fichier texte, toutes les écritures précédentes sont remplacées par les écritures suivantes. Ainsi, votre variable mText ne contiendra que la dernière ligne lue.

Si vous voulez que toutes vos lignes soient accessibles après la fin de la boucle, vous pouvez stocker ces lignes dans une collection.

Idéalement, vous pouvez créer un List<String> dans cette situation, et stocker vos données dans le: -

List<String> list = new ArrayList<String>(); 
while((mText = br.readLine()) != null) { 
     //Displays the contents of the file in terminal 
     System.out.println(mText); 
     list.add(mText); 
} 

maintenant en dehors de la boucle while, vous pouvez accéder à vos données de la liste.

+0

merci je viens d'essayer ceci mais je reçois cette erreur complier: tapez java.awt.list ne prend pas les paramètres – user1924104

+0

merci aussi pour votre description détaillée il m'a aidé à comprendre :) – user1924104

+0

@ user1924104 .. C'est 'java.util.List'. Vous avez importé la mauvaise interface. –

0

Non. La variable est définie dans la portée de la méthode; sa valeur est donc disponible n'importe où dans la méthode après sa déclaration et sa valeur. Cependant, le code que vous avez n'a peut-être pas assigné de valeur à la variable car readline() peut lancer une exception IOException, donc vous ne pourrez pas utiliser la variable après cette boucle - vous obtiendrez un " variable de non-affectation "erreur de compilation". Pour résoudre ce problème, initialiser la variable lorsque vous déclarez:

String mText = null; 
0

Si vous voulez garder toutes les lignes, vous devez les stocker par exemple ainsi:

StringBuilder sb= new StringBuilder(); 
    String mText; 
    while ((mText = br.readLine()) != null) { 
     //Displays the contents of the file in terminal 
     System.out.println(mText); 
     sb.append(mText).append('\n'); 
    } 
    // now the whole content of the BufferedReader is stored in sb. 
+0

Merci beaucoup :) – user1924104

Questions connexes