【问题标题】:Best approach of reading data from text file and adding it to arraylist in android从文本文件中读取数据并将其添加到android中的arraylist的最佳方法
【发布时间】:2016-04-26 02:04:42
【问题描述】:

我正在做一个项目以进入 android 开发,在我考虑从文本文件中读取数据之前有一些 java 知识,它将被格式化为这样;

Type: House
Image link: www.bit.ly/image1
Name: Black
Download Link: www.bit.ly/image1download 
----------
Type: Car
Image link: www.bit.ly/image2 
Name: yellow
Download Link: www.bit.ly/image2download 
----------
Type: Backyard
Image link: www.bit.ly/image3 
Name: Green
Download Link: www.bit.ly/image3download
----------
Type: Window
Image link: www.bit.ly/image4 
Name: Solid
Download Link: www.bit.ly/image4download 
----------
Type: Table
Image link: www.bit.ly/image5  
Name: Brown
Download Link: www.bit.ly/image5download 
----------

数据每组包含 4 条信息,类型、图像、名称和下载。我需要一种读取此内容并将其保存/写入到 arraylist 的方法,然后我可以将其显示在我的应用程序上的列表视图中。 (我目前正在查看有关创建列表视图的教程,如果您知道任何有用的教程,请告诉我)

Arraylist <String> data = new ArrayList<String>();
Data.add(“House”,” www.bit.ly/image1”,”black”,”www.bit.ly/image1download”);
Data.add(“Car”,” www.bit.ly/image2”,”yellow”,” www.bit.ly/image2download”);
……..
……..

实际上数据会比5组多很多,所以我想用for循环遍历每个数据数据并将其添加到数据数组列表中。

我不知道如何解决这个问题,欢迎任何帮助,我真的被困住了。如果我没有正确解释我的问题,请告诉我。

已编辑:

这是从文本文件中读取数据的正确方法吗?

Scanner content = new Scanner(new File("Data.txt"));
ArrayList<String> data = new ArrayList<String>();
while (content.hasNext()){
    data.add(content.next());
}
content.close();

或者这是android中的另一种方式

【问题讨论】:

  • 到底是什么问题!y。使用 data.add() 添加四个字符串。如果您逐行阅读文件,您可以收集/填写这四个 sting 变量,然后添加()它们。
  • 我不确定如何以帖子中显示的格式从文件中读取数据。例如,我如何将第一个类型,图像,名称和下载放在第一行并用-----------将其分开,然后读取第二个数据集等等,然后将其放入数组列表。
  • 那么开始逐行读取文件。然后检查每一行的内容并将内容放入四个变量之一中。开始编码。如果您需要帮助,请显示您的代码。

标签: java android listview arraylist text-files


【解决方案1】:

在开始之前,请通过此链接阅读

How can I read a text file in Android?

根据您的需要使用 PoJo 模型,

像这样创建一个 PoJo 类

public class Film {

private String filmName;
private String mainStar;

public String getFilmName() {
    return filmName;
}
public void setFilmName(String filmName) {
    this.filmName = filmName;
}

public String getMainStar() {
    return mainStar;
}
public void setMainStar(String mainStar) {
    this.mainStar = mainStar;
}
}

创建数组列表

private ArrayList<Film > filmArray=new ArrayList<Film>();

像这样使用 PoJo 类的实例存储每个数组列表

for(int i=0;i<sizei++)
{
Film film=new Film();
film.setFilmName("your value");
film.setMainStar("your value");
filmArray.add(film);
}

然后访问 filmArray 列表中 PoJo 类的 arraylist 中的值列表。

简单而优雅的解决方案。

【讨论】:

  • 会像这样放在arraylist中吗 data { type, image, name, download |类型、图像、名称、下载.....}(| = 新行)。我对如何从文本文件中读取数据有点困惑。
  • 文本文件是什么意思? .txt 文件?
  • 是的,对不起,我的意思是 .txt
【解决方案2】:

这是解析器

    public class FileParser {

    private static final String DATA_TERMINATION = "----------";

    private static final String TYPE="Type";
    private static final String IMAGE="Image link";
    private static final String NAME= "Name";
    private static final String DWNLD_LNK= "Download Link";

    public static void main(String[] args) {
        FileParser parser =  new FileParser();
        try {
            for(Data d:parser.parseDataFile(new File("F:\\data.txt"))){
                System.out.println(TYPE+":"+d.getType());
                System.out.println(IMAGE+":"+d.getImage());
                System.out.println(NAME+":"+d.getName());
                System.out.println(DWNLD_LNK+":"+d.getLink());
                System.out.println(DATA_TERMINATION);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public List<Data> parseDataFile(File input) throws Exception{
        List<Data> output =null;
        List<String> fileOp= null;
        try {

            validateInput(input);
            fileOp =  readFile(input);
            output = parseData(fileOp);



        } catch (Exception e) {
            throw e;
        }
        return output;


    }

    private List<Data> parseData(List<String> fileOp) {
        List<Data> output =null;

        output = new ArrayList<Data>();
        Data data;

        data = new Data();
        for(String line:fileOp){
            if(DATA_TERMINATION.equalsIgnoreCase(line)){
                output.add(data);
                data = new Data();
            }else{
                parseField(data,line);
            }
        }
        return output;
    }

    private void parseField(Data data, String line) {
        StringTokenizer tokenzr =  new StringTokenizer(line,":");
        if(tokenzr.countTokens() !=2){
            System.out.println("Cant parse line"+line);
        }else{

            switch (tokenzr.nextToken()) {
            case TYPE:
                data.setType(tokenzr.nextToken());
                break;
            case IMAGE:
                data.setImage(tokenzr.nextToken());
                break;
            case NAME:
                data.setName(tokenzr.nextToken());
                break;
            case DWNLD_LNK:
                data.setLink(tokenzr.nextToken());
                break;

            default:
                break;
            }
        }

    }

    private List<String> readFile(File input) throws Exception {

        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input)));
        String line = null;
        List<String> op = new ArrayList<String>();
        try {
            while((line = reader.readLine()) != null){
                op.add(line);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw e;
        }
        return op;
    }

    private void validateInput(File input) throws Exception {
        if(input == null){
            throw new Exception("Null input");      

        }else if(!input.exists() || !input.isFile() || !input.canRead()  ) {
            throw new Exception("File not readable");
        }

    }



}

【讨论】:

    【解决方案3】:

    这样定义一个setter getter 类来保存和返回这样的值:

    Data.class

    public class Data {
    String type,Image,Name,Link ;
    
    public Data() {
    
    }
    public String getType() {
    return type;
     }
    
     public void setType(String type) {
    this.type = type;
      }
    
     public String getImage() {
    return Image;
    }
    
     public void setImage(String image) {
    Image = image;
     }
    
     public String getName() {
    return Name;
     }
    
     public void setName(String name) {
    Name = name;
     }
    
     public String getLink() {
    return Link;
      }
    
     public void setLink(String link) {
    Link = link;
     }
     }
    

    在数组列表中使用for循环设置数据

    Arraylist <Data> arrayListData = new ArrayList<Data>();
    for(int i=0;i<arrayListData .size();i++){
     Data data=new Data();
     data.setType("");
     ...
     ...
     ...  
     arrayListData.add(data);
     }
    

    并从arraylist获取数据

    String type= arrayListData.get(position).getType();
    

    更新:

    像这样读取 .txt 文件,我假设您的文本文件保存在设备的 sdcard 中:

        public void readfile() {
        StringBuilder text = new StringBuilder();
        File sdcard = Environment.getExternalStorageDirectory();
        ArrayList<Data> arrayList=new ArrayList<Data>();
        //Get the text file
        File file = new File(sdcard,"textfile.txt");
    
        //Read text from file
    
    
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            Data data=new Data();
            while ((line = br.readLine()) != null) {
    
                text.append(line);
                text.append('\n');
                if(line.contains(":")){
                    int index=line.indexOf(":");
                    String s=line.substring(index+1).trim();
                    if(line.contains("Type")){
                        data.setType(s);
                    }
                    if(line.contains("Image")){
                        data.setImage(s);
    
                    }
                    if(line.contains("Name")){
                    data.setName(s);
    
                  }
                 if(line.contains("Download")){
                    data.setLink(s);
                  }
    
                }
                if(line.contains("-")){
                 arrayList.add(data);
                 data=new Data();
                }
            }
            System.out.println(text);
    
            br.close();
        }
        catch (IOException e) {
            e.printStackTrace();
    
        }
        }
    

    【讨论】:

    • 这是否像创建自定义数组列表适配器,我一直在查看自定义列表视图,这看起来与我在自定义列表视图中找到的相似。
    • 但我对如何从文本文件中读取数据并将其放入此数组列表中有点困惑
    • 嗨,谢谢。看起来不错。就我自己的知识而言,setter 是否意味着设置变量,而 getter 意味着在 getsomething() 方法中返回变量,该方法返回指定变量的值。我是否有两个问题需要为 data.class 创建一个单独的类,其余代码可以放在我的 mainactivity 中,其次是否可以不包含数据的标题。例如, if(line.contains("Type")){ data.setType(s);我不希望 Type 被写入/显示在 listview 上。
    • 另外,我很确定我可以解决这个问题,但你会看到 for 循环 for(int i=0;i
    • @Henry 我写了for 循环,条件仅供您理解,您可以根据arraylist 大小查看我的编辑答案,是的,我更愿意单独写data.class,您可以设置通过从 arraylist 中获取相应的值,您想在列表视图中显示的任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2021-08-12
    相关资源
    最近更新 更多