2017-11-18 14 views
0

주 수업에서 프로그램을 실행 한 후 완전히 건너 뛴다는 이유가 확실하지 않습니다.File/FileWriter/Scanner 클래스를 통해 텍스트 파일에 사용자 이름이 있는지 확인하는 방법

while(usernameCheck.hasNext()){ 
    //code... 
} 

나는 이미 "accounts.txt"파일에있는 사용자 이름을 의도적으로 넣었지만 루프합니다. 나는 또한 contains() 방법을 시도했지만 분명히 내가 넣어 경우는 "John1"와 "요한이"내 accounts.txt 파일에 이미 말할 수, 내 코드 I를 읽은 후 *** 그것을

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

public class CreateAccount { 

public static void newAccount() throws IOException{ 

    Scanner keyboard = new Scanner(System.in); 
    FileWriter fw = new FileWriter("accounts.txt",true); 
    PrintWriter pw = new PrintWriter(fw); 


    System.out.println("Please enter a username: "); 
    String user = keyboard.nextLine(); 

    File file = new File("accounts.txt"); 
    Scanner usernameCheck = new Scanner(file); 

    while(usernameCheck.hasNext()){ 
     String existingUsername = usernameCheck.nextLine(); 

     if(user.equalsIgnoreCase(existingUsername)){ 

      System.out.println("Username already exists"); 
      System.out.println("Please enter a username: "); 
      user = keyboard.nextLine(); 
     } 
    } 

    System.out.println("Please enter a password: "); 
    String pass = keyboard.nextLine(); 

    System.out.println("Account created!"); 

을 수락하지 않습니다 나는 또 다른 문제가 있다는 것을 깨닫는다 : "accounts.txt"클래스에 존재하지 않는 사용자 이름을 만들지 만, hasNext() 메소드로 인해 사용자 이름이 이미 존재한다는 프롬프트를 계속 반복 할 것이다. 이것에 대해 내가 뭘 할 수 있니?

+0

? 디버거가 있습니까? 그렇다면 코드를 단계별로 실행하여 수행중인 작업을 확인하십시오. –

+0

@Ken White Eclipse를 사용하고 있습니다 – Sweetcharge

+0

그렇다면 디버거가 있습니다. 맞습니까? 같은 파일에서'FileWriter'와'Scanner'를 동시에 열 때 어떤 문제가 생길지 생각해 봤습니까? –

답변

0

나는이를 던지고 시험했다. 그것은 나를위한 이름을 찾는다. 내가 추측 할 수있는 것은 파일 경로가 사실이 아니라는 것입니다.

File file = new File("accounts.txt"); 

이 텍스트 파일의 전체 경로를 찾는 것으로 시작하십시오. 전체 경로를 입력 한 다음 경로를 상대적으로 어떻게 만들 수 있는지 확인하십시오.

이 정보가 도움이되기를 바랍니다.

+0

내 문제가 무엇인지 알았습니다. 코드는 내 src 폴더와 내 패키지 폴더에 "accounts.txt"파일을 만듭니다. 이 문제의 원인이 무엇인지 아십니까? – Sweetcharge

+0

이전 답변에서 귀하의 의견에 관하여 : 그 밖에 내가 뭘 할 수 있을까요? 질문은 명백한 저품질이었습니다. 그리고 당신의 대답은 아무런 설명이 없었습니다. 그것은 단지 코드 덤프였습니다. 끔찍한 질문에 대한 훌륭한 해답을 얻었을 때, 그리고 제가 투표 한 사람들에게 큰 해답을 얻었지만 그 해답은 원래의 포스터의 문제점과 해결 방법에 대한 훌륭한 설명을 제공하는데 초점을 맞추고 있습니다. 대답은 원래의 포스터 (OP)뿐 아니라 앞으로이 사이트를 방문하는 모든 사람들에게 도움이된다는 것입니다. 귀하의 코드 덤프 대답보다 조금 더 그래서 어떤 방법 으로든 ... –

+0

... 그것은 당신이 낮은 품질 보았다. –

-1

아래에 표시된 코드와 코드 사이의 차이는 분명합니다. 사용자가 이미 다음 사용자가 수있는 accounts.txt 파일에 포함 된 사용자 이름을 입력하면

  • : 사용자에게 프롬프트는 적어도 두 가지 이유 while 루프 블록 내에 포함된다 그러한 사실을 통보 받고 다른 사용자 이름을 입력 할 수있는 기회가 주어져야합니다. 암호 프롬프트에도 동일하게 적용됩니다. 유효하지 않은 암호가 제공되면 (아무 것도없는 것처럼) 사용자에게 알리고 올바른 암호를 입력 할 수있는 기회가 주어집니다.
  • 사용자가 실제로 사용자 이름 또는 암호를 입력하도록하려면

물론 파일 작성과 관련이 없지만 실제로 파일에 쓸 내용이 있는지 확인하기 위해 사용자에게 옵션을 향상시킵니다.

여기, 방법은 Scanner.hasNext() 방법 대신에 사용된다()을 Scanner.hasNextLine을 accounts.txt 파일을 읽고하는 것은 이유 :

Scanner.hasNext() 메소드는Scanner.next() 방법 및이 방법 Scanner.nextLine() 메소드 작동하도록 기입된다()를 Scanner.hasNextLine 작동에 기록된다.

Scanner.next() 메서드는 토큰 구분 기호로 사용되는 구분 기호와 함께 작동합니다. 기본적으로 스캐너는 공백을 토큰 구분 기호로 사용하므로 공백으로 구분 된 성 (姓)을 가질 수있는 사용자 이름을 읽는 경우 2 개의 토큰 (이름 및 성)을 제공하므로 2 스캐너로 걸려 오는 전화.다음() 전체 사용자 이름을 가져 오는 방법 (각 단어 당 하나씩). 파일에 빈 줄이 있거나 파일의 사용자 이름 앞에 공백이 있으면 지금 필요한 항목을 생각하십시오.

Scanner.nextLine() 메서드는 텍스트의 전체 파일 줄을 읽으므로 한 번의 호출로 파일에서 User Name을 읽습니다. 어떤을 제거하기 위해

String existingUsername = usernameCheck.nextLine().trim();

이 이루어집니다 : 당신은 또한 나는 또한 String.trim()을 Scanner.nextLine() 방법의 끝에 방법을 적용한 것을 볼 수 파일 행의 맨 앞이나 뒤의 탭 또는 공백이있는 경우. Scanner.nextLine() 메서드는 String을 반환하기 때문에이 작업을 수행 할 수 있습니다. 오 ... Scanner.hasNext() 메서드를 사용하면 루프가 건너 뛴 이유 일 수 있습니다.

메커니즘

"사용자 이름을 입력합니다" 프롬프트에서()
방법 사용자가 newAccount를 종료 할 수 있도록 코드에 배치되었습니다. 이 메시지에서 q 문자가 제공된 경우이 메서드는 return과 함께 종료됩니다. 성명.

앞서 언급했듯이 암호 프롬프트는 내에 있고 루프에 배치되어 정렬의 유효성 검사를 수행 할 수 있습니다. 현재 비밀번호에 실제로 무언가가 포함되어 있는지 확인하는 경우에만 가능하지만 원하는 비밀번호 유형 유효성 검사를 포함하도록 확장 될 수 있습니다. 아마도 특정 문자 유형을 포함하는 특정 길이의 비밀번호 등이 여기에

코드는 다음과 같습니다

당신은 당신의 코드를 작성하는 데 사용하는 어떤 IDE
public static void newAccount() throws IOException { 
    Scanner keyboard = new Scanner(System.in); 
    File file = new File("accounts.txt"); 
    FileWriter fw = new FileWriter(file, true); 
    Scanner usernameCheck = new Scanner(file); 
    String user = ""; 
    while (user.equals("")) { 
     System.out.println("Please enter a User name (q to exit): "); 
     user = keyboard.nextLine().trim(); 
     if (user.toLowerCase().equals("q")) { 
      System.out.println("User Exit!"); 
      return; // exit the method. 
     } 
     while (usernameCheck.hasNextLine()) { 
      String existingUsername = usernameCheck.nextLine().trim(); 
      if (user.equalsIgnoreCase(existingUsername)) { 
       System.err.println("Username already exists! Try Again.\n"); 
       user = ""; 
       break; 
      } 
     } 
    } 
    usernameCheck.close(); // Close the Scanner file object 
    String pass = ""; 
    while (pass.equals("")) { 
     System.out.println("Please enter a password for " + user + ": "); 
     pass = keyboard.nextLine(); 
     if (pass.equals("")) { 
      System.err.println("Invalid Password! Try Again.\n"); 
     } 
    } 

    fw.write(user + System.lineSeparator()); 
    fw.write(pass + System.lineSeparator()); 
    fw.close(); // close the FileWriter object. 

    System.out.println("Account created!"); 
} 
+0

나는 내가 한 일과 당신이 한 일 사이에 어떤 차이가 있는지 물어볼 수 있었습니까? 필자는 파일 쓰기와 그와 같은 미래의 레퍼런스를 알고 싶다. – Sweetcharge