Java: UnixでJavaプログラムを動かした時にはまった思い出
プログラマになって間もない頃、単純なOracleへのデータ連携用プログラムを担当しました。
処理はShift_JISのCSVファイルをいくつか値を変換してOracleにロードするものだったので、通常は、
1.Oracleへワークテーブルを用意し、
2.「sqlldr」でデータを投入後、
3.PL/SQLで変換して目的のテーブルにデータを入れる
という処理でいいのですが、Java+JDBCで頑張っていました。理由は覚えていません。
開発はWindowsのPCで、実行はUnix環境だったのですが、その時にはまった思い出になります。
はまった内容
- Windowsでjavaコマンドのクラスパスの区切りはセミコロン (;) ですが、Unixではコロン (:) となる
- FileReaderを使っていたため、WindowsではShift_JISでも、Unixでは別のエンコーディングとなる。(その時のUnixではUTF-8でした)
1は、見よう見まねで作成したシェルでjavaコマンドの実行がエラーとなり相当焦ってたような記憶があります。
1つうまくいかないと、それまでの作業全てを疑いはじめてしまい、シェルの書き方が違うのではないか、WindowsでコンパイルしたクラスをそのままUnixに持っていったのが悪いのではないか、持って行くときにおかしな変換がされてしまったのではないかなど疑心暗鬼でいっぱいになりました。
2は、JavaのFile IOではトップ1に来る有名なエンコーディングを指定する書き方さえも当時しらなくて、ネットで拾った次のコードを書いていました。
FileReader in = new FileReader("file.txt");
BufferedReader br = new BufferedReader(in);
もちろん、そのネットのページには補足で次のエンコーディングを指定する方法も書いてあったのですが読み飛ばしていました。
FileInputStream is = new FileInputStream("file.txt");
InputStreamReader in = new InputStreamReader(is, "Shift_JIS");
BufferedReader br = new BufferedReader(in);
この書き方がおまじないだとしても、FileReaderの引数に、エンコーディングがあればいいだけなんじゃないかと今でも思っています。。(ファイル以外からのバイトのストリームにも柔軟に対応できる設計なのはわかるんですが)
最後に
今となっては当たり前なことですが、当時の自分には解決に丸1日かかるものでした。
以前半角英数字と記号だけならutf8とshiftjisは同じバイナリということを知らない子がいて少しやりとりをした時に、ふと自分が昔はまったことを思い出したので書いてみました。