首页 > 解决方案 > 程序卡说明中显示的换行符

问题描述

我正在使用 Java 为一个班级项目创建一个塔罗牌读卡器。它从文本文件中读取信息。奇怪的是,当我运行程序时,换行符会打印出来,而不是实际创建一个新行。

这是代码:

public class TarotDAO {
    public static ArrayList < TarotCard > getAll() {
        ArrayList < TarotCard > cardList = new ArrayList < > ();

        //Create something to read from the file
        Path thePath = Paths.get("cars.txt");
        File theFile = thePath.toFile();
        try (
            BufferedReader reader = new BufferedReader(
                new FileReader(theFile))
        ) {
            //read each line of the file
            String curLine = reader.readLine();
            System.out.println(curLine);

            while (curLine != null) {
                String[] temp = curLine.split(">");

                //---create a new object with the values from the array
                //add object to results
                String id = temp[0];
                String name = temp[1];
                String upright = temp[2];
                String reverse = temp[3];
                TarotCard card = new TarotCard(id, name, upright, reverse);
                cardList.add(card);

                //...or as a 1-liner
                //results.add(new ExpenseReport(temp[0], Double.parseDouble(temp[1])));

                //get the next line from the file
                curLine = reader.readLine();
            }
            return cardList;

        } catch (FileNotFoundException e) {
            System.err.println("File not found");
        } catch (IOException e) {}
        return cardList;
    }

}

package Business;

public class TarotCard 
{
    protected String name;
    protected String identifier;
    protected String upright;
    protected String reverse;

    public TarotCard (String identifier, String name, String upright, String reverse)
    {
        this.identifier = identifier;
        this.name = name;
        this.upright = upright;
        this.reverse = reverse;
    }

    public TarotCard()
    {

    }

    public String getName() 
    {
        return name;
    }

    public void setName(String name) 
    {
        this.name = name;
    }

    public String getIdentifier() 
    {
        return identifier;
    }

    public void setIdentifier(String identifier) 
    {
        this.identifier = identifier;
    }

    public String getUpright() 
    {
        return upright;
    }

    public void setUpright(String upright) 
    {
        this.upright = upright;
    }

    public String getReverse() 
    {
        return reverse;
    }

    public void setReverse(String reverse) 
    {
        this.reverse = reverse;
    }

    public String getImage()
    {
        String image = identifier + ".jpg";
        return image;
    }

    public String toString()
    {
        String result = "";
        result += this.getName() + "\n\n";
        result += this.getUpright() + "\n\n";
        result += this.getReverse();
        return result;
    }
}

这是打印所有内容的代码:

    package Application;

    import Business.TarotCard;
    import Controller.TarotDAO;
    import java.util.ArrayList;
    import java.util.Collections;
    import javax.swing.JOptionPane;
    import static javax.swing.JOptionPane.WARNING_MESSAGE;

    public class Reading extends javax.swing.JDialog 
    {

    public Reading(java.awt.Frame parent, boolean modal) 
    {
        super(parent, modal);
        initComponents();

    }

    /**
     * This method is called from within the constructor to initialize the 
    form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        cbSpread = new javax.swing.JComboBox<>();
        lblGenLove1 = new javax.swing.JLabel();
        lblGenLove2 = new javax.swing.JLabel();
        lblGenLove3 = new javax.swing.JLabel();
        lblGenLove4 = new javax.swing.JLabel();
        lbl3Card3 = new javax.swing.JLabel();
        lbl3Card1 = new javax.swing.JLabel();
        lbl3Card2 = new javax.swing.JLabel();
        chkInclRev = new javax.swing.JCheckBox();
        btnSave = new javax.swing.JButton();
        btnDeal = new javax.swing.JButton();
        btnShuffle = new javax.swing.JButton();
        cbDeck = new javax.swing.JComboBox<>();
        jScrollPane2 = new javax.swing.JScrollPane();
        taResult = new javax.swing.JTextArea();
        lblBackground = new javax.swing.JLabel();


    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Reader");
        setMinimumSize(new java.awt.Dimension(1143, 835));
        setModal(true);
        setResizable(false);
        setSize(new java.awt.Dimension(1130, 800));
        getContentPane().setLayout(null);

        cbSpread.setBackground(new java.awt.Color(136, 54, 25));
        cbSpread.setFont(new java.awt.Font("Felix Titling", 0, 12)); // 
        NOI18N
        cbSpread.setForeground(new java.awt.Color(204, 255, 204));
        cbSpread.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] 
    { "Select Spread", "3 Card", "General Love Reading" }));
        getContentPane().add(cbSpread);
        cbSpread.setBounds(820, 20, 190, 30);

        lblGenLove1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblGenLove1MouseClicked(evt);
            }
        });
        getContentPane().add(lblGenLove1);
        lblGenLove1.setBounds(20, 70, 240, 400);

        lblGenLove2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblGenLove2MouseClicked(evt);
            }
        });
        getContentPane().add(lblGenLove2);
        lblGenLove2.setBounds(300, 120, 240, 400);

        lblGenLove3.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblGenLove3MouseClicked(evt);
            }
        });
        getContentPane().add(lblGenLove3);
        lblGenLove3.setBounds(570, 120, 240, 400);

        lblGenLove4.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblGenLove4MouseClicked(evt);
            }
        });
        getContentPane().add(lblGenLove4);
        lblGenLove4.setBounds(850, 80, 240, 400);

        lbl3Card3.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lbl3Card3MouseClicked(evt);
            }
        });
        getContentPane().add(lbl3Card3);
        lbl3Card3.setBounds(840, 100, 240, 400);

        lbl3Card1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lbl3Card1MouseClicked(evt);
            }
        });
        getContentPane().add(lbl3Card1);
        lbl3Card1.setBounds(50, 100, 240, 400);

        lbl3Card2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lbl3Card2MouseClicked(evt);
            }
        });
        getContentPane().add(lbl3Card2);
        lbl3Card2.setBounds(450, 100, 240, 400);

        chkInclRev.setBackground(new java.awt.Color(117, 47, 24));
        chkInclRev.setFont(new java.awt.Font("Felix Titling", 0, 12)); // 
        NOI18N
        chkInclRev.setForeground(new java.awt.Color(204, 255, 204));
        chkInclRev.setText("Include Reversals?");
        getContentPane().add(chkInclRev);
        chkInclRev.setBounds(580, 20, 160, 30);

        btnSave.setBackground(new java.awt.Color(117, 47, 24));
        btnSave.setFont(new java.awt.Font("Felix Titling", 0, 12)); // NOI18N
        btnSave.setForeground(new java.awt.Color(51, 0, 51));
        btnSave.setText("Save");
        getContentPane().add(btnSave);
        btnSave.setBounds(1030, 20, 80, 31);

        btnDeal.setBackground(new java.awt.Color(117, 47, 24));
        btnDeal.setFont(new java.awt.Font("Felix Titling", 0, 12)); // NOI18N
        btnDeal.setForeground(new java.awt.Color(51, 0, 51));
        btnDeal.setText("Deal Cards");
        btnDeal.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDealActionPerformed(evt);
            }
        });
        getContentPane().add(btnDeal);
        btnDeal.setBounds(410, 20, 150, 31);

        btnShuffle.setBackground(new java.awt.Color(117, 47, 24));
        btnShuffle.setFont(new java.awt.Font("Felix Titling", 0, 12)); // 
        NOI18N
        btnShuffle.setForeground(new java.awt.Color(51, 0, 51));
        btnShuffle.setText("Shuffle Deck");
        btnShuffle.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnShuffleActionPerformed(evt);
            }
        });
        getContentPane().add(btnShuffle);
        btnShuffle.setBounds(240, 20, 150, 31);

        cbDeck.setBackground(new java.awt.Color(136, 54, 25));
        cbDeck.setFont(new java.awt.Font("Felix Titling", 0, 12)); // NOI18N
        cbDeck.setForeground(new java.awt.Color(204, 255, 204));
        cbDeck.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { 
    "Select Deck", "Rider-Waite" }));
        cbDeck.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbDeckActionPerformed(evt);
            }
        });
        getContentPane().add(cbDeck);
        cbDeck.setBounds(20, 20, 200, 30);

        taResult.setEditable(false);
        taResult.setBackground(new java.awt.Color(51, 0, 51));
        taResult.setColumns(20);
        taResult.setFont(new java.awt.Font("Footlight MT Light", 0, 18)); // 
        NOI18N
        taResult.setForeground(new java.awt.Color(204, 255, 204));
        taResult.setLineWrap(true);
        taResult.setRows(5);
        taResult.setAutoscrolls(false);
        jScrollPane2.setViewportView(taResult);

        getContentPane().add(jScrollPane2);
        jScrollPane2.setBounds(10, 550, 1110, 240);

        lblBackground.setIcon(new 


   javax.swing.ImageIcon(getClass().getResource("/Business/Background/Magick- 
     Background2.png"))); // NOI18N
        getContentPane().add(lblBackground);
        lblBackground.setBounds(0, 0, 1132, 800);

        pack();
        setLocationRelativeTo(null);
    }// </editor-fold>                        

    private void cbDeckActionPerformed(java.awt.event.ActionEvent evt) {                                       
        String deckSelect = (String) cbDeck.getSelectedItem();

    }                                      

    private void btnShuffleActionPerformed(java.awt.event.ActionEvent evt) {                                           
        if (cbDeck.getSelectedItem().toString().equalsIgnoreCase("Select Deck"))
        {
            JOptionPane.showMessageDialog(this, "Select a deck before shuffling.", "WARNING", WARNING_MESSAGE);
        }
        else
        {
            if (cbDeck.getSelectedItem().toString().equalsIgnoreCase("Rider-Waite"))
            {
                cardList = TarotDAO.getAll();
                Collections.shuffle(cardList);
            }
        }
    }                                          

    private void btnDealActionPerformed(java.awt.event.ActionEvent evt) {                                        
        if (cbDeck.getSelectedItem().toString().equalsIgnoreCase("Select Deck"))
        {
            JOptionPane.showMessageDialog(this, "Select a deck before dealing.", "WARNING", WARNING_MESSAGE);
        }
        else if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("Select Spread"))
        {
            JOptionPane.showMessageDialog(this, "Select a spread before dealing.", "WARNING", WARNING_MESSAGE);
        }
        else
        {
            if (cbDeck.getSelectedItem().toString().equalsIgnoreCase("Rider-Waite"))
            {
                if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("3 Card"))
                {   
                    lblGenLove1.setVisible(false);
                    lblGenLove1.setVisible(false);
                    lblGenLove1.setVisible(false);
                    lblGenLove1.setVisible(false);
                    lbl3Card1.setVisible(true);
                    lbl3Card2.setVisible(true);
                    lbl3Card3.setVisible(true);
                    card1 = cardList.get(0);
                    card2 = cardList.get(1);
                    card3 = cardList.get(2);
                    lbl3Card1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/Back.jpg")));
                    lbl3Card2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/Back.jpg")));
                    lbl3Card3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/Back.jpg")));
                }
                else if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("General Love Reading"))
                {
                    lbl3Card1.setVisible(false);
                    lbl3Card2.setVisible(false);
                    lbl3Card3.setVisible(false);
                    lblGenLove1.setVisible(true);
                    lblGenLove1.setVisible(true);
                    lblGenLove1.setVisible(true);
                    lblGenLove1.setVisible(true);
                    card1 = cardList.get(0);
                    card2 = cardList.get(1);
                    card3 = cardList.get(2);
                    card4 = cardList.get(3);
                    lblGenLove1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/Back.jpg")));
                    lblGenLove2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/Back.jpg")));
                    lblGenLove3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/Back.jpg")));
                    lblGenLove4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/Back.jpg")));
                }
            }
        }
    }                                       

    private void lbl3Card1MouseClicked(java.awt.event.MouseEvent evt) {                                       
        if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("3 Card"))
        {
            String cardImage1 = card1.getImage();
            lbl3Card1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/" + cardImage1)));
            taResult.setText("This card is about your past:\n\n" + card1.getUpright());
        }
    }                                      

    private void lbl3Card2MouseClicked(java.awt.event.MouseEvent evt) {                                       
        if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("3 Card"))
        {
            String cardImage2 = card2.getImage();
            lbl3Card2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/" + cardImage2)));
            taResult.setText("This card is about your present:\n\n" + card2.getUpright());
        }
    }                                      

    private void lbl3Card3MouseClicked(java.awt.event.MouseEvent evt) {                                       
        if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("3 Card"))
        {
            String cardImage3 = card3.getImage();
            lbl3Card3.setIcon(new 
    javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/" + 
    cardImage3)));
            taResult.setText("This card is about your future:\n\n" + card3.getUpright());
        }
    }                                      

    private void lblGenLove4MouseClicked(java.awt.event.MouseEvent evt) {                                         
        if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("General Love Reading"))
        {
            String cardImage4 = card4.getImage();
            lblGenLove4.setIcon(new 
    javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/" + 
    cardImage4)));
            taResult.setText("This card is general glimpse of your future:\n\n" + card4.getUpright());
        }
    }                                        

    private void lblGenLove3MouseClicked(java.awt.event.MouseEvent evt) {                                         
        if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("General Love Reading"))
        {
            String cardImage3 = card3.getImage();
            lblGenLove3.setIcon(new 
    javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/" + cardImage3)));
            taResult.setText("This card tells you how to prepare yourself:\n\n" + card3.getUpright());
        }
    }                                        

    private void lblGenLove2MouseClicked(java.awt.event.MouseEvent evt) {                                         
        if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("General Love Reading"))
        {
            String cardImage2 = card2.getImage();
            lblGenLove2.setIcon(new 
    javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/" + cardImage2)));
            taResult.setText("This card advises of a positive omen to look for:\n\n" + card2.getUpright());
        }
    }                                        

    private void lblGenLove1MouseClicked(java.awt.event.MouseEvent evt) {                                         
        if (cbSpread.getSelectedItem().toString().equalsIgnoreCase("General Love Reading"))
        {
            String cardImage1 = card1.getImage();
            lblGenLove1.setIcon(new 
     javax.swing.ImageIcon(getClass().getResource("/Business/RWImages/" + cardImage1)));
            taResult.setText("This card is general glimpse of your future:\n\n" + card1.getUpright());
        }
    }                                        
    ArrayList <TarotCard> cardList;
    TarotCard card1;
    TarotCard card2;
    TarotCard card3;
    TarotCard card4;
    // Variables declaration - do not modify                     
    private javax.swing.JButton btnDeal;
    private javax.swing.JButton btnSave;
    private javax.swing.JButton btnShuffle;
    private javax.swing.JComboBox<String> cbDeck;
    private javax.swing.JComboBox<String> cbSpread;
    private javax.swing.JCheckBox chkInclRev;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JLabel lbl3Card1;
    private javax.swing.JLabel lbl3Card2;
    private javax.swing.JLabel lbl3Card3;
    private javax.swing.JLabel lblBackground;
    private javax.swing.JLabel lblGenLove1;
    private javax.swing.JLabel lblGenLove2;
    private javax.swing.JLabel lblGenLove3;
    private javax.swing.JLabel lblGenLove4;
    private javax.swing.JTextArea taResult;
    // End of variables declaration                   
}

这是输出的示例:

Upright Nine of Swords Meaning\n\nThe Nine of Swords is often associated with fear and anxiety, 
about all the things that worry you and keep you up at night. Sometimes this card can be associated 
with trauma - one which may be shameful for you to confide with others about, and all the 
psychological responses that come from experiencing that trauma.\n\nWhen we are never released from 
the entrapment depicted in the Eight of Swords, we escalate into the Nine of Swords, where we are 
plagued by nightmares.

这是我正在调用的一些文本文件的样子:

0MA>愚者>直立愚者含义\n\n愚者牌编号为0,被认为是一个无限潜力的数字。把他当作一张白纸,因为愚者还没有形成清晰的个性。他是我纯真的象征——他即将到来的旅程将塑造他的性格。\n\n看到愚者通常意味着新旅程的开始,你将充满乐观和自由,摆脱通常的束缚生活。当我们见到他时,他每天都以一种近乎幼稚的方式冒险。他相信生活中任何事情都有可能发生,世界上有许多机会等待探索和发展。他过着简单的生活,没有后顾之忧,并且似乎并不因为他不知道他会遇到什么而感到困扰。\n\n在阅读中见到他也可以看作是对你自己性格中冒险部分的召唤。他激发勇气,因为他每天都明白
是一个在你的生活中开辟新领域的机会,随之而来的是期待、惊奇、敬畏和好奇的混合。愚人在那里表明...

我也尝试过 CRLF,但也没有用。我已经尝试过让它读取两个分隔符,但不幸的是也没有工作。我是 Java 新手,仍在学习,因此我们将不胜感激。

标签: javaarraylistnewlinebufferedreaderreadline

解决方案


您的输出包含 \n,因为您的输入字面上包含 \n。你看到的那个字符组合不是换行符,而是一个斜线后面跟着一个 n,所以如果它在你的输入中,你会在输出中看到它,这并不令人震惊。

转义字符仅适用于字符串文字,即当您创建这样的字符串对象时:

String foo = "I need a newline on the end of this line.\n";

如果 you print(foo),您将获得指定的文本,后跟换行符。

如果您读取包含 \n 的文件,那不是换行符。换行符是非打印字符。

解决方案:在输入的每一行末尾,按回车键而不是输入 \n。

另一种解决方案:如果您坚持在输入文件中保留 \n 字符组合,则需要在使用输入之前处理该行以摆脱它们。

curLine = curLine.replaceAll("\\n", "");

请注意,我已经转义了反斜杠,因为我们在这里使用了正则表达式,否则,正则表达式将寻找换行符,而不是 \n。

如果您只想在输出中使用换行符,只需使用打印它System.out.println();或使用+ "\n". 你没有包括你打印东西的部分,所以我不知道你实际上在做什么。


推荐阅读