我正在开发一个程序,主要是使用(强制性)此类来读取文件的行:
public class Paraula {
// Public
public static final char blank = ' ';
public static final char endSequence = '\n';
// Private
// Max length of a Paraula(Word)
private static final int MAXIM = 20;
public char[] letters;
public int length;
private static char letter= ' ';
public static char[] phrase= null;
public static int indice;
// Constructor
public Paraula() {
letters= new char[MAXIM];
length= 0;
}
//reading a word from an input sequence
public static Paraula llegir() {
Paraula nova = new Paraula();
jumpBlanks();
while ((letter!= endSequence) && // sequence has not reached end
(letter!= blank)) { // there's enough space/room?
nova.letters[nova.length++] = letter;
letter= readCharKeyB();
}
return nova;
}
// Convert Paraula into String
public String toString() {
String msg = "";
for (int idx = 0; idx < length; idx++) {
msg += letters[idx];
}
return msg;
}
// comparing two objects Paraula
public boolean esIgualA(Paraula b) {
boolean iguals = letters== b.length;
for (int idx = 0; (idx < length) && iguals; idx++) {
iguals = letters[idx] == b.letters[idx];
}
return iguals;
}
public static boolean iguals(Paraula a, Paraula b) {
// using method above
return a.esIgualA(b);
}
// to determine if a Paraula is empty
public boolean empty() {
return length== 0;
}
// reading the necessary until finding a Paraula
public static void jumpBlanks() {
while (letter== blanc) {
letter= readCharKeyB();
}
}
//jump characters if the Paraula is too long
public static void jumpWord() throws Exception {
while ((letter != '.') && (letter!= blanc)) {
letter= readCharKeyB();
}
}
static public char readCharKeyB() {
char res = '\n';
if (phrase!= null) {
res = phrase[indice++];
}
return res;
}
}
我必须阅读的文件的每一行都是这样的:
0001 #n人名#d地址
0002 ....
........
所以我必须阅读该行并提取名称,地址和代码。 我不知道怎么做,虽然我已经工作了好几天了。 这就是我所拥有的。它只是读取文件的一行并打印行中包含的Paraula对象,但我不知道如何从行中提取内容以便以后使用它们。我也不知道如何阅读下一行。
private void inicio() throws Exception {
lecturaFichero();
parseLine(lecturaFichero());
System.out.println("A partir de la base de datos de clientes de la empresa el programa se encargará de generar"
+ " cartas para cada uno de los clientes." + "\n");
}
public static void main(String[] args) throws Exception {
(new Práctica_Final()).inicio();
}
public static String lecturaFichero() throws Exception {
FileReader fr = new FileReader("datos_clientes.txt");
BufferedReader br = new BufferedReader(fr);
String linea = br.readLine();
br.close();
fr.close();
return linea;
}
private static void parseLine(String line) {
char[] whatever = line.toCharArray();
Paraula.phrase= whatever;
Paraula w;
int idx = 0;
while (whatever[idx] != '\n') {
w = Paraula.llegir();
System.out.println(w);
idx++;
}
}
}
答案 0 :(得分:0)
这是一个可以解析您的示例输入的实现:
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.LinkedList;
import java.util.List;
public class Parser {
public class Line {
private final int id;
private final String name;
private final String address;
public Line(int id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
return "id=" + id + ", name=" + name + ", address=" + address;
}
}
public static void main(String[] args) throws IOException {
Parser parser = new Parser();
parser.parse("path/to/file");
parser.printLines();
}
private final List<Line> lines = new LinkedList<Line>();
public void parse(String filename) throws IOException {
Files.lines(Paths.get(filename), StandardCharsets.UTF_8)
.forEachOrdered(this::parseLine);
}
private void parseLine(String line) {
String[] idAndRest = line.split("\\s*#n\\s*", 2);
int id = Integer.parseInt(idAndRest[0]);
String[] nameAndAddress = idAndRest[1].split("\\s*#d\\s*", 2);
String name = nameAndAddress[0];
String address = nameAndAddress[1];
lines.add(new Line(id, name, address));
}
public void printLines() {
for (Line line : lines) {
System.out.println(line.toString());
}
}
}
由于您的标识符命名,我完全不理解您的代码。因此,我没有使用它。此外,我不想解决你的大学任务,但帮助你了解它的工作原理。
此代码逐行读取输入文件。线分割由Files.lines()
方法完成。解析单行的工作方式如下:
#n
#n
是id #n
#d
分割部分
#d
是名称#d
之后是地址您可能希望在此处执行更好的错误处理,以确保该行的所有部分都是有效的。另外,请注意方法split()
的第二个参数,它是最大匹配数,因此生成的数组最多包含两个条目。
解析后,我只输出结果列表行。
答案 1 :(得分:0)
玛丽亚,斯蒂芬有一个很好的答案,我也发布了我的例子。 我在列表中读取文件并保留,名字,姓氏和地址。我们可以稍后检索它们。
package StackOverFlow;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JFileChooser;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
public class readNames{
String[] word;
ArrayList<String> names = new ArrayList<String>();
public static void main(String[] args){
readNames insta=new readNames();
insta.readFile();
}
void readFile(){
ArrayList<String> lines = new ArrayList<String>();
File file = new File("/home/fotis/Documents/test2.txt");
try {
Scanner sc = new Scanner(file);
//filePreview.append(sc.nextLine());
while (sc.hasNext()){
sc.useDelimiter("\n");
lines.add(sc.nextLine());
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("Fail to capture the file \n\n\nPlz try Again!! \n\nsorry");
}
int len=lines.size();
for(int i=0;i<len;i++){
String line=lines.get(i);
//word = line.split("\\s+");
word=line.split("#n|\\#d");
names.add(word[1]);
names.add(word[2]);
}
int lent=names.size();
for(int i=0;i<lent;i++){
System.out.println(names.get(i));
}
}
}
文件: 0001 #n迈克尔欧文#d利物浦队 0002 #n Michael Schumacher #d慕尼黑 0003 #n Michael Jackson #d Heavens 0004 #n Michael Jordan #d无法到达6芝加哥 0005 #n迈克尔凯恩#d伦敦
PS:别忘了更改为有效的文件路径(您的电脑,您的文件) PS 2:试一试,让它适合你的班级。