我正在尝试用Java读取文件并将其存储到数组中。现在的问题是该文件具有以下结构。我将在下面给出两个示例文件:
输入文件结构
<number of lines>
<line number> <value>
.
.
.
<line number> <value>
input1.txt
5
1 34
2 19
3 43
4 62
5 36
input2.txt
4
1 10.3430423
2 -34.234923
3 -100.39292
4 22
如您所见,文件以行数(例如4或5)开头。在正常输入文本中,我有超过100000行。
所以我的代码基本上抓住用户输入,打开文件,创建数组大小和该大小的数组。现在我不得不阅读下一行并将值添加到elements
数组中。不应将行号添加到数组中。现在你可以看到,我的elements数组被声明为String。是否可以实际读取文件,获取值的类型并创建该类型的数组?我认为它可以节省从字符串转换为int或double或浮动?
以下是我的代码:
public static void main(String args[]) throws NumberFormatException, IOException{
String inFile; //Input file name.
int filterSize; //Filter size (odd integer >= 3).
String outFile; //Output file name.
int arraySize;
String[] elements;
int index = 0;
//Scanner to take input file name, filter size and output file name.
Scanner keyboardInput = new Scanner(System.in);
System.out.println("Enter your keyboard input as follows: <data file name> <filter size(odd int >= 3> <output file name>");
//Assigning values to variables.
inFile = keyboardInput.next();
filterSize = keyboardInput.nextInt();
outFile = keyboardInput.next();
//Reading file into array using BufferReader
BufferedReader fileInput = new BufferedReader(new FileReader(inFile));
arraySize = Integer.parseInt(fileInput.readLine()); //Get Array Size
elements = new String[arraySize];
while(fileInput.readLine() != null){
elements[index] = fileInput.readLine();
index += 1;
}
}
感谢任何帮助。感谢。
答案 0 :(得分:2)
尝试这样做:
Scanner sc = new Scanner(new File(inFile));
arraySize = sc.nextInt();
elements = new String[arraySize];
while(sc.hasNext())
{
sc.nextInt();
elements[index] = sc.next();
index += 1;
}
您创建新的扫描仪,您可以阅读整数,布尔值等,而无需任何转换。因为您不需要当前行号,所以您只需读取该号码即可。您无需将其保存在任何地方。然后您必须在elements[index]
保存下一个数字/字符串。就是这样
答案 1 :(得分:1)
以流为基础:
Files.lines(pathToFile).skip(1) // skip the line counter. Don't trust input
.map(line -> line.replaceFirst("\\d+", "")) // remove digits at the start
.collect(Collectors.toList()); // collect it into a list
您可以将其存储到.toArray()
但实际上你应该用try-with-resources
:
try (Stream<String> lines = Files.lines(pathToFile).skip(1)) {
elements = lines.map(line -> line.replaceFirst("\\d", "")).collect(Collectors.toList());
} catch (IOException e) {
// sensible handling...
}
答案 2 :(得分:0)
读取号码,不要使用它。
File file = new File("input1.txt");
Scanner in = new Scanner(file);
int lines = in.nextInt();
int []a = new int[lines];
for(int i = 0; i < lines; i++)
{
int fakeNumber = in.nextInt();//read it but never used it
a[i] = in.nextInt();
}
您也可以使用in#hasNextLine()
。
答案 3 :(得分:0)
这里真正的问题是如何摆脱行号并获得除此之外的价值。
double[] array = .... // initialize your array
int v = 0;
while(file.readLine() != null){
// your array
array[v++] = Double.parseDouble(file.readLine().split(" ")[1]);
}