如何从文本文件中读取并根据不同的组显示该txtfile中的特定单词(数字)

时间:2014-10-28 13:58:19

标签: java file-io

如何从文本文件中读取并根据不同的组显示该文本文件中的特定单词(数字)?

我有一个包含以下内容的txt文件:

[computers]
keyboards =3
mouse  =5

[animals]
cow =10
pig =5

这些数字将始终由另一个程序更改。

我想创建一个可以显示如下形式的表单:

Cars:    3 keyboards/n
         5 mouse

animals 10 cows
        5  pigs

我不知道该怎么做。我知道如何阅读文件,但下一个......

这就是我的画面看起来的样子     包nioCount;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class FrameTest extends JFrame {

private JPanel contentPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                FrameTest frame = new FrameTest();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public FrameTest() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JButton btnCount = new JButton("Count");
    btnCount.setBounds(80, 202, 89, 23);
    contentPane.add(btnCount);

    JButton btnResetCount = new JButton("Reset");
    btnResetCount.setBounds(268, 202, 89, 23);
    contentPane.add(btnResetCount);

    JTextArea txtrComputers = new JTextArea();
    txtrComputers.setText("Computers:");
    txtrComputers.setBounds(24, 59, 84, 22);
    contentPane.add(txtrComputers);

    JTextArea txtrKeyboards = new JTextArea();
    txtrKeyboards.setText("3 keyboards");
    txtrKeyboards.setBounds(147, 43, 130, 23);
    contentPane.add(txtrKeyboards);

    JTextArea txtrMouses = new JTextArea();
    txtrMouses.setText("10 mouses");
    txtrMouses.setBounds(147, 77, 130, 22);
    contentPane.add(txtrMouses);

    JTextArea txtrAnimals = new JTextArea();
    txtrAnimals.setText("Animals:");
    txtrAnimals.setBounds(24, 133, 84, 22);
    contentPane.add(txtrAnimals);

    JTextArea txtrDogs = new JTextArea();
    txtrDogs.setText("3 Dogs");
    txtrDogs.setBounds(147, 110, 130, 23);
    contentPane.add(txtrDogs);

    JTextArea txtrCats = new JTextArea();
    txtrCats.setText("15 cats");
    txtrCats.setBounds(147, 152, 130, 23);
    contentPane.add(txtrCats);
}

}

当我按下计数按钮时,它将计入每个类别..

这是我的.txt文件包含的内容:

[phone]
bad=1
good=30

[animals]
bad=10
good=30

2 个答案:

答案 0 :(得分:0)

执行此操作的可能方法是 BufferedReader

public class ReadTextFile {

    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            String currentLine;

            br = new BufferedReader(new FileReader("file.txt"));

            while ((currentLine = br.readLine()) != null) {
                System.out.println(currentLine);
                //test for your strings from here
                //("[computers]", etc.)
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

我不知道你到底想做什么,但我认为你会对XML更开心。

答案 1 :(得分:0)

我们有以下物品可供追踪。

  1. Category(即计算机,动物)
  2. Descriptor(即键盘,猪)
  3. Count(即5,10)
  4. 我们有以下依赖项。

    1. Category可以有1个或多个Descriptor s。
    2. Descriptor只有一个Count
    3. 有几种方法可以做到这一点,但我会根据您的描述选择最简单的方法。

        

      这些数字将始终由另一个程序更改

      我认为这意味着我们需要能够跟踪Descriptor并更改它,可能不知道Category是什么。例如,setValue("Keyboard", 10);

      的示例方法

      我们不知道键盘与计算机有关,搜索所有类别以查找键盘是耗时的。

      由于您说您知道如何阅读该文件,我将把它留给您,而是描述如何处理伪代码。

      首先,我们需要两张地图。为简单起见,我将使用HashMaps。

      HashMap<String, ArrayList<String>> categoryToDescriptor = new HashMap<>();
      HashMap<String, Integer> descriptorToCount = new HashMap<>();
      

      第一张地图存储了我们所有的类别,第二张地图存储了我们所有的数量。

      我们说我们接受文字输入并遇到"[Computer]"。我们需要将其添加到我们的类别地图中:

      categoryToDescriptor.put("Computer", new ArrayList<String>);
      

      在您的情况下,您有一个变量来解析计算机和所有变量。

      之后,我们会获得描述符和值,例如"keyboard=5"

      我们使用此信息做两件事。你可以解析它,但我会硬编码。

      String descriptor = "keyboard";
      int count = 5;
      
      categoryToDescriptor.get("Computer").add("keyboard");
      descriptorToCount.put("keyboard",5);
      

      我们现在将类别映射到描述符列表,并将描述符映射到它们的关联计数。

      使用entryset iteration,我们可以执行以下操作来打印所有值。

      for (Map.Entry<String, ArrayList<String>> entry : categoryToDescriptor.entrySet()) {
          System.out.println("Category: " + entry.getKey());
          ArrayList<String> listOfDescriptors = entry.getValue();
          for(String descriptor: listOfDescriptors) {
              System.out.println("Descriptor: " + descriptor + " Value: " + descriptorToCount.get(descriptor);)
          }
          System.out.println("");//line feed between categories
      }
      

      此外,要更新描述符的值,我们所要做的就是:

      descriptorToCount.put("keyboard", newValue);