在文本文件中逐行显示单词

时间:2014-05-26 11:40:15

标签: java swing user-interface jfilechooser filewriter

JButton btnExport = new JButton("Export");
        btnExport.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {     

                JFileChooser saver = new JFileChooser("");      
                int returnVal = saver.showSaveDialog(null);
                File file = saver.getSelectedFile();   
                 BufferedWriter writer = null; 
                if (returnVal == JFileChooser.APPROVE_OPTION) 
                 {  
                    try  
                    {  

                    writer = new BufferedWriter( new FileWriter( file.getAbsolutePath().toString() + "\n")); 
                    writer.write( jTextArea1.getText());         
                    writer.newLine();
                    writer.flush();
                    writer.close( );  
                    JOptionPane.showMessageDialog(null, "The Text was Saved Successfully!",  
                                "Success!", JOptionPane.INFORMATION_MESSAGE);  
                    }  
                    catch (Exception e)  
                    {  
                    JOptionPane.showMessageDialog(null, "The Text could not be Saved!",  
                                "Error!", JOptionPane.INFORMATION_MESSAGE);  
                    }  
                }   
        }});   

我尝试了几个代码但是当我逐行输入textarea并尝试将其保存在文本文件中时,它仍然是一行。谁能帮我?我希望文本在我的文本文件中逐行显示。谢谢

3 个答案:

答案 0 :(得分:3)

我还没有尝试过,但我会先看看是否:

jTextArea1.write(writer);

根据这里的javadocs提供所需的文件输出:

http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html#write(java.io.Writer)

如果 没有正确使用与JTextArea相同的换行符,那么您可以使用强力方法并一次循环控件中的行,如下所示:

String text = jTextArea.getText();
for( int i=0; i < jTextArea.getLineCount(); ++i) {
    int start = jTextArea.getLineStartOffset(i);
    int end = jTextArea.getLineEndOffset(i);
    String line = text.substring(start, end);
    writer.write(line);
    writer.newLine();
}

修改

我刚刚对此进行了测试以确认,并且两种方法都产生相同的换行位置(因此简洁jTextArea1.write(writer)自然是优选的)。请注意,这两种方法都忽略了自动插入的换行位置,并且只在文本输入过程中使用回车键的任何地方将回车保存到写入的文件中。

如果由于某些不寻常的原因,需要在输出文件中实际保存换行的位置,则需要使用LineBreakMeasurer类基于JTextArea的宽度来测量文本的宽度。有关此内容的官方教程可在此处找到http://docs.oracle.com/javase/tutorial/2d/text/drawmulstring.html

但是,请注意,如果执行此操作,您将在保存的文件中插入硬换行符,其中最初只有软线包装,因此将保存的数据加载回JTextArea将无法完全重现原始输入。

答案 1 :(得分:0)

而不是 FileWriter 使用 OutputStreamWriter ,您的问题将在OutputStreamWriter consdiers&#39; \ n&#39;流式传输时。

FileOutputStream fos = new FileOutputStream(new File("path"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

答案 2 :(得分:0)

您可以使用FileWriter将字符串写入文件。 下面的代码工作正常。

package areaText;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class TextAreaTest extends JFrame{

    /**
     * @param args
     */
    public static void main(String[] args) {
        new TextAreaTest().createFrame();

    }

    private void createFrame() {
        setSize(200,200);
        setLayout(null);
        final JTextArea area=new JTextArea("Test");
        area.setSize(50, 50);
        area.setBounds(0, 0, 100, 100);
        add(area);

        JButton  button=new JButton("Save");
        button.setBounds(100, 100, 80, 30);
        add(button);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String s=area.getText();
                System.out.println("GOT-"+s);
                try {
                    File f=new File("testFile.txt");
                    System.out.println("Writing "+f.getAbsolutePath());
                    FileWriter fr=new FileWriter(f);
                    fr.write(s);
                    fr.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }               
            }
        });
    }

}