Поиск определенного текста в текстовом файле. Возврат его в текстовое поле

Я очень новичок в java. Я работаю над проектом для класса, который будет искать книги в текстовом файле и отображать информацию о них. В первую очередь, есть ли книга в наличии или нет. Текстовый файл настроен следующим образом: {ISBN, Автор, Тип, Фонд}.

Я закодировал пользовательский интерфейс, который позволяет пользователю вводить ISBN, автора и тип. В идеале я хотел бы, чтобы пользователь просто искал один из них и возвращал необходимую информацию. Однако сейчас можно было бы просто искать по ISBN. Мой код прямо сейчас принимает только то, что вводится в текстовые поля, и отображает его в большом текстовом поле. Я немного знаком с чтением текстового файла, но понятия не имею, как взять текст из текстового поля и использовать его для поиска файла. Любая помощь будет принята с благодарностью.

Вот мой код:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.sql.*;


public class InventoryInterface extends JFrame
{
   private static final int FRAME_WIDTH = 600;
   private static final int FRAME_HEIGHT = 350;

   private JButton btnSearch;
   private JButton btnDatabase; 
   private JButton btnRefresh; 
   private JLabel lblISBN, lblAuthor, lblType;
   private JTextField txtISBN, txtAuthor, txtType;
   private JTextArea txtOutput;


   public InventoryInterfaceSimple()
   {
      createComponents();
      setSize(FRAME_WIDTH, FRAME_HEIGHT);
   }

   public void createComponents()
   {

      btnSearch = new JButton("Search");
      lblISBN = new JLabel("ISBN");
      lblAuthor = new JLabel("Author");
      lblType = new JLabel("Type");

      txtISBN = new JTextField(10);
      txtAuthor = new JTextField(10);
      txtType = new JTextField(10);
      txtOutput = new JTextArea(30,30);
      txtOutput.setText("");
      txtOutput.setEditable(false);   
      ActionListener action = new InventoryOutput();
      btnSearch.addActionListener(action);



      JPanel panel = new JPanel();
      panel.setLayout(null);



      lblISBN.setBounds(10,10,50,25);
      txtISBN.setBounds(55,10,125,25);
      lblAuthor.setBounds(10,40,50,25);
      txtAuthor.setBounds(55,40,125,25);
      lblType.setBounds(10,70,50,25);
      txtType.setBounds(55,70,125,25);

      btnSearch.setBounds(30,130,150,25);

      JScrollPane scrollArea = new JScrollPane(txtOutput);
      scrollArea.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
      scrollArea.setBounds(200,10,350,200);
      panel.add(scrollArea);

      panel.add(lblISBN);
      panel.add(txtISBN);
      panel.add(lblAuthor);
      panel.add(txtAuthor);
      panel.add(lblType);
      panel.add(txtType);
      panel.add(btnSearch);
      panel.add(scrollArea);

      add(panel);

   }

   class InventoryOutput implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {
         String inventoryString = "";
         inventoryString += txtISBN.getText() + " - ";
         inventoryString += "Author: " + txtAuthor.getText() + " - ";
         inventoryString += "Type: " + txtType.getText() + " - ";

         txtOutput.append(inventoryString + "\n");

         txtISBN.setText("");
         txtAuthor.setText("");
         txtType.setText("");


      }
   } 

}
​

person JA778    schedule 04.05.2015    source источник
comment
Я не уверен, что понимаю вашу проблему. Вы не знаете, как сделать поиск в текстовом файле?   -  person iullianr    schedule 04.05.2015
comment
1. либо прочитать весь файл в структуру данных, например строку, и выполнить простое сравнение строк, чтобы узнать, есть ли совпадение с ISBN. строка textfromFile = abcdef; строка textfromTextbox = def ; if(textfromFile.contains(textfromTextBox){ display : found the book } 2. Используйте ISBN и сопоставляйте слова, когда читаете файл   -  person Prasaanth Neelakandan    schedule 04.05.2015
comment
iulliar, я хочу, чтобы пользователь ввел ISBN, который он хочет найти, и программа приняла его и вернула информацию с соответствующим ISBN. Я не уверен, как это закодировать. Единственное, что мы рассмотрели, это сканер, и я читал некоторые вещи, где сканер может быть слишком медленным?   -  person JA778    schedule 04.05.2015


Ответы (2)


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

   class InventoryOutput implements ActionListener {
    private final String REPOSITORY_FILE_PATH = "C:\\temp\\book-repo.txt";
    private final File REPOSITORY_FILE = new File(REPOSITORY_FILE_PATH);

    public void actionPerformed(ActionEvent event) {
        String inventoryString = "";

        String requestedISBN = txtISBN.getText().trim().toLowerCase();
        String requestedAuthor = txtAuthor.getText().trim();
        String requestedType = txtType.getText().trim();

        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(REPOSITORY_FILE));
            String line;
            while ((line = reader.readLine()) != null) {
                String lineLtrim = line.toLowerCase().replaceAll("^\\{", ""); //{
                String lineRtrim = lineLtrim.replaceAll("\\}$", ""); //}
                String[] data = lineRtrim.split(","); //ISBN, Author, Type, Stock
                if (data.length < 4) {
                    throw new IllegalArgumentException("bad datafile: All fields must be entered: " + line);
                }
                if (data[0].equals(requestedISBN)) {
                    inventoryString += txtISBN.getText() + " - Author: " + data[1] + " - Type: " + data[2] + " - Stock:" + data[3];
                    txtOutput.append(inventoryString + "\n");
                    return;
                }
            }
            reader.close();
            inventoryString += txtISBN.getText() + " -  Not Found";
            txtOutput.append(inventoryString + "\n");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

вы можете просто добавить этот код main() для тестирования, в идеале вы должны написать модульный тест, чтобы охватить все случаи.

public static void main(String[] args) {
    JFrame f = new InventoryInterface();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setPreferredSize(new Dimension(600, 600));
    f.pack();
    f.setVisible(true);
}

файл данных

{ISBN1234,me,drama,5}
{ISBN1235,me,Tech,0}
{ISBN1236,me,Fiction,2}
{ISBN1237,me,Audio/Kids,4}

Не уверен, какую часть вы не получили,,

  1. на слушателе - мы читаем ISBN, введенный пользователем String requestedISBN = txtISBN.getText().trim().toLowerCase();, и преобразуем его в нижний регистр, чтобы мы могли сравнивать с данными в нижнем регистре
  2. затем мы читаем ваш файл данных (построчно)
  3. мы то из каждой строки убираем символ "{" и "}" // комментарий говорит что
  4. тогда мы получаем "isbn,author, type, stock", поэтому мы разделяем на ","
  5. split дает нам массив строк, помещающий каждый элемент в массив в порядке, т.е. данные [0] имеют isbn, данные [1] имеют автора ... и т. д.
  6. мы проверяем правильность файла данных, убедившись, что у нас есть все элементы, т.е. if (data.length < 4) {
  7. мы бросаем исключение, если размер массива не ‹4, т.е. мы обнаружили, что файл данных содержит неверные данные.
  8. затем мы сравниваем, совпадает ли ввод isbn (data[0]) с одним из строковых элементов из вашего файла данных.
  9. если мы находим совпадение, мы отображаем его в текстовой области и выходим из цикла,
  10. если мы не находим, мы отображаем «не найдено»

Если вы сами написали код (слушатель), это должно быть для вас тривиально.

person Sendi_t    schedule 04.05.2015
comment
У меня все еще есть проблемы, и ваш код все еще немного продвинут для меня. Не могли бы вы помочь мне объяснить это? - person JA778; 06.05.2015

Вы можете создать private String chosenISBN и установить его значение в методе actionPerformed. Затем вы можете получить доступ к значению везде в классе. Вы даже можете создать геттер для chosenISBN, если вам это нужно.

person ChristofferPass    schedule 04.05.2015