使用给定的类读取文件

时间:2016-02-02 21:38:57

标签: java file file-io

我正在开发一个程序,主要是使用(强制性)此类来读取文件的行:

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++;
        }
    }
}

2 个答案:

答案 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:试一试,让它适合你的班级。