Удаление текста из массива, созданного из файла в Java
Я относительно знаком с Java, и для личного проекта я пытаюсь написать программу, которая может принимать пользовательский ввод для записи в текстовый файл и удалять текст из строки (обозначенной индексом массива) из массива, построенного из тот же текстовый файл, так что когда вы распечатываете содержимое файла, то, что вы удалили, действительно удаляется.
Вот мой код, я прошу прощения за любые другие ошибки, которые я не вижу:
public class Writing {
Scanner input = new Scanner(System.in);
File customerFile = new File("Customers.txt");
String[] fileArray;
public Writing() throws IOException{
FileReader fileReader = new FileReader(customerFile);
BufferedReader bufferedReader = new BufferedReader(fileReader);
List<String> lines = new ArrayList<String>();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
lines.add(line);
}
bufferedReader.close();
fileArray = lines.toArray(new String[lines.size()]);
}
public void FileWrite() throws IOException {
String inputData = input.nextLine();
if (!customerFile.exists()) {
customerFile.createNewFile();
}
FileWriter fileWriter = new FileWriter(customerFile.getName(),true);
BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
bufferWriter.write(inputData + "\n");
bufferWriter.close();
System.out.println("Done.");
}
//Here is the one I have trouble with
public void RemoveFile() throws IOException {
LinkedList<String> cusList = new LinkedList<String>(Arrays.asList(fileArray));
System.out.println("Which one would you like to delete? [0-#].");
//then it prints the list so you can see what you want to delete
for(String x: cusList){
System.out.println(x);
}
String removeThis = input.nextLine();
int removeNum = Integer.parseInt(removeThis);
if()){ //if the user input contains the number that occurs as an index in the list
//not sure what to put here
fileArray = cusList.toArray(fileArray);
}else{
System.out.println("Remove failed.");
}
}
}
Я застрял, потому что, несмотря на другие прошлые попытки решить эту проблему, я получаю свое утверждение else или без изменений в текстовом файле.
РЕДАКТИРОВАТЬ: Вот основные попытки, которые я сделал, чтобы решить эту проблему, но безрезультатно. Это внутри класса RemoveFile().
Неудачный метод:
//tries to remove the element if it is found, before I decided to jusr remove the index
//example: if "Cocoa Powder" is typed in and it exists within the list of the array created from the file, remove it.
if(cusList.contains(removeThis)){
cusList.remove(removeThis);
cusList.toArray(fileArray);
}
//the else statement here saying that it failed
Неудачный метод 2:
//attempts to remove the content of the inputted index within the list
if(removeNum.equals(cusList.indexOf(removeNum))){
cusList.remove(removeNum);
cusList.toArray(fileArray);
}
//else statement would go here
Помогите!
Решение: я понял это, спасибо всем, кто помог, и понял, что более простое решение - очистить все содержимое текстового файла с помощью массива, созданного со всем содержимым, и затем записать его обратно в текстовый файл после всех изменений. Вот мой код:
// RemoveFile method
public void RemoveFile() throws IOException {
LinkedList<String> cusList = new LinkedList<String>(
Arrays.asList(fileArray));
System.out.println("Which one would you like to delete? Each customer is given a number [1-#].");
System.out.println("The file will change when program terminated.");
for (int i = 1; i < fileArray.length; i++) {
for (String x : cusList) {
System.out.println("Customer " + i + ": " + x);
i++;
}
}
String removeThis = input.nextLine();
int removedNum = Integer.parseInt(removeThis);
int removeNum = removedNum - 1;
if (removeNum >= 0 && removeNum < cusList.size()) {
cusList.remove(removeNum);
fileArray = cusList.toArray(fileArray);
PrintWriter writer = new PrintWriter(customerFile);
writer.print("");// clears the file contents
writer.close();
FileWriter fileWriter = new FileWriter(customerFile.getName(), true);
BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
for (String x : cusList) {
bufferWriter.write(x + "\n");
}
bufferWriter.close();
} else {
System.out.println("Index out of bounds, " + removeNum + " >= "
+ cusList.size());
}
Казалось, что это работает отлично, и предложение MadProgrammer заставило работать логику, вместо того, чтобы постоянно возвращать false и затем позволять программе извлекать данные из файла в массив, очищать содержимое массива, а затем записывать его обратно в файл.
2 ответа
custList
содержит список String
значения из файла, contains
всегда вернется false
в поиске равенства в матче (1 != "some string value"
например).
Вам нужно сделать что-то более похожее if (removeNum >= 0 && removeNum < cusList.size())
тогда вы знаете, что значение находится в пределах List
, вы можете просто использовать removeNum
удалить значение по заданному индексу, custList.remove(removeNum)
if (removeNum >= 0 && removeNum < cusList.size()) {
custList.remove(removeNum);
}else{
System.out.println("Index out of bounds, " + removeNum + " >= " + custList.size());
}
File inFile = new File("input.dat");
File outFile = new File("output.dat");
Scanner scan = new Scanner(inFile);
PrintWriter out = new PrintWriter(outFile);
while(scan.hasNextLine()) {
String line = scan.nextLine();
if(<criterion_to_determine_whether_to_keep_line_or_not>) {
out.println(line);
}
}
scan.close();
out.close();
В принципе, вы не должны пытаться редактировать файл, который вы получаете в качестве входных данных, а должны вместо этого написать новый файл с измененным выходным сигналом. Если вам действительно нужно, чтобы новый файл имел то же имя, что и старый файл, выполните File.renameTo() для обоих файлов.