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

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

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

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

Q&A

解決済

1回答

1271閲覧

ByteArrayOutputStream でIOException発生

riomakopa

総合スコア30

Java

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

0グッド

0クリップ

投稿2018/06/08 03:30

編集2018/06/08 03:59

前提・実現したいこと

'"#$%&'()?_+*,.<>[] 
上記のような文字をCSV出力したいのですが
どうすれば読み込めますでしょうか?

発生している問題・エラーメッセージ

java.io.IOException: null
at com.orangesignal.csv.CsvWriter.writeValues(CsvWriter.java:185) ~[orangesignal-csv-2.2.1.jar:2.2.1]
at com.orangesignal.csv.io.CsvEntityWriter.write(CsvEntityWriter.java:278) ~[orangesignal-csv-2.2.1.jar:2.2.1]
at com.orangesignal.csv.handlers.CsvEntityListHandler.save(CsvEntityListHandler.java:141) ~[orangesignal-csv-2.2.1.jar:2.2.1]
at com.orangesignal.csv.handlers.CsvEntityListHandler.save(CsvEntityListHandler.java:41) ~[orangesignal-csv-2.2.1.jar:2.2.1]
at com.orangesignal.csv.Csv.save(Csv.java:510) ~[orangesignal-csv-2.2.1.jar:2.2.1]
at com.orangesignal.csv.Csv.save(Csv.java:525) ~[orangesignal-csv-2.2.1.jar:2.2.1]
at com.orangesignal.csv.Csv.save(Csv.java:540) ~[orangesignal-csv-2.2.1.jar:2.2.1]

エラーメッセージ

該当のソースコード

java

1protected InputStream getInputStream(Map<String, Object> model, HttpServletRequest request) throws IOException { 2 3 @SuppressWarnings("unchecked") 4 List<SLDA00L0SalesTenantCsvBean> csvOutDataList = (List<SLDA00L0SalesTenantCsvBean>) model.get(this.getCsvDataSourceName()); 5 6 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 7 Csv.save(csvOutDataList, baos, this.getCsvEncoding(), this.createCsvConfig(), new CsvEntityListHandler<SLDA00L0SalesTenantCsvBean>(this.getBeanClass())); 8 InputStream is = new ByteArrayInputStream(baos.toByteArray()); 9 return is;

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

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

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

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

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

guest

回答1

0

ベストアンサー

CsvWriter#writeValues()のソースコードを見ると、

// 囲み文字が無効な場合に、項目値に区切り文字がある場合、エスケープします。 final String s = escapeSeparator(value); if (!value.equals(s) && cfg.isEscapeDisabled()) { throw new IOException(); } value = s;

↑ここでエラーが起こっているのが分かりますが、ここの「excapeSeparator(value)」も「isEscapeDisabled()」も引数渡しされた「this.createCsvConfig()」の結果を利用して処理しています。
今提示済みのソースからわかることは「『createCsvConfig()』の中身がおかしいのではないか」という程度です。

追記

以下、コメント(2018/06/08 13:33)に返信。

まず、コメント記載のソースコードを整形しておきます。

@Override protected CsvConfig createCsvConfig() { CsvConfig cfg = new CsvConfig(','); cfg.setLineSeparator("\r\n"); cfg.setNullString(""); cfg.setQuotePolicy(QuotePolicy.MINIMAL);

そのうえで、最初の回答から再度引用。

final String s = escapeSeparator(value); if (!value.equals(s) && cfg.isEscapeDisabled()) {

↑ちゃんと読めば、まず「cfg.isEscapeDisabled()がtrueを返しているからifブロックに入る」というのが分かります。

そのうえで、CsvConfigのソースコード、特に引数にcharのみを指定するコンストラクタに着目します。

/** * コンストラクタです。 * * @param separator 区切り文字 */ public CsvConfig(final char separator) { this(separator, DEFAULT_QUOTE, DEFAULT_ESCAPE, true, true); }

↑引数を5つ必要とする別のコンストラクタを呼び出していることが分かります。

/** * コンストラクタです。 * * @param separator 区切り文字 * @param quote 囲み文字 * @param escape エスケープ文字 * @param quoteDisabled 囲み文字を無効にするかどうか * @param escapeDisabled エスケープ文字を無効にするかどうか * @throws IllegalArgumentException {@code quote} または {@code escape} が {@code separator} と同一文字の場合 */ public CsvConfig(final char separator, final char quote, final char escape, final boolean quoteDisabled, final boolean escapeDisabled) { this.separator = separator; this.quote = quote; this.escape = escape; this.quoteDisabled = quoteDisabled; this.escapeDisabled = escapeDisabled; }

↑これにより、フィールド「escapeDisabled」にtrueが設定されてしまっている。これが問題とわかります。

解決するには「setEscapeDisabled(false)」してやればいいんじゃないかな、とたどり着けるわけですが、

このようになっています。

↑公開されているソースコードのURLが最初の回答からわかるんだから、自分で調べてみる、という手段はなかったのでしょうか?

投稿2018/06/08 04:27

編集2018/06/08 05:17
tkturbo

総合スコア5572

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

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

riomakopa

2018/06/08 04:33

createCsvConfig()の中身は @Override protected CsvConfig createCsvConfig() { CsvConfig cfg = new CsvConfig(','); cfg.setLineSeparator("\r\n"); cfg.setNullString(""); cfg.setQuotePolicy(QuotePolicy.MINIMAL); MINIMALは定数化されてて MINIMAL; このようになっています。
tkturbo

2018/06/08 05:18

コメントへの返信を回答に追記しました。
riomakopa

2018/06/08 05:26

あがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問