2017-02-28 3 views
0

ユーザー入力を使用して区切られたテキストファイルから特定の行を削除します。これは私の現在のコードです(Java)の

import java.util.*; 
import java.io.*; 

public class Adding_Deleting_Car extends Admin_Menu { 

     public void delCar() throws IOException{ 
     Scanner in = new Scanner(System.in); 
     File inputFile = new File("inventory.txt"); 
     File tempFile = new File("myTemp.txt"); 

     BufferedReader reader = new BufferedReader(new FileReader(inputFile)); 
     BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile)); 

     String currentLine; 

     String lineToRemove; 
     System.out.println("Enter the VIN of the car you wish to delete/update: "); 
     lineToRemove = in.next(); 

     while((currentLine = reader.readLine()) != null) { 
      String trimmedLine = currentLine.trim(); 
      if(trimmedLine.equals(lineToRemove)) continue; 
      System.out.println(trimmedLine); 
      writer.write((currentLine) + System.getProperty("line.separator")); 
     } 
     writer.close(); 
     reader.close(); 
     boolean successful = tempFile.renameTo(inputFile); 
     System.out.println(successful); 
    } 
} 

私は、ユーザー入力に基づいてファイルからテキストの特定の行を削除したいと思います。例えば、これは私のテキストファイルです:

AB234KXAZ;Honda;Accord;1999;10000;3000;G

AB234KL34;Honda;Civic;2009;15000;4000;R

CD555SA72;Toyota;Camry;2010;11000;7000;S

FF2HHKL94;BMW;535i;2011;12000;9000;W

XX55JKA31;Ford;F150;2015;50000;5000;B

私は入力に自分の好きな文字列をユーザーが希望します、これはfになります列の最初のフィールド(例: XX55JKA31)、その行をファイルから削除します。私はいくつかのコードをオンラインで見つけましたが、私はそれをうまく使うことができませんでした。

私の現在のコードは、一時的なテキストファイルのすべてを書き換えているようですが、削除はしません。

+0

"私の現在のコードは、一時的なテキストファイルのすべてを書き換えるだけですが、削除しません。"では、この行は 'tempFile.renameTo(inputFile)'を何としていますか? –

+0

@Patrick Parkerそれは偽を返しますが、私はコードを他のところで手に入れたので、私は何を期待するべきかについてはあまり確信していませんでした。一時ファイルは、私が望む行を削除せずに元のファイルを再作成するだけです。 –

+0

Windows上で[信頼できるFile.renameTo()代替]の可能な複製?](http://stackoverflow.com/questions/1000183/reliable-file-renameto-alternative-on-windows) –

答えて

0

それはあなただけの最初の部分の代わりに削除したいVINに行全体を比較します。それを

if(trimmedLine.startsWith(lineToRemove)) continue; 

に変更してください。別の列と比較する場合は、代わりにString::containsを使用してください。パトリック・パーカーのように、File :: renameToの代わりにFiles.moveを使用すると、名前変更の問題が修正されます。

完全固定コード:

import java.util.*; 
import java.io.*; 
import java.nio.file.Files; 
import java.nio.file.StandardCopyOption; 



public class Adding_Deleting_Car{ 

     public static void main(String... args) throws IOException{ 
     Scanner in = new Scanner(System.in); 
     File inputFile = new File("inventory.txt"); 
     File tempFile = new File("myTemp.txt"); 

     BufferedReader reader = new BufferedReader(new FileReader(inputFile)); 
     BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile)); 

     String currentLine; 

     String lineToRemove; 
     System.out.println("Enter the VIN of the car you wish to delete/update: "); 
     lineToRemove = in.next(); 

     while((currentLine = reader.readLine()) != null) { 
      String trimmedLine = currentLine.trim(); 
      if(trimmedLine.startsWith(lineToRemove)) continue; 
      System.out.println(trimmedLine); 
      writer.write((currentLine) + System.getProperty("line.separator")); 
     } 
     writer.close(); 
     reader.close(); 
     Files.move(tempFile.toPath(), inputFile.toPath(), StandardCopyOption.REPLACE_EXISTING); 
    } 
} 

注私は継承しないクラス定義を変更し、メソッド定義メイン(文字列...引数)に、私は私のシステム上でコンパイルできること。

+0

これは一時ファイルを表示するときに機能しますが、元のファイルはエラーが発生したために更新できませんでした。 'スレッド内の例外" main "java.nio.file.FileSystemException:inventory.txt:それは、ファイルが別のプロセスで使用中であることを示しているようだ別のprocess.' –

+0

で使用されているため、プロセスはファイルにアクセスできません。ファイルを使用している可能性のあるアプリケーションを終了するか、システムをリブートしてください。 –

+0

私は正直見当もつかない。ファイルが別のクラスで更新される可能性がありますか?別のテキストファイルを作成すると動作しますが、これは、このDelete_Carクラスを動作させるために更新クラスが何らかの種類の複製を作成する必要があることを意味します。うーん... –

1

あなたはここに文書化されFile.renameToを、使用している: https://docs.oracle.com/javase/8/docs/api/java/io/File.html#renameTo-java.io.File-

文書によると、ファイルがすでに存在する場合、それが失敗することがあり、そしてあなたの代わりにFiles.moveを使用する必要があります。

はここFiles.moveと同等のコードです:

boolean successful; 
try { 
    Files.move(tempFile.toPath(), inputFile.toPath(), StandardCopyOption.REPLACE_EXISTING); 
    successful = true; 
} catch(IOException e) { 
    successful = false; 
} 

注:VINを検索 あなたのコードも間違っています。その問題に対する可能な解決法の1つについては、Jure Kolenkoの回答を参照してください。

今後は、実際のデータベースを使用してこのタイプの情報を保存および操作することを検討する必要があります。あなたのエラーが

if(trimmedLine.equals(lineToRemove)) continue; 

にある

+0

ありがとうございました!あなたの提案はうまくいったが、私は自分自身を修正する必要があるというわずかな問題に遭遇した。私は初心者ですので、これは、単なる練習ですが、私は将来的には、実際のデータベースに見てくださいよ。 –

関連する問題