Загрузка текстового файла в текстовую область

#java #file-io

#java #file-io

Вопрос:

Прежде всего, я очень хорошо разбираюсь в Java. Я пытаюсь просмотреть текстовый файл и загрузить его содержимое в текстовую область. Я завершил ту часть, до которой я получаю файл из JFileChooser, теперь я не знаю, как выполнить оставшееся.

 .
.
.

File selFile = new File(fileChooser.getSelectedfile());
/// From here I want to load its content to a textarea "txtArea"
  

Комментарии:

1. Каждое предложение на этой странице получает значение -1. Все текстовые компоненты имеют метод чтения (…). Нет причин создавать циклический код или буферы или что-либо еще. Для заполнения текстовой области требуется одна строка кода. Да, приведенные здесь решения будут работать для файлов, доступных только для чтения, но они не будут работать, если вы когда-нибудь захотите записать текст из текстовой области в файл. Все заставляют символ новой строки быть » n». Метод чтения будет отслеживать строку перевода строки по мере чтения файла, а затем использовать ее для вывода при записи файла.

2. @camickr: В классе TextArea или любом из его потомков нет метода read(). Также новая строка должна быть ‘ n’, поскольку это то, что используется этими классами внутренне. Я бы посоветовал вам отозвать свои отрицательные голоса и разобраться с фактами, прежде чем вы начнете перебирать ответы всех подряд.

3. Это вопрос, связанный с Swing, поскольку плакат использует JFileChooser. Все текстовые компоненты Swing поддерживают метод read(), который они наследуют от JTextComponent. Метод read() анализирует текст по мере его чтения из файла и вставляет «n» в документ. Однако он также отслеживает фактическую строку перевода строки, найденную в файле, так что эту строку можно использовать, если вам когда-нибудь понадобится переписать файл. Таким образом, будет сохранена правильная строка новой строки. Смотрите: tips4java.wordpress.com/2009/02/07/text-and-new-lines в котором кратко обсуждается эта проблема.

4. @camickr, SO не предназначен для скрытия ответов внутри комментариев. Если вы считаете, что другие ответы неверны, и то, что вы описали выше, является правильным решением, то, пожалуйста, перенесите ваше предложение в реальный ответ.

Ответ №1:

Используйте методы read(…) и write(…), которые поддерживаются всеми текстовыми компонентами Swing. Простой пример:

 import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.text.*;

class TextAreaLoad
{
    public static void main(String a[])
    {
        final JTextArea edit = new JTextArea(10, 60);
        edit.setText("onentwonthree");
        edit.append("nfournfive");

        JButton read = new JButton("Read TextAreaLoad.txt");
        read.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    FileReader reader = new FileReader( "TextAreaLoad.txt" );
                    BufferedReader br = new BufferedReader(reader);
                    edit.read( br, null );
                    br.close();
                    edit.requestFocus();
                }
                catch(Exception e2) { System.out.println(e2); }
            }
        });

        JButton write = new JButton("Write TextAreaLoad.txt");
        write.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    FileWriter writer = new FileWriter( "TextAreaLoad.txt" );
                    BufferedWriter bw = new BufferedWriter( writer );
                    edit.write( bw );
                    bw.close();
                    edit.setText("");
                    edit.requestFocus();
                }
                catch(Exception e2) {}
            }
        });

        JFrame frame = new JFrame("TextArea Load");
        frame.getContentPane().add( new JScrollPane(edit), BorderLayout.NORTH );
        frame.getContentPane().add(read, BorderLayout.WEST);
        frame.getContentPane().add(write, BorderLayout.EAST);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}
  

Ответ №2:

 BufferedReader in = null;
try {
    in = new BufferedReader(new FileReader(selFile));
    String str;
    while ((str = in.readLine()) != null) {
        jtextArea.append(str);
    }
} catch (IOException e) {
} finally {
    try { in.close(); } catch (Exception ex) { }
}
  

Комментарии:

1. Возможно, потребуется переместить это in.close() в блок finally.

2. Он не поддерживает отступы и разрывы строк.

3. @Qwerky, я попытался переместить in.close() в блок finally. Но это выдает ошибку, сообщающую, что не удается найти символ in

4. @mrN, потому что in был объявлен в try блоке. Перемещение объявления перед try и in.close в, наконец, будет работать. Но не забудьте проверить, так ли это null перед закрытием

5. @hage, я попытаюсь это сделать, но как насчет разрывов строк и отступов?

Ответ №3:

Для отступа и переноса строки вы должны использовать » n» перед добавлением к текстовой области..

   BufferedReader buff = null;
  try {
       buff = new BufferedReader(new FileReader(selFile));
       String str;
       while ((str = buff.readLine()) != null) {
       jtextArea.append("n" str);
   }
 } catch (IOException e) {
  } finally {
    try { in.close(); } catch (Exception ex) { }
    }
  

Ответ №4:

Используйте BufferedReader для чтения текстового файла построчно. Затем вы можете добавлять каждую строку в свою текстовую область.