2016-10-16 2 views
0

私は入出力ファイルを作成しようとしていますので、アプリケーションの開始時にファイルを読み込んで適切な場所に情報を入れてください。アプリでは、私はこのファイルに情報を追加することができます。ファイル内の奇妙なことを読んで印刷するJava

問題は「1」のような本当に奇妙なことを読み書きすることです。これは私の読書機能である:

private Vector<GEPlayer> ReadPlayers() { 
    Vector<GEPlayer> play_aux = new Vector<>(); 
    String path = System.getProperty("user.dir"); 

    try { 
     File fread = new File(path + "/bin/Players.txt"); 
     System.out.println(fread.length()); 
     if (fread.length() > 3) { 
      BufferedReader bread = new BufferedReader(new InputStreamReader(new FileInputStream(fread), "ISO-8859-1")); 
      String linea; 
      int i = 0; 

      while ((linea = bread.readLine()) != null) { 
       GEPlayer p_aux = new GEPlayer(-1); 
       if (linea != null) { 
        switch (i) { 
         case 0: 
          currentidplayer = Integer.parseInt(linea); 
          p_aux.setId_player(currentidplayer); 
          System.out.println("GEModel -- ReadPlayers -- Readed Player ID: " + currentidplayer); 
          i++; 
          break; 
         case 1: 
          currentidteam = Integer.parseInt(linea); 
          p_aux.setId_team(currentidteam); 
          System.out.println("GEModel -- ReadPlayers -- Readed Player Team ID: " + currentidplayer); 
          i++; 
          break; 
         case 2: 
          p_aux.setName(linea); 
          System.out.println("GEModel -- ReadPlayers -- Readed Player Name: " + linea); 
          i++; 
          break; 
         case 3: 
          p_aux.setSurname(linea); 
          System.out.println("GEModel -- ReadPlayers -- Readed Player Surname: " + linea); 
          i++; 
          break; 
         case 4: 
          p_aux.setNacionality(linea); 
          System.out.println("GEModel -- ReadPlayers -- Readed Player Nacionality: " + linea); 
          i++; 
          break; 
         case 5: 
          p_aux.setActualTeam(linea); 
          System.out.println("GEModel -- ReadPlayers -- Readed Player Actual Team: " + linea); 
          i++; 
          break; 
         case 6: 
          p_aux.setBornDate(linea); 
          System.out.println("GEModel -- ReadPlayers -- Readed Player Born Date: " + linea); 
          i++; 
          break; 
         case 7: 
          p_aux.setNumber(Integer.parseInt(linea)); 
          System.out.println("GEModel -- ReadPlayers -- Readed Player Number: " + linea); 
          play_aux.add(p_aux); 
          i = 0; 
          break; 
        } 
       } 
      } 
      if (i != 0) { 
       currentidplayer = 0; 
       play_aux.removeAllElements(); 
      } 
     } 

    } catch (FileNotFoundException | UnsupportedEncodingException ex) { 
     Logger.getLogger(GEModel.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(GEModel.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return play_aux; 
} 

そして、これは私の書き込み機能である:

private void writePlayer(GEPlayer aux) { 
    File fw; 
    BufferedWriter bw = null; 

    try { 
     String path = System.getProperty("user.dir"); 
     fw = new File(path + "/bin/Players.txt");   ///< The true will append the new data 
     FileOutputStream fos = new FileOutputStream(fw); 
     bw = new BufferedWriter(new OutputStreamWriter(fos)); 
     bw.write(aux.getId_player());       ///< Appends the string to the file 
     System.out.println("GEModel -- writePlayer -- Printed: " + aux.getId_player()); 
     bw.newLine(); 
     bw.write(aux.getId_team());        ///< Appends the string to the file 
     System.out.println("GEModel -- writePlayer -- Printed: " + aux.getId_team()); 
     bw.newLine(); 
     bw.write(aux.getName());        ///< Appends the string to the file 
     System.out.println("GEModel -- writePlayer -- Printed: " + aux.getName()); 
     bw.newLine(); 
     bw.write(aux.getSurname());        ///< Appends the string to the file 
     System.out.println("GEModel -- writePlayer -- Printed: " + aux.getSurname()); 
     bw.newLine(); 
     bw.write(aux.getNacionality());       ///< Appends the string to the file 
     System.out.println("GEModel -- writePlayer -- Printed: " + aux.getNacionality()); 
     bw.newLine(); 
     bw.write(aux.getActualTeam());       ///< Appends the string to the file 
     System.out.println("GEModel -- writePlayer -- Printed: " + aux.getActualTeam()); 
     bw.newLine(); 
     bw.write(aux.getBornDate());       ///< Appends the string to the file 
     System.out.println("GEModel -- writePlayer -- Printed: " + aux.getBornDate()); 
     bw.newLine(); 
     bw.write(aux.getNumber());        ///< Appends the string to the file 
     System.out.println("GEModel -- writePlayer -- Printed: " + aux.getNumber()); 
     bw.newLine(); 
     bw.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(GEModel.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     try { 
      bw.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(GEModel.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

私はTXTに情報せずにプログラムを実行すると、私は完全にすべてのものを読むことができる、それが正しい情報を表示しますその情報が正しいことを私に伝えます。

Exception in thread "main" java.lang.NumberFormatException: For input string: "1" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 
at java.lang.Integer.parseInt(Integer.java:615) 
at GEModel.GEModel.ReadPlayers(GEModel.java:55) ///< This line is this: "currentidplayer = Integer.parseInt(linea);" 
at GEModel.GEModel.<init>(GEModel.java:34) 
at GEMain.GEMainClass.main(GEMainClass.java:22) 

のJava結果:私はアプリを再起動すると、しかし、それは私がこのようなエラーがスロー1

私はこの問題を解決するために何ができますか?

+0

ヒント:原則「抽象の単一層」について読んを。おそらく一般的には「クリーンコード」についてです。あなたの貧弱な方法はあまりにも多くのことをやっています。それはあなたが自分のものを読むのを難しくします。それが他人のためにあるべきであるよりはるかに困難です。 – GhostCat

+0

最初からやり直してください。 1つのアイテムをファイルに書き込んで、そのアイテムを読むことができるかどうかを確認します。あなたが1つの項目を書いたり読んだりするのに成功すると、2つの項目に移動します。すべてのアイテムを書き込んで読み込むまで、この方法を続けます。この方法で、あなたが書いた項目を読むのに問題があるとき、問題はあなたのコードに追加した最新の項目で最もよく起こります。 –

+0

あなたの実装に 'GEPlayer'を追加しました – krzydyn

答えて

0

これは、読んだときに明示的なエンコードを設定するためです。しかし、書かないとデフォルトのものが使われます - 通常はUTF-8です。

書き込み時と読み取り時に同じテキストエンコードを使用します(UTF-8が最適です)。

単純なもので試してみてください:

File f=new File("/tmp/test.txt"); 
    try (FileOutputStream fos=new FileOutputStream(f)){ 
     int id=1; 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos,"UTF-8")); 
     bw.write(String.valueOf(id)); //write player id 
     bw.newLine(); 
     bw.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try (FileInputStream fis=new FileInputStream(f)){ 
     BufferedReader br = new BufferedReader(new InputStreamReader(fis,"UTF-8")); 
     String idstr=br.readLine(); 
     System.out.printf("readstr: '%s'\n",idstr); 
     int id=Integer.parseInt(idstr);  // parse player id 
     System.out.printf("parse id: '%d'\n",id); 
     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

私はそれを試みましたが、それはまだ奇妙なことを書いているので、他のことが起きているようです... –

+0

' aux.getId_player '。 'bw.write'に' String'が必要です – krzydyn

+0

ありがとう!それは正常に動作しませんが、これはいくつかの異なる問題を解決したので、ありがとう! –

関連する問題