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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Q&A

解決済

3回答

3186閲覧

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

boobooboo

総合スコア12

Java

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

0グッド

0クリップ

投稿2019/04/12 05:24

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; } }

コード

} }コード

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2019/04/12 05:54

dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2019/04/12 05:36

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 06:00

編集2019/04/12 06:10
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

boobooboo

2019/04/12 08:58

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

2019/04/14 02:07 編集

ただ、今回の場合はいいですが、 場合によってはy_waiwaiさんが仰っているような場合もあります。 例えばそもそもファイルがないとか、新規書き込みだけどファイルパスが違うとか、 違う場所に書いているとか、 書き込みたいデータそのものが空だったりする場合もありますね。 なので、パスが正確かどうかをチェックし、書き込むデータもチェックする。 っていう風にしてチェックしたほうがいいです。( デバッグ時 )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問