SlideShare a Scribd company logo
nioで作ったBufferedWriterに
変えたら例外になった
2016-2-13
第十四回 #渋谷java
自己紹介
島本 多可子(@chibochibo03)
株式会社ビズリーチ CTO室
普段はScalaを書いてます
GitBucketやってます
https://github.com/gitbucket/gitbucket
直近の著書です →
ある日
変更前
普通に生成していた
val charset: String = …
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(new File("...")), charset
)
)
変更後
深く考えずnioのFiles.newBufferedWriterに変更
val charset: String = …
Files.newBufferedWriter(
Paths.get("..."), Charset.forName(charset)
)
例外発生
Σ( ̄Д ̄;)なぬぅっ!!
java.nio.charset.UnmappableCharacterException
スタックトレース
Failed to import XML. java.nio.charset.UnmappableCharacterException: Input
length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:282)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:285)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
at java.io.BufferedWriter.close(BufferedWriter.java:265)
(´へ`;ウーム
(━_━)ゝウーム
ハッ (゚Д゚;)!!
どうやら化ける文字に対する扱いが異なるようだ
こんなテストコードを用意
// 通常版
def normal() = {
val charset = "EUC_JP"
val data = "Java"+ "u3030" +"Scala"
IO(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("...")), charset))).
using { writer =>
IO {
writer.write(data)
writer.flush()
}
}
}
こんなテストコードを用意
// 通常版
def normal() = {
val charset = "EUC_JP"
val data = "Java"+ "u3030" +"Scala"
IO(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("...")), charset))).
using { writer =>
IO {
writer.write(data)
writer.flush()
}
}
}
Javaで、EUC_JPで出力不可な文字
結果
// 変換できない文字は'?'に置換
Java?Scala
nioの場合
// nio版
def nio() = {
val charset = "EUC_JP"
val data = "Java"+ "u3030" +"Scala"
IO(Files.newBufferedWriter(Paths.get("..."), Charset.forName(charset))).using { writer =>
IO {
writer.write(data)
writer.flush()
}
}
}
結果
// 例外が発生し、出力もおかしなことに
JavaJava
(;¬д¬) アヤシイ
スタックトレース
Failed to import XML. java.nio.charset.UnmappableCharacterException: Input
length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:282)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:285)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
at java.io.BufferedWriter.close(BufferedWriter.java:265)
StreamEncoder.implWrite
CharsetEncoder.encodeの結果次第
CharsetEncoderはどうやって決まる?
newBufferedWriterの場合
newBufferedWriterの場合
newBufferedWriterでたどり着く先
エンコードエラー時の動作は指定なし
=> CodingErrorAction.REPORT
CodingErrorAction.REPORT
エラーが発生した時点で処理を中断し、エラーを報告する
従来の場合
従来でたどり着く先
不正入力エラー、マッピング不可エラー時の動
作指定あり
CodingErrorAction.REPLACE
エラーが発生した入力文字を指定した文字に置換して出力し、処理を継続する
デフォルトは「?」
設定されている置換文字列はreplacement メソッドで取得可能
(o゚∀゚)o キタ――♪
これが答え
CharsetEncoder.encode - 一部抜粋
newBufferedWriterの場合
従来の場合
まとめ
エンコードエラー時、置換文字による代替で処理を継続するか、エラーを通知してほしい
か、時と場合による
特に外部からのデータフィードの場合は、変な文字が紛れ込む
すぐに対応してもらえないことも・・・
nioのFiles.newBufferedWriterはエンコードエラー時に例外を投げるので注意

More Related Content

PPTX
フリーでできるWebセキュリティ(burp編)
PDF
マイクロにしすぎた結果がこれだよ!
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
Dockerからcontainerdへの移行
PDF
テスト文字列に「うんこ」と入れるな
PDF
僕がつくった 70個のうちの48個のWebサービス達
PPTX
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
フリーでできるWebセキュリティ(burp編)
マイクロにしすぎた結果がこれだよ!
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Dockerからcontainerdへの移行
テスト文字列に「うんこ」と入れるな
僕がつくった 70個のうちの48個のWebサービス達
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する

What's hot (20)

PDF
Riverpodでテストを書こう
PDF
人生がときめくAPIテスト自動化 with Karate
PDF
BuildKitの概要と最近の機能
PDF
例外設計における大罪
PDF
分散トレーシング技術について(Open tracingやjaeger)
PPTX
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
PDF
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
PDF
ソーシャルゲームのためのデータベース設計
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
PDF
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
PDF
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
目grep入門 +解説
PDF
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
PDF
CloudFormation/SAMのススメ
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PPTX
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話
PPTX
非同期処理の基礎
Riverpodでテストを書こう
人生がときめくAPIテスト自動化 with Karate
BuildKitの概要と最近の機能
例外設計における大罪
分散トレーシング技術について(Open tracingやjaeger)
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
ソーシャルゲームのためのデータベース設計
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
今日からできる!簡単 .NET 高速化 Tips
目grep入門 +解説
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
CloudFormation/SAMのススメ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話
非同期処理の基礎
Ad

More from chibochibo (14)

PDF
Tour of Apache PredictionIO in 10 Minutes
PDF
Crawler Commons
PDF
LocalStack
PDF
Deadly Code! (seriously) Blocking & Hyper Context Switching Pattern
PDF
Dynamic SQL in doobie
PDF
Is spark streaming based on reactive streams?
PDF
What is doobie? - database access for scala -
PDF
Quartzでcronを範囲検索したい
PDF
ビッグじゃなくても使えるSpark Streaming
PDF
Spark Streaming on AWS -S3からKinesisへ-
PDF
Spark in small or middle scale data processing with Elasticsearch
PDF
What's a macro?: Learning by Examples
PDF
Spring Boot Introduction
PDF
Slick入門
Tour of Apache PredictionIO in 10 Minutes
Crawler Commons
LocalStack
Deadly Code! (seriously) Blocking & Hyper Context Switching Pattern
Dynamic SQL in doobie
Is spark streaming based on reactive streams?
What is doobie? - database access for scala -
Quartzでcronを範囲検索したい
ビッグじゃなくても使えるSpark Streaming
Spark Streaming on AWS -S3からKinesisへ-
Spark in small or middle scale data processing with Elasticsearch
What's a macro?: Learning by Examples
Spring Boot Introduction
Slick入門
Ad

nioで作ったBufferedWriterに変えたら例外になった