C言語ではcharは「バイト」といった意味合いで使われることも多いですが、JavaではcharはUTF16で表現された文字でして1文字に「ページ0のunicodeであるなら」1文字入ります。
さて今日、テキストを扱う場合にはASCII限定の処理を行うより適切な文字セット・エンコーディングを仮定してそれに従いテキストのI/Oをする習慣にしたほうがいいと思います。
moonphaseさんがbyteとして読み込んでそれを文字へ変換する例を挙げておられるので文字として読み込む例を挙げてみます。
java
1Charset cs = StandardCharset.UTF_8;
2// もしWindowsでShift_JISを読むなら cs = Charset.forName("Windows_31J");
3try (FileInputStream fis = new FileInputStream(FILE_PATH);
4 InputStreamReader isr = new InputStreamReader(fis, cs);
5 BufferedReader br = new BufferedReader(isr)) {
6 StringBuilder sb = new StringBuilder();
7 int c;
8 while ((c = br.read()) != -1) {
9 if (c == '\0')
10 break;
11 }
12 String s = sb.toString();
13 ...
14} catch (IOException e) {
15 例外処理
16}
InputStreamReaderでエンコーディングを指定し、さらにI/Oの効率をよくするためにBufferedReaderで包んでからようやくI/Oを始めるという感じです。
メモリ的な観点から危険性
Javaや他の多くの言語は内部にガベージコレクターを備えてますが、C/C++のようにメモリーを直接プログラマーに操作させない方針で設計されているものが多いと思います。Javaについていえばめったに作ることがないであろうnative libraryを書いてさらにそこでバグを作りこむといった場合でもない限りメモリーを破壊するようなバグは起こり得ません(起こしようがありません)。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/08 08:48