Замена всех букв и знаков равенства на пробел

Я пытаюсь удалить все буквы из текстового файла, содержащего случайные числа и буквы, используя этот код

package textEdit;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class RemoveLetters {



    public static void readFile(String file) {
        try {
            FileReader fis = new FileReader(file);
            BufferedReader reader = new BufferedReader(fis);
            FileWriter writer = new FileWriter(file);
            BufferedWriter bwriter = new BufferedWriter(writer);
            String line = null;

            while ((line = reader.readLine()) != null) {
                for (int i = 0; i < symbolsAndLetters.length; i++) {
                    String str = symbolsAndLetters[i];
                    str = str.replace(str, ""); 
                }
            }
            reader.close();
            bwriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }   

    public static String[] symbolsAndLetters = {"A", "B", "C",
        "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 
        "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y",
        "Z", "=","a", "b", "c", "d", "e", "f", "g", "h", "i", 
        "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
        "u", "v", "w", "x", "y", "z",};

    /**
     * @param args
     */

    public static void main(String[] args) {
        readFile("c:/users/Kyle/workspace/Learn more java/src/music.txt");
    }

}

Проблема в том, что он удаляет все из файла, я очень новичок в чтении и записи на Java, поэтому может ли кто-нибудь помочь мне понять, что я делаю неправильно?


person Ravekitty    schedule 02.10.2013    source источник
comment
Как вы думаете, что делает эта строка - str = str.replace(str, "");?   -  person Rohit Jain    schedule 03.10.2013
comment
Вы не заменяете строку и не записываете изменения в файл.   -  person Sotirios Delimanolis    schedule 03.10.2013
comment
также имейте в виду, что замена на месте обычно невозможна для файлов   -  person Andreas    schedule 03.10.2013
comment
(но вы всегда можете загрузить в память, а затем заменить, как здесь)   -  person Andreas    schedule 03.10.2013


Ответы (3)


Вот что вы на самом деле делаете в своем цикле while (читайте комментарии):

// iterating over the items of your own static array (without fast enumeration)
for (int i = 0; i < symbolsAndLetters.length; i++) {
    // initializing a new String and assigning it the value of your array
    // that is currently indexed in your for-loop
    String str = symbolsAndLetters[i];
    // replacing the String's content by replacing its value 
    // (1st parameter, the "str" value itself)
    // with an empty String
    str = str.replace(str, ""); 
}

Это строго ничего не дает.

Вот что вы хотите сделать.

  • Назначьте вашего писателя новому файлу. Вы всегда можете заменить оригинал впоследствии.
  • Или лучше просто используйте StringBuilder и замените содержимое оригинала toString представлением StringBuilder после закрытия исходного ридера.
  • Удалите бесполезный массив "characters" String
  • Используйте регулярное выражение как таковое:

    // your outer loop iterating over each line of your input file
    
    while ((line = reader.readLine()) != null) {
    
        // writing a new String representing the line read from the
        // original,
        // but replacing each of its alphabetic characters (through regex)
        // with an empty String
        writer.write(line.replaceAll("\\p{Alpha}", ""));
    }
    
person Mena    schedule 02.10.2013

Я бы создал новый файл для записи вывода. Здесь я просто добавляю к нему слово "новый".
-- FileWriter author = new FileWriter(file + "new");

Затем используйте регулярные выражения для замены нужных символов
-- line=line.replaceAll("[a-zA-Z]", "");

Затем добавьте его в новый файл:
-- bwriter.append(line +"\n");

person Tony    schedule 02.10.2013

Внутри вашего цикла while после цикла for вы должны записать строку обратно в файл.

Когда цикл переходит на следующую строку, он теряет все в str.

Вы уже открываете поток вывода файла, но никогда ничего в него не записываете. Он не все перезаписывает, он ничего не записывает.

person Matt Clark    schedule 02.10.2013
comment
На самом деле он перезаписывает все, в основном создает новый пустой файл. - person Sotirios Delimanolis; 03.10.2013
comment
Я не проверял, но можете ли вы одновременно писать обратно в файл, который вы читаете? Может быть, я старая школа, но я бы написал во временный файл, когда закончу, закрою оба файла, удалю оригинал и переименую временный файл обратно на его место. - person MadProgrammer; 03.10.2013
comment
Если вы прочитаете ссылку из комментария к ОП, вы увидите, что нужно сделать запись во временный файл и переместить его, когда закончите. - person Matt Clark; 03.10.2013