2017-11-18 1 views
0

DBからデータを読み込み、コールバックを使用してDBからデータの各行を追加するのが好きです。私はコールバックが動作するように管理しましたが、どのようにデータをファイルに追加するのか分かりません。ここに私のコードです。コールバック付きファイルへの文字列の追加

メイン

public class Main { 

    public static void main(String[] args) { 

     FileIO fileIO = new FileIO(); 
     fileIO.writeRStoFile(); 
    } 
} 

FILEIO

public class FileIO implements DBAccess.CallBack { 

    public void writeRStoFile() { 

     DBAccess dbAccess = new DBAccess(this); 

     String fileName = "/result.csv"; 

     try (FileWriter fw = new FileWriter(fileName)) { 

      System.out.println("Starting data download from DB..."); 
      dbAccess.readDB(); 

      // HERE I LIKE TO APPEND EACH ROW TO THE FILE 
      fw.append('\n'); 

      System.out.println("Finished data download from DB..."); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void iAmDone(String row) { 
     System.out.println("Row: " + row); 
    } 
} 

DBACCESS

public class DBAccess { 

    public interface CallBack { 
     public void iAmDone(String row); 
    } 

    private final CallBack callBack; 

    public DBAccess(CallBack callBack) { 
     this.callBack = callBack; 
    } 

    public void readDB() { 

     String url = "jdbc:Cobol:////Dev/Project Files/DatAndCpyFiles"; 

     try (Connection con = DriverManager.getConnection(url, "", ""); 
      Statement stmt = con.createStatement()) 
     { 
      stmt.setFetchSize(10); 

      Class.forName("com.hxtt.sql.cobol.CobolDriver").newInstance(); 

      String sql = "select * from PROFS"; 

      ResultSet rs = stmt.executeQuery(sql); 

      ResultSetMetaData resultSetMetaData = rs.getMetaData(); 
      int iNumCols = resultSetMetaData.getColumnCount(); 
      for (int i = 1; i <= iNumCols; i++) { 
       callBack.iAmDone(resultSetMetaData.getColumnLabel(i) + ";"); 
      } 

      String field; 

      while (rs.next()) { 
       String row = ""; 
       for (int i = 1; i <= iNumCols; i++) { 

        field = rs.getString(i); 

        field = field.trim() + ";"; 

        row = row + field; 
       } 
       callBack.iAmDone(row); 
      } 

      rs.close(); 

     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
} 

私はwriteRStoFile()方法へiAmDone()からデータを取得するかどうかはわかりません。私はコンソールにデータを印刷することができます。

+0

これは問題ではありません。問題は 'iAmDone'を' fw.append'にリンクすることです。 – g3blv

答えて

1

私が考えることのできる1つの方法は、にメンバー変数としてfwを宣言することです。そうすれば、fw.append(...)iAmDoneに電話することができます。 (試用リソースを変更しなければならない場合があります)

関連する問題