2015-01-07 5 views
1

사용자가 데이터를 입력 한 후 텍스트 파일에 데이터를 쓰고 텍스트 파일을 읽고 데이터를 표시하는 간단한 튜토리얼 프로그램을 만들고 있습니다. 그러나 모든 데이터가 텍스트 파일에 기록되는 것은 아닙니다. 다음을 참조하시기 바랍니다 :BufferedWriter가 모든 정보를 쓰지 않습니다.

이 내 코드입니다 : 당신이 볼 수 있듯이

package chasi.fecalMatter.ExcrementalProgram; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import javax.swing.JOptionPane; 

public class RedundantExcrement { 

    static String inputName = JOptionPane.showInputDialog("Please input your FULL name:"); 
    static String inputUsername = JOptionPane.showInputDialog("Please input your desired Username:"); 
    static String inputJobTitle = JOptionPane.showInputDialog("Please input your Job title:"); 
    static String inputSalary = JOptionPane.showInputDialog("Please input your monthly salary:"); 

    static int convertedSalary = 0; /*Convert salary from String to int*/ 
    static int benefitDeduction = 0; 

    static String empFileName = inputUsername+"INFO"; 
    static BufferedWriter bwriter = null; 

    public static void main (String[] args) throws IOException { 
     //Catch NumberFormatException. 
     try { 
      Integer.parseInt(inputSalary); 
     } catch (NumberFormatException nfEx) { 
      JOptionPane.showMessageDialog(null, "Please ensure that " + 
        "your salary is entered in NUMERIC form.", "ERROR!", 2); 
      return; 
     } 

     //Specify instructions as regard salary -to- Benefit deduction ratio 
     if (convertedSalary >= 3500) { 
      benefitDeduction = 300; 
     } else { 
      benefitDeduction = 180; 
     } 

    try { /*Catches IOException AND NullPointerException*/ 
      FileWriter fwriter = new FileWriter(empFileName); 
      bwriter = new BufferedWriter(fwriter); 

      bwriter.write(inputName); 
      bwriter.newLine(); 
      bwriter.write(inputJobTitle); 
      bwriter.newLine(); 
      bwriter.write(inputSalary); 
      bwriter.newLine(); 
      bwriter.write(benefitDeduction); 
      bwriter.newLine(); 
      bwriter.write("----------"); 
      bwriter.newLine();    
     } catch (IOException | NullPointerException ionpEx) { 
      JOptionPane.showMessageDialog(null, "An ERROR has occured", "ERROR!", 2); 
      return; 
     } finally { /*CLOSE the writer*/     
      try{ 
       if (bwriter != null) { 
        bwriter.close(); 
       } 
      } catch (IOException ioEx2) { 
       JOptionPane.showMessageDialog(null, "ERROR!"); 
       return; 
      } 
     } 
    } 
} 

, 나는 INT convertedSalary 변환하는 데 사용하는 사용자 입력 된 번호로 문자열에서 inputSalary. 내 방법에서는 내가 사용한다.

try { 
    Integer.parseInt(inputSalary); 
} catch (NumberFormatException nfEx) { 
    JOptionPane.showMessageDialog(null, "Please ensure that " + 
      "your salary is entered in NUMERIC form.", "ERROR!", 2); 
    return; 
} 

비밀리에 사용한다. 나중에 BufferedWriter에 의해 쓰여질 것으로 추측됩니다. 사용자의 급여의 값에 따라 내 benefitDeduction의 값을 변경하기 위해

try { 
    Integer.parseInt(inputSalary); 
} catch (NumberFormatException nfEx) { 
    JOptionPane.showMessageDialog(null, "Please ensure that " + 
       "your salary is entered in NUMERIC form.", "ERROR!", 2); 
    return; 
} 

:

나는이 코드가 있습니다.

그러나, benefitDeduction는 텍스트 파일에 기록되고, 대신에,이 얻을 : 당신이 도울 수 있다면 The result of running the program

감사합니다!

+1

'나는 또한이 코드는'이것은 복사 및 붙여 넣기 오류입니까? 그것은 위와 같은 코드를 포함합니다. – Tom

+0

어느 jdk를 사용하고 있습니까? 표준 Java에는'BufferedWriter.write (String)'메소드가 없습니다. 귀하의 코드가 실제로 컴파일됩니까? – Dima

+1

Btw :'convertedSalary'는'Integer.parseInt (inputSalary); '의 반환 값을 할당하지 않기 때문에 항상'0'으로 보입니다. 그리고 가변적으로'userSalary'는 없지만'inputSalary'는'2500 '을 세 번째 행으로 포함하고 있기 때문에 ('bwriter.write (inputSalary);') 파일에 쓰여진 것 같습니다. – Tom

답변

4

API을 살펴보십시오.

public void write(int c) 
    throws IOException 

는 단일 문자를 기입합니다. 기입 해지는 문자는, 지정된 정수 치의 하위 16 비트 인 에 포함되어 있습니다. 상위 16 비트 비트는 무시됩니다.

이것은 int가 실제로 char이며 유니 코드/ASCII 테이블에 따라 변환된다는 것을 의미합니다.

는 정수 값 bwriter.writer(String.valueOf(benefitDeduction));

+2

숫자 대신에 작은 따옴표가있는 것일 수 있습니다. – Ascalonian

+0

오케이. Só이 문제를 어떻게 해결합니까? –

+0

@MrChasi 업데이트 된 질문보기. – Jagger

0

귀하의 문제는 당신이 당신의 번호를 작성할 때,이 값을 텍스트가 아닌 숫자로 진수로 작성되고 있다는 점이다 사용 쓰기합니다. writer.write("" + myNumber);

+0

"myNumber"는 미리 정의 된 정수입니다. –

+0

@MrChasi 네, 미리 정의 된 내용에 따라 다릅니다. – ControlAltDel

4

코드에 두 가지 주요 문제점이 있습니다.

먼저 ParseInt의 값을 convertedSalary 변수에 할당하지 않은 것입니다. 따라서 항상 0이됩니다.

그런 다음 다시 파일에 convertedSalary을 쓰지 않습니다.

둘째로, 나는 BufferedWriter.write(int)PrintWriter.print(int) 사이에 혼란 스럽다고 생각합니다. BufferedWriter065535 사이의 문자 (또는 그렇지 않은 경우 하위 2 바이트에있는 문자)가 있으면이 정수로 표시되는 문자를 인쇄합니다.

정수가 예를 들어 65 인 경우 A 인 문자가 유니 코드의 65입니다.

아마도 BufferedWriter 대신 PrintWriter을 사용해야합니다. 또는 다른 답변이 제안한 것처럼 숫자를 문자열로 변환하십시오.

1

다른 답변에서 지적한대로 문제는 write(int)입니다. 그러나 전환을 걱정하는 대신 StringBuilder을 사용하여 텍스트를 먼저 작성하고 write(String) 한 번 통화하여 작성할 수 있습니다. 당신이하지 않아도 그런 식으로 benefitDeduction의 종류에 대해 걱정 :

final String inputName = "Tom"; 
final String inputJobTitle = "Developer"; 
final String inputSalary = "1337"; 
final int benefitDeduction = 180; 

try(final BufferedWriter bwriter = new BufferedWriter(new FileWriter("blub.txt"))) { 
    final StringBuilder builder = new StringBuilder(inputName); 
    builder.append("\n").append(inputJobTitle); 
    builder.append("\n").append(inputSalary); 
    builder.append("\n").append(benefitDeduction); 
    builder.append("\n----------\n"); 
    bwriter.write(builder.toString()); 
} catch (IOException | NullPointerException ex) { 
    JOptionPane.showMessageDialog(null, "An ERROR has occured", "ERROR!", 2); 
    return; 
} 

이 또한주의, 나는 BufferedWriter을 처리 할 수 ​​try-with-resources statement을 사용하는 것이다. 그것은 자원을 처리하고 당신을 위해 그것을 닫습니다. 수동으로 할 필요가 없습니다.

Tom 
Developer 
1337 
180 
---------- 

을 내가 이미 주석에 쓴대로 변수 convertedSalary에 새 값을 할당하지 않는 :

위의 코드는 파일 "blub.txt"에 다음 데이터를 기록.

변경 라인 :

Integer.parseInt(inputSalary); 

로는 :

convertedSalary = Integer.parseInt(inputSalary); 

그렇게 할 수 있습니다.

0

있는 Integer.parseInt의 JDK에서 인용 정수

반환 // (inputSalary) : 있는 Integer.parseInt을(); = "문자열 인수를 부호있는 10 진 정수로 구문 분석합니다. 문자열의 문자는 모두 10 진수 여야합니다. 단, 첫 번째 문자는 음수 값을 나타내는 ASCII 마이너스 기호 '-'('\ u002D')이거나 결과를 나타내는 정수 값은, 인수와 기수 10이 parseInt (java.lang.String, int) 인수에 지정된 것처럼 정확하게 돌려 주어집니다. 방법."

에 코드를 읽어야합니다

convertedInt =있는 Integer.parseInt (inputSalary);