我有这个文件:“ Test.txt”-> 1,cont,details,950.5,asd
我的班级是自动,构造函数是int, string, string, double, string
。
如何读取此文件,然后使用正确的数据转换初始化我的对象?
我想我也需要使用逗号分隔符。
FileReader inFile2=null;
BufferedReader outBuffer2=null;
inFile2=new FileReader("Test.txt");
outBuffer2 = new BufferedReader(inFile2);
List<String> lines = new ArrayList<String>();
String line="";
while((line = outBuffer2.readLine()) != null) {
lines.add(line);
System.out.println(lines);
}
outBuffer2.close();
inFile2.close();
//
String[] splitTranzactie = lines.toArray(new String[]{});
Auto t = new Auto(Int32(splitTranzactie[0]), splitTranzactie[1], splitTranzactie[2],
ToDouble(splitTranzactie[3]), splitTranzactie[4]);
答案 0 :(得分:0)
对于int,您可以使用
int a = Integer.parseInt(string);
双打几乎相同
double b = Double.parseDouble(string);
但是请注意,如果字符串不是它的本意,则两者都可能引发NumberFormatException。
答案 1 :(得分:0)
您可以从各行创建流,然后可以应用
Function(ArrayList
答案 2 :(得分:0)
使用Java 8流:
try (Stream<String> fileStream = Files.lines(Paths.get("Test.txt"))) {
fileStream.map(line -> line.split(",")).forEach(array -> {
Auto auto = new Auto(Integer.parseInt(array[0]), array[1], array[2], Double.parseDouble(array[3]), array[4]);
});
}
您可以通过以下方式收集自动列表:
List<Auto> autoList;
try (Stream<String> fileStream = Files.lines(Paths.get("Test.txt"))) {
autoList = fileStream.map(line -> {
String[] array = line.split(",");
return new Auto(Integer.parseInt(array[0]), array[1], array[2], Double.parseDouble(array[3]), array[4]);
}).collect(Collectors.toList());
}
答案 3 :(得分:0)
这里有一些问题。首先:
String[] splitTranzactie = lines.toArray(new String[]{});
只是将您的行列表变成行数组。要将每一行拆分成各个组成部分,可以使用String.split(“,”)之类的东西。这将返回一个字符串数组。请注意,如果您期望最后一个值中的任何一个为空,即以一个或多个逗号结尾,则返回的数组将与找到的最后一个值位置一样长。也就是说,如果您将行拆分为1,cont,details,,
,则返回的数组长度为3而不是5。您应该对此进行防御性编码。
要将字符串转换为int或double类型,可以分别使用Integer.parseInt()
和Double.parseInt()
。同样,如果值不是数字值,则可能需要考虑进行防御性编码,因为如果这两种方法无法解析输入,则会抛出异常。
您还应该将close()
方法放在finally块中以确保它们被调用,但是由于它们AutoCloseable
可以通过使用try-with-resources语法来完全避免这种情况,该语法将关闭阅读器。
try(Reader in = new Reader()) {
}
在您的示例之后执行上述所有操作(但没有任何防御性代码)的示例可能类似于以下内容:
List<Auto> autos = new ArrayList<>();
try (BufferedReader in = new BufferedReader(new FileReader("Test.txt"))) {
String line = null;
while((line = in.readLine()) != null) {
String[] values = line.split(",");
autos.add(new Auto(
Integer.parseInt(values[0]),
values[1],
values[2],
Double.parseDouble(values[3]),
values[4]));
}
}
答案 4 :(得分:0)
按照您当前的方案,在这里我可以执行任务的一种方式。该代码还将验证数据并在验证失败时放置默认值。
public List<Auto> getAutoListFromFile(String filePath) {
List<Auto> list = new ArrayList<>(); // Declare a List Interface
Auto auto; // Declare Auto
// Open a file reader. Try With Resourses is used here so as to auto close reader.
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line = "";
// Iterate through the file lines
while((line = reader.readLine()) != null) {
line = line.trim(); // Trim lines of any unwanted leading or trailing whitespaces, tabs, etc.
// Skip blank lines.
if (line.equals("")) {
continue;
}
System.out.println(line); // Display file line to console (remove if desired).
/* Split the current comma delimited file line into specific components.
A regex is used here to cover all comma/space scenarios (if any). */
String[] lineParts = line.split("\\s{0,},\\s{0,}");
// Establish the first Auto memeber value for the Auto class constructor.
int id = -1; // default
// Make sure it is an unsigned Integer value. RegEx is used here again.
if (lineParts[0].matches("\\d+")) {
id = Integer.parseInt(lineParts[0]);
}
// Establish the second Auto memeber value for the Auto class constructor.
String cont = !lineParts[1].equals("") ? lineParts[1] : "N/A"; //Ternary Used
// Establish the third Auto memeber value for the Auto class constructor.
String details = !lineParts[2].equals("") ? lineParts[2] : "N/A"; //Ternary Used
// Establish the fourth Auto memeber value for the Auto class constructor.
double price = 0.0d; //default
// Make sure it is a signed or unsigned Integer or double value. RegEx is used here again.
if (lineParts[3].matches("-?\\d+(\\.\\d+)?")) {
price = Double.parseDouble(lineParts[3]);
}
// Establish the fifth Auto memeber value for the Auto class constructor.
String asd = !lineParts[4].equals("") ? lineParts[4] : "N/A"; //Ternary Used
auto = new Auto(id, cont, details, price, asd); // Create an instance of Auto
list.add(auto); // Add Auto instance to List.
// Go and read next line if one exists
}
}
// Handle Exceptions.
catch (FileNotFoundException ex) {
Logger.getLogger("getAutoListFromFile() Method Error!").log(Level.SEVERE, null, ex);
}
catch (IOException ex) {
Logger.getLogger("getAutoListFromFile() Method Error!").log(Level.SEVERE, null, ex);
}
return list; // Return the filled list.
}
要使用此方法,您可以执行以下操作:
List<Auto> list = getAutoListFromFile("Test.txt");