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



我正在做一个进入 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 <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();

或者这是安卓的另一种方式

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

如何在安卓中读取文本文件?

使用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 类的数组列表中的值列表。

简单而优雅的解决方案。

这是解析器

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

}
这样做定义

一个setter getter类来保存并返回如下值:

数据.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文件,我假设您的文本文件保存在设备的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();
    }
    }

最新更新