1

我被要求写一个作业,其中将提示用户输入一个键和/或一个值。

到目前为止,这是我的代码:

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

class bTree
{
    //Fields


    static Scanner input = new Scanner(System.in);

    static boolean done = false;

    public static void main(String args[])throws Exception
    {
        FileWriter fWriter = new FileWriter("data.txt");
        do
        {
            System.out.print("Enter command: ");
            String enter[] = input.nextLine().split(" ", 3);

            if(enter[0].toLowerCase().equals("insert"))
            {

                fWriter.write(enter[1] + "\n" + enter[2] + "\n");
                fWriter.flush();
            }
            else if(enter[0].toLowerCase().equals("select"))
            {
                FileReader fReader = new FileReader("data.txt");
                Scanner fileInput = new Scanner(fReader);

                while(fileInput.hasNext() && done == false)
                {
                    if(fileInput.nextLine().equals(enter[1]))
                    {
                        System.out.println(fileInput.nextLine());
                        done = true;
                    }
                    else
                    {
                        fileInput.nextLine();
                    }
                }
                done = false;
            }
            else if(enter[0].toLowerCase().equals("update"))
            {

                fWriter.write(enter[2]);
                fWriter.flush();
            }
            else if(enter[0].toLowerCase().equals("exit"))
            {
                System.exit(0);
            }
        }
        while(true);
    }
}

问题:当我打开 data.txt 时,没有空格。因此,如果我在记事本中输入“insert 1001 gen”和“10001 genny”,它将显示为“1001gen10001genny”。有什么建议么?

4

4 回答 4

1

问题是notepad.exe对行尾很挑剔,而且有很多可能性。当您写入"\n"aFileWriter时,它会写入一个字符,即'\n'. 但是记事本希望使用该序列"\r\n"。它显示单"\n"

这是您的代码,稍作修改以解决一些陷阱。

package so7696816;

import java.io.FileReader;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;

public class Excercise {

  public static void main(String args[]) throws Exception {
    final Scanner input = new Scanner(System.in);
    PrintWriter fWriter = new PrintWriter("data.txt");

    while (true) {
      System.out.print("Enter command: ");
      String enter[] = input.nextLine().split(" ", 3);
      final String command = enter[0].toLowerCase(Locale.ROOT);

      if (command.equals("insert")) {
        fWriter.println(enter[1]);
        fWriter.println(enter[2]);
        fWriter.flush();

      } else if (command.equals("select")) {
        FileReader fReader = new FileReader("data.txt");
        Scanner fileInput = new Scanner(fReader);
        while (fileInput.hasNextLine()) {
          String key = fileInput.nextLine();
          String value = fileInput.nextLine();
          if (key.equals(enter[1])) {
            System.out.println(value);
            break;
          }
        }
        fReader.close(); // don't leave files open

      } else if (command.equals("update")) {
        fWriter.write(enter[2]);
        fWriter.flush();

      } else if (command.equals("exit")) {
        return;

      } else {
        System.err.println("Unknown command: " + command);
      }
    }
  }
}

评论:

  • 我使用 aPrintWriter而不是 aFileWriter来使行尾正确。
  • 对于select命令,我在使用后关闭了fReader它。
  • 我避免enter[0].toLowerCase()多次打字。
  • 我使用了toLowerCase.
  • 我为未知命令添加了错误处理。
  • 我重写了select命令以使其更简洁。
于 2011-10-08T13:18:07.253 回答
0

问题是String enter[] = input.nextLine().split(" ", 3);,它杀死了空间。因此,在每个数组条目后附加一个空格或在每次使用时添加一个附加的“” fWriter.write

看这里

于 2011-10-08T12:40:04.537 回答
0

如前所述,换行符对于记事本不正确。或者,您可以将该 FileWriter 包装在 BufferedWriter 中,并使用 newLine 方法始终插入正确的换行符。

于 2011-10-08T18:59:23.940 回答
-1

我认为您正在 UNIX 中运行您的程序。在 unix 系统中,"\r\n" 是换行符。

如果您在 Windows 中运行程序,我认为该文件应该包含类似这样的内容。

1001

10001

珍妮

于 2011-10-08T13:14:39.020 回答