чтение текстового файла в массив конструктора (Java) - PullRequest
2 голосов
/ 06 ноября 2011

У меня есть текстовый файл с некоторыми значениями.

textfile data

line1row1 line1row2 55
line2row1 line2row2 44
line3row1 line3row2 33

У меня есть класс данных, в котором я создал конструктор.данные, которые поступают в массив, я хочу прочитать из текстового файла.

import java.io.*; 
import java.util.*;

class Data{
    public Data(String entry1, String entry2, int entry3){}
}   
public class readData {
    public static void main(String[] args) throws Exception{
    BufferedReader inFile = new BufferedReader (new FileReader ("scores.txt"));

    Data entrydata[] = new Data[3]; //create new constructor array
    for(int i = 0; i < entrydata.length; i++ ){
            entrydata[i] = inFile.readLine();
        }
    }
}

Я получаю сообщение об ошибке "inFile.readLine ()" ... Не удается преобразовать строку в данные (где «данные» относится к классу)

Я могу жестко закодировать данные[как показано ниже], но вместо этого я хочу, чтобы он читался из файла

Data entrydata[] = new Data[3];
entrydata [0] = new Data("line1row1 ", "line1row2 ", 55);
entrydata [1] = new Data("line2row1 ", "line2row2 ", 44);
entrydata [2] = new Data("line3row1 ", "line3row2 ", 33);

Причина, по которой я хочу это сделать, заключается в том, чтобы я мог получить доступ к информации, хранящейся в массиве.

Ответы [ 5 ]

2 голосов
/ 06 ноября 2011

inFile.readline () возвращает строку, которая не является объектом Data, поэтому вы получаете сообщение об ошибке. Вам нужно разбить строку, которую вы прочитали из файла, на массив и использовать элементы массива для создания ваших элементов данных. Что-то вроде:

String[] tmp = inFile.readline().split( " " );
entrydata[i] = new Data( tmp[0], tmp[1], Integer.parseInt( tmp[2] ) );
1 голос
/ 06 ноября 2011

Я бы сделал что-то подобное

class Data{
    String entry1, entry2;
    int entry3;
    public Data(String[] datas) throws NumberFormatException {
        entry1 = datas[0];
        entry2 = datas[1];
        entry3 = Integer.parseInt(datas[2]);
    }
}
    .
    .
    .
    .
Data entrydata[] = new Data[3]; //this is not a constructor
for(int i = 0; i < entrydata.length; i++ ){
    entrydata[i] = new Data(inFile.readLine().split(" ")); //this is the constructor
}
0 голосов
/ 10 сентября 2014

Этот код определенно будет работать:

FileReader fr =new FileReader("src/FilePractice.txt");
BufferedReader in =new BufferedReader(fr);
String line;
        while((line = in.readLine()) != null){
            String[] arrray=line.split(",");
            RelationShip r=RelationShip.valueOf(arrray[2]);
            new Data(arrray[0],arrray[1],r,Integer.parseInt(arrray[3]));
            System.out.println(arrray[0]+arrray[1]+arrray[2]+arrray[3]);
0 голосов
/ 07 ноября 2011

Ваш класс readData не имеет конструктора или метода.Код в строке 11-15 должен быть в методе / конструкторе.

Если длина каждой записи фиксирована, вы можете попробовать line.substring(...) вместо line.split(...).

Имякласса должно быть ReadData.

0 голосов
/ 06 ноября 2011

Как мог метод readLine, который читает строку текста из файла, узнать, как преобразовать строку в экземпляр Data? Это не читает в вашем уме.

Итак, вы должны сказать ему, как преобразовать линию в три компонента. Вы можете использовать метод String.split, чтобы разделить строку на каждом пробеле, и метод Integer.parseInt, чтобы преобразовать третий токен в целое число.

Кроме того, ваш код предполагает, что файл содержит ровно 3 строки. Если это не обязательно так, вы должны выполнить цикл, пока следующая строка не станет нулевой, и поместить каждый экземпляр Data в List<Data>, а не в массив. Список автоматически увеличится в размере, чего не может сделать массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...