我有一个US-ASCII文本文件,其中包含一行长行。我需要访问的文本项由不同数量的空格分隔,如下所示:

metadata1 attrib1     metadata2 attrib2   attrib2a trackstart attrib1   attrib2   trackstart attrib1 atrib2 attrib3


该文件最多可以包含99个“曲目”条目,并且占用的内存很少。

我需要做什么

我必须将这些条目提取到一个内存结构中,以便可以对其进行迭代,访问值和计数项目。例如,我需要获取“音轨”的数量(在上面的示例中通过计数“ trackstart”,还需要将每个音轨的属性添加到类似object.track1.attribute1的结构中。

我尝试过的

我使用扫描仪读取文件并逐步输入文本。这似乎工作正常。然后,我创建了嵌套的HashMap,例如:

HashMap<String, String> overallMap = new HashMap<String, String>(); // contains the tracks map and some other metadata
HashMap<String, Map> tracks = new HashMap<String, Map>();  // contains a map of all tracks
HashMap<String, String> track = new HashMap<String, String>(); // contains an individual track


但是问题是(我认为)HashMaps不允许我计算键数(因此,我无法说出文本文件中“轨道”的数量)。我怀疑我会在这种数据结构中遇到其他问题。

问题


在这种情况下,扫描仪是读入和处理文件的最佳方法吗?
我应该选择哪种内存数据结构?如何在此结构中建立曲目列表,计算曲目并访问各个属性?

最佳答案

由于您有一些元数据对象和一些轨道,每个轨道具有可变数量的属性,因此我们可以有一个名为“ MyObjects”的基类来表示它们中的每个

public class MyObject implements java.io.Serializable
{
    String name;
    ArrayList attributes;
    public MyObject(String name)
    {
       this.name = name;
    }
    public void addAttribute(String attr)
    {
        this.attributes.add(attr);
    }
}


然后有一个MyFile类,它将代表您读取的每个文件。

public class MyFile
{
    MyObject[] metadata;
    MyObject[] track;

    public int check(String s)
    {
        if(s.substring(0,s.length()-1).equals("metadata")) return 0;
        if(s.equals("trackstart")) return 1;
        return 2;
    }
}


然后在主要功能中,您可以读取文件

File f = new File(filepath);
BufferedReader br = new InputStreamReader(f.getInputStream());
String line = "",content = "";
while((line = br.readLine())!=null) content += line;

MyFile myfile = new MyFile();
StringTokenizer t = new StringTokenizer(content," ");
int status;
String word = "";
while(t.hasMoreTokens())
{
    word = t.nextToken();
    status = myfile.check(word);

    // add the attributes to the to metadata or tracks

 }

关于java - 扫描Java中的文本文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19618106/

10-13 01:11
查看更多