Java 在文件中查找字符串,然后复制其后的行

Java 在文件中查找字符串,然后复制其后的行,java,Java,这是我第一次张贴到这个网站,所以如果我得到任何格式错误,请对我轻松Lol 我正在编写一个Java程序,需要从清单中查找零件号,然后打印零件号及其后面的数据。代码只打印出文件顶部的信息,然后重复我的else语句5次 代码如下: package inventory; import java.util.Scanner; import java.io.*; public class inventory { public static void main(String[] args) throws

这是我第一次张贴到这个网站,所以如果我得到任何格式错误,请对我轻松Lol

我正在编写一个Java程序,需要从清单中查找零件号,然后打印零件号及其后面的数据。代码只打印出文件顶部的信息,然后重复我的else语句5次

代码如下:

package inventory;
import java.util.Scanner;
import java.io.*;

public class inventory 
{

public static void main(String[] args) throws IOException
{
    Scanner keyboard = new Scanner(System.in);

    // File Information
    String parts;
    File inventoryFile;
    FileWriter inventoryFW;
    PrintWriter inventoryPW;
    Scanner inventorySC;

    //User Information
    String userChoice;

    // Part Information
    String partID, partFileID, partFileDesc, partFileLoc, partDesc, partLoc;
    double partFilePrice, partPrice;
    int partFileQuan, partQuan;

    userChoice = ("A");

    // Loop
    if(userChoice.equalsIgnoreCase("Q"))
        System.exit(0);
    else
        while(!userChoice.equalsIgnoreCase("Q"))
        {
            // Get Employee Decision
            System.out.println("Please choose a letter: \n"
                               + "L - Look Up Part \n"
                               + "A - Add to Inventory File \n"
                               + "E - Erase From Inventory File \n" 
                               + "G - Generate a Sales Slip \n"
                               + "I - Add Quantity to Inventory File \n"
                               + "D - Display Inventory \n"
                               + "Q - Quit \n"
                               + "Selection: ");
            userChoice = keyboard.nextLine();

            // Process User Choice
            if(userChoice.equalsIgnoreCase("L"))
            { // Choice L
                // Look Up Part
                System.out.println("Enter Part I.D. Number: ");
                partID = keyboard.nextLine();

                // Do until partID is equal to partFileID
                parts = "inventoryFile.txt";
                inventoryFile = new File(parts);
                inventorySC = new Scanner(inventoryFile);

                partFileID = "0";
                partFileDesc = "0";
                partFilePrice = 0;
                partFileLoc = "0";
                partFileQuan = 0;


                while(inventorySC.hasNextLine())
                {
                    String lineFromFile = inventorySC.nextLine();
                    if(lineFromFile.contains(partID))
                    {

                        partFileDesc = inventorySC.nextLine();
                        partFilePrice = inventorySC.nextDouble();
                        inventorySC.nextLine();
                        partFileLoc = inventorySC.nextLine();
                        partFileQuan = inventorySC.nextInt();

                        System.out.println("Part I.D. Number: " + partFileID + "\n");
                          System.out.println("Part Description: " + partFileDesc + "\n"
                                   + "Part Price: " + partFilePrice + "\n"
                                   + "Part Location: " + partFileLoc + "\n"
                                   + "Part Quantity: " + partFileQuan);
                    }
                    else
                        System.out.println("Sorry, this part cannot be found");

                }
            }
          }
        }
    }  
这是我试图从中提取的数据文件:

1234567
Clutch
45.68
Warehouse B
8
1234
Brake
66.78
Warehouse A
4
例如,如果用户输入零件号“1234”,程序应在文件中搜索该零件号,然后显示:

1234
Brake
66.78
Warehouse A
4
对于任何糟糕的代码格式,我感到抱歉,我已经为此奋斗了一段时间。
任何帮助都将不胜感激

您的问题是,仅当零件列表不包含您的零件值时,才跳到下一行。如果零件不在“下一行”上,您实际上要跳过5行

在“else”语句中,只需调用inventorySC.nextLine();4次以上,以到达文件中实际要检查零件号的下一个位置

如果您希望“未找到”条件更有效地反映出实际上根本找不到零件号,则需要在扫描整个文件后将该消息移动到。在文件扫描之前,将名为“found”的布尔值设置为false。如果因为包含输入的文件中有零件号而输入“contains”条件,请将“found”设置为true


最后,如果“found”仍然为“false”,则可以输出“notfound”消息。

存在一些问题

  • 包含将有多个匹配项
  • 您将打印未找到的“未找到每一行”
  • 你并没有脱离这个循环


  • 正如MadProgrammer在上面所评论的,您需要使用“equals”而不是“contains”——这就是为什么您要在第一个条目上进行匹配。当您找到一个匹配项并输出它时,您需要使用“break”退出while循环,否则您将为剩余的每一行输出else值(正如您所经历的那样)。但还有一个问题是,当没有匹配项时,您可能需要读取整个记录,而不仅仅是记录的第一行,这样在搜索零件号1234时,当库存项目的数量为1234时,您就不会出错。

    1234567
    包含
    1234
    。。。也许考虑使用<代码>等于<代码>
    boolean found = false;
    while(inventorySC.hasNextLine()){
        String lineFromFile = inventorySC.nextLine();
        if(lineFromFile.equals(partID)) {       
         partFileDesc = inventorySC.nextLine();
         partFilePrice = inventorySC.nextLine();
         partFileLoc = inventorySC.nextLine();
         partFileQuan = inventorySC.nextLine();
    
          System.out.println("Part I.D. Number: " + partFileID + "\n");
                                  System.out.println("Part Description: " + partFileDesc + "\n"
                                           + "Part Price: " + partFilePrice + "\n"
                                           + "Part Location: " + partFileLoc + "\n"
                                           + "Part Quantity: " + partFileQuan);
                                  found = true;
                                 break;
                            }
                }
    
    if(!found)
        System.out.println("Sorry, this part cannot be found");