阅读文件的问题

时间:2016-06-20 16:37:05

标签: java file file-io

我正在尝试阅读此文件:

  

Distinguido / a cliente:

     

Le damos la bienvenida a nuestra empresa y deseamos que nuestra   relaciónseasiempre muy satisffactoria。

     

Muy atentamente,

     

El导演

并且必须这样做就好像文件中的单词是“Paraula”对象一样。 这是Paraula类:

public class Paraula {

    private static final int MAXIM = 900;
    public char[] lletres;
    public int longitud;
    public static boolean salto;

    /**
     * El constructor Paraula crea una objecte paraula de longitud 0 (buida)
     */
    public Paraula() {
        lletres = new char[MAXIM];
        longitud = 0;
    }

    /**
     * passa la paraula a cadena de caràcters
     * @return 
     */
    @Override
    public String toString() {
        String s = "";
        for (int i = 0; i < longitud; i++) {
            s += lletres[i];
        }
        return s;
    }

    /**
     * Afegeix una lletra que es passa com a paràmetre a la paraula
     * @param c
     */
    public void afegirCaracter(char c) {
        if (longitud < MAXIM) {
            lletres[longitud] = c;
            longitud++;
        }
    }

    /**
     * compara l'objecte amb la paraula passada per paràmetre
     * i retorna vertader si són iguals. És la cerca d'un caràcter diferent
     * @param p
     * @return
     */
//    public boolean esIgualA(Paraula p) {
//        int i = 0;
//        while (lletres[i] == p.lletres[i] && i < longitud) {
//            i++;
//        }
//        return lletres[i] == p.lletres[i];
//    }
    public boolean esIgualA(Paraula b) {
        boolean iguals = longitud == b.longitud;
        for (int idx = 0; (idx < longitud) && iguals; idx++) {
            iguals = lletres[idx] == b.lletres[idx];
        }
        return iguals;
    }



    /**
     * retorna vertader si la parula té longitud zero
     * @return
     */
    public boolean buida() {
        return longitud == 0;
    }
}

我有这门课来阅读文件:

public class FicheroPalabraIn {

    private int x;
    private FileReader fin = null;
    public static boolean salto;

    /**
     * El constructor FitxerParaulaIn crida al constructor de FileReader i
     * llegeix fins al principi de la primera paraula si n'hi ha cap o fins al
     * final de fitxer en cas contrari
     *
     * @param nom
     * @throws Exception
     */
    public FicheroPalabraIn(String nom) throws Exception {
        fin = new FileReader(nom);
        x = fin.read();
        principiParaula();
    }

    /**
     * tanca el fitxer de caràcters
     *
     * @throws Exception
     */
    public void TancaFitxer() throws Exception {
        fin.close();
    }

    /**
     * El mètode llegir retorna una paraula del fitxer, per això cerca el final
     * de la paraula, en aquest cas s'ha suposat que no hi ha signes de
     * puntuació diferents de blanc i que la paraula mai serà més gran del
     * previst. El programa és una cerca del final de la paraula Després de
     * llegir la paraula ens posicionam al principi de la següent o al fi de
     * fitxer
     *
     * @return
     */
    public Paraula llegir() throws Exception {
        Paraula p = new Paraula();
        char c = (char) x;

        while ((c != ' ') && (c != '\n') && (c != '\r') && (x != -1)) {
            p.afegirCaracter(c);
            x = fin.read();
            c = (char) x;
        }
        principiParaula();

        return p;
    }

    public Paraula llegirCarta() throws Exception { //in this method I use a boolean to indicate when it reads a \n but it doesn't work as expected
        Paraula p = new Paraula();
        char c = (char) x;
        while (x != -1) {
            x = fin.read();
            c = (char) x;
            if ((c == '\n') || (c == '\r')) {
                salto = true;

            } else {
                p.afegirCaracter(c);
            }
        }
        principiParaula();
        return p;
    }

    //---------------------------------------------------------------------------------
    public Paraula llegirNombre() throws Exception {
        Paraula p = new Paraula();
        char c = (char) x;

        while ((c != '#') && (x != -1)) {
            p.afegirCaracter(c);
            x = fin.read();
            c = (char) x;
        }
        principiParaula();

        return p;
    }

    public Paraula llegirDireccion() throws Exception {
        Paraula p = new Paraula();
        char c = (char) x;

        while ((x != -1) && (c != '\n') && (c != '\r')) {
            p.afegirCaracter(c);
            x = fin.read();
            c = (char) x;
        }
        principiParaula();

        return p;
    }
    //----------------------------------------------------------------------------------

    //El mètode principiParaula és privat i és una cerca del principi de paraula
    private void principiParaula() throws Exception {
        char c = (char) x;
        while (c == ' ' || c == '\n' || c == '\r') {
            x = fin.read();
            c = (char) x;
        }
    }

    /**
     * El mètode quedenParaules retorna vertader si no s'està al fi de fitxer
     *
     * @return
     */
    public boolean QuedenParaules() {
        return x != -1;
    }
}

问题是我需要读取文件,然后将内容写入另一个文件,但它不会读取“\ n”“\ r”,所以当我写它时,源文件出现在新文件中只有一行。如何使它“保存”或知道何时将char读取为'\ n'以将其写入新文件并仍然使用这种读取方法,就好像这些单词是Paraula对象一样?

谢谢

2 个答案:

答案 0 :(得分:0)

听起来你会想要使用readLine()类中的BufferedReader函数来逐行解析字符串并创建Paraula对象。

https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

答案 1 :(得分:0)

我想你正在初始化FicheroPalabraIn然后调用llegirCarta()。

此方法正确检测\ r和\ n,但它不会将它们存储在Paraula类型的对象中,只会将静态字段salto标记为true。

如果你想存储这些字符,请在这些情况下调用afegirCaracter()。

另一方面,文件中的第一个字符不是以这种方式存储的,它在对principiParaula()的调用中被遗忘了