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

时间:2016-01-20 09:41:45

标签: java android listview arraylist text-files

我正在开发一个项目来进行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的方式,然后我可以在我的应用程序中显示的列表视图中显示。 (我目前正在查看有关创建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”);
……..
……..

实际上会有更多的数据,然后只有5套,所以我想使用for循环遍历每个数据数据并将其添加到数据arraylist。

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

编辑:

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

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

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

3 个答案:

答案 0 :(得分:1)

这样定义一个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;
 }
 }

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

并从arraylist

获取数据
String type= arrayListData.get(position).getType();

已更新:

像这样读取.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();

    }
    }

答案 1 :(得分: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;
}
}

创建ArrayList

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

将每个arraylist存储为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中的值列表。

简单而优雅的解决方案。

答案 2 :(得分:1)

这是解析器

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

    }



}