简体   繁体   English

从文本文件中读取数据并将其添加到android中的arraylist的最佳方法

[英]Best approach of reading data from text file and adding it to arraylist in android

I am working on a project to get into android development, having some knowledge of java before I am thinking of reading data from a text file, which will be formatted like this; 我正在研究一个进入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 
----------

The data contains 4 pieces of information per set, Type, Image, Name and Download. 该数据包含每组4个信息,类型,图像,名称和下载。 I need a way of reading this and saving/writing it to a arraylist which I then can display in a listview that I will have on my app. 我需要一种阅读方式并将其保存/写入arraylist的方式,然后我可以在我的应用程序中显示的列表视图中显示。 (I am currently looking at tutorials on creating listview, if you know any useful tutorials please let me know) (我目前正在查看有关创建listview的教程,如果你知道任何有用的教程,请告诉我)

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”);
……..
……..

In reality there will be a lot more data then just 5 sets , so I want to use for loop to loop through each data data and add it to the data arraylist. 实际上会有更多的数据,然后只有5组,所以我想使用for循环遍历每个数据数据并将其添加到数据arraylist。

I am not sure how I can approach this, any help is welcomed, I am really stuck. 我不知道如何处理这个问题,欢迎任何帮助,我真的被困住了。 Please let me know if I have not explained my question properly. 如果我没有正确解释我的问题,请告诉我。

EDITED: 编辑:

Would this be the correct way of reading data from a textfile? 这是从文本文件中读取数据的正确方法吗?

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

Or is this another way in android 或者这是Android的另一种方式

Do this way define a setter getter class to hold and return values like this : 这样定义一个setter getter类来保存和返回这样的值:

Data.class 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;
 }
 }

using for loop set data in a arraylist 在arraylist中使用for循环集数据

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

and to fetch data from arraylist 并从arraylist获取数据

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

Updated : 更新 :

read .txt file like this , I am assuming your text file is saved in sdcard of device : 像这样读取.txt文件,我假设您的文本文件保存在设备的SD卡中:

    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();

    }
    }

Before start go through this link for reading 在开始之前,请通过此链接进行阅读

How can I read a text file in Android? 如何在Android中阅读文本文件?

Use PoJo Models for your needs, 使用PoJo模型满足您的需求,

Create a PoJo class like this 像这样创建一个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;
}
}

Create ArrayList 创建ArrayList

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

Store Each arraylist with instance of your PoJo class like this 将每个arraylist存储到您的PoJo类的实例中

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

and then access list of values in arraylist of PoJo class in filmArray list. 然后在filmArray列表中访问PoJo类的arraylist中的值列表。

Simple and elegant solution. 简单而优雅的解决方案

Here is the parser 这是解析器

    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");
        }

    }



}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM