質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    15843questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JAVAでCSV書き込みしたはずが白紙

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 173

boobooboo

score 4

javaでDAOを使って、データベース読み込みさせ、
そこからメインクラスでCSVファイルに書きこみするテストを作ったら
CSVファイルが白紙でnullエラーがでます。
どうにかしてCSVファイル書き込みしたいのですが、
よろしくお願いします。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

public class Main10 {

    /* dao呼び出し、データベース読み込み */
    public static void main(String[] args) throws IOException, SQLException, ParseException {

        File file = new File("C:\\\\\\\\output\\\\\\\\before.csv");

        if (file.mkdir()) {
            System.out.println("フォルダの作成に成功しました");
        } else {
            System.out.println("フォルダの作成に失敗しました");
        }

        Dao10 dao = new Dao10();
        List<Entity> list = new ArrayList<>();
        Entity entity = new Entity();

        List<Entity> sd = dao.findAll();


        for (Entity s : sd) {

            System.out.println(s.getName());
            System.out.println(s.getEmployeeId());

        }

        FileWriter f = new FileWriter("C:\\\\output\\\\before.csv", false);    

        for (Entity s1 : sd) {

            f.write(s1.getName());
            f.write(",");
            f.write(s1.getNameHiragana());
            f.write(",");
            f.write(s1.getBirthday());
            f.write(",");


        }


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Dao10 {

    public List<Entity> findAll() {

        List<Entity> list = new ArrayList<>();

        /* 事前準備(JAR配置を含む) */

        try {

            Class.forName("com.mysql.cj.jdbc.Driver");

        } catch (ClassNotFoundException e) {

            //JDBCドライバが見つからない場合の処理

            e.printStackTrace();

        }

        Connection con = null;

        try {

            con = DriverManager.getConnection(
                    "jdbc:mysql://127.0.0.1:3306/goods?characterEncording=UTF-8&serverTimezone=JST", "root", "");

            PreparedStatement pstmt = con.prepareStatement("SELECT* FROM employee_info WHERE employee_id >= ?");

            pstmt.setInt(1, 0);

            ResultSet rs;

            rs = pstmt.executeQuery();

            /* インスタンス化、ファイルの書き出し */

            while (rs.next()) {

                Entity sd = new Entity();

                sd.setEmployeeId(rs.getInt("employee_id"));
                sd.setName(rs.getString("name"));
                sd.setNameHiragana(rs.getString("name_hiragana"));
                sd.setBirthday(rs.getString("birthday"));
                sd.setSex(rs.getInt("sex"));
                sd.setMailAddress(rs.getString("mail_address"));
                sd.setTelephoneNumber(rs.getString("telephone_number"));
                sd.setCompanyInfoId(rs.getInt("company_info_id"));
                sd.setHireDate(rs.getString("hire_date"));
                sd.setEnrollmentYear(rs.getString("enrollment_year"));
                sd.setEnrollmentMonth(rs.getString("enrollment_month"));
                sd.setEnrollmentDay(rs.getString("enrollment_day"));

                list.add(sd);





            }

            rs.close();
            pstmt.close();

        }

        catch (SQLException e) {
            //例外発生時の処理

            e.printStackTrace(); //エラー内容をコンソールに出力する

        } finally {

            /* データベース接続の切断 */

            if (con != null) {

                try {

                    con.close();

                } catch (SQLException e) {

                    //接続失敗時の処理

                    e.printStackTrace();

                }

            }

        }
        return list;

    }

}

コード

    }

}コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

mainメソッドが途中で切れてるので推測ですが、FileWriterをcloseしていないのではないですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

(見切れているため)でたらめですが、
ブロックから抜けたら f.close() を呼び出してみてください。

言語によりますが、ファイル入出力のread系はまだいいけど、write系はclose系でとじないと反映されないことがあります。

closeで生成する感じですね。
(厳密には違うだろうけど。)

なので close系を呼び出してみてください。


[追記0]

一応根拠を書いておきます。

まず、C言語ではファイルの書き込みは、

  1. ファイルを開く
  2. <書き込み>
  3. ファイルを閉じる

という処理でやります。

ファイルを開くのはfopen関数と呼ばれる関数で開き、ファイルポインタと呼ばれるものを取得します。
これにファイルがどこまで読み込まれた/書き込まれたかとかの情報が入っているようです。

このファイルポインタを書き込み系の関数 ( fwrite関数だった気が ) に渡して書いてもらう。

そしてファイルポインタをfclose関数と呼ばれる関数に渡して閉じてもらう。

これが一連の処理。

で、多分だけど、Javaでは Fileクラスだっけ? あれで fopen関数に相当する処理をして、ファイルポインタに相当するものを保持。

そしてFileWriterクラスだっけ? それで書き込むときに...

とやっているはず。

あまりJavaは使っていないので詳しくはわかりませんが。

C++であれば デストラクタと呼ばれる、コンストラクタの反対の動きをするものがありますから、close系メソッドを呼び出さなくても自動的にやると思いますが、

Javaではそんなものないので、自分でclose系を呼び出さないといけない。

これをやっていないから 何も書かれていないファイル になるのではないかと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/12 17:58

    ありがとうございます。
    おっしゃる通りで、closeが抜けていたためできませんでした。
    大変助かりました。

    キャンセル

  • 2019/04/14 11:06 編集

    ただ、今回の場合はいいですが、
    場合によってはy_waiwaiさんが仰っているような場合もあります。

    例えばそもそもファイルがないとか、新規書き込みだけどファイルパスが違うとか、
    違う場所に書いているとか、
    書き込みたいデータそのものが空だったりする場合もありますね。

    なので、パスが正確かどうかをチェックし、書き込むデータもチェックする。

    っていう風にしてチェックしたほうがいいです。( デバッグ時 )

    キャンセル

0

まずは、書き込みのときにどういうデータを渡しているのか表示させるなりしてみればどうでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    15843questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。