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

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

ただいまの
回答率

88.22%

Java FileInputStreamでテキストファイルが読み込めない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 697
退会済みユーザー

退会済みユーザー

お知恵をおかしください

前提・実現したいこと

Eclipseを使用
"names"とい名前でメモ帳を作成
<実現させたこと>
Windowsのメモ帳のテキストファイルに記載されている名前を読み込んで出現回数を表示するプログラムを作っております。
とりあえずはnames.txtというファイルを読み込んで表示させたい。

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

he specified file not foundjava.io.FileNotFoundException: C:\JavaAssignment\names.text (指定されたファイルが見つかりません。)

該当のソースコード

言語名:Java

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class Assignment5 {

    public static void main(String[] args) {

            System.out.println("<出現回数>");
              //Specify the path of the file here
              File file = new File("C:\\JavaAssignment\\names.text");
              BufferedInputStream bis = null;
              FileInputStream  fis= null;

              try
              {
                  //FileInputStream to read the file
                  fis = new FileInputStream(file);

                  /*Passed the FileInputStream to BufferedInputStream
                   *For Fast read using the buffer array.*/
                  bis = new BufferedInputStream(fis);

                  /*available() method of BufferedInputStream
                   * returns 0 when there are no more bytes
                   * present in the file to be read*/

                  while( bis.available() > 0 ){

                      System.out.print((char)bis.read());
                  }

               }catch(FileNotFoundException fnfe)
                {
                    System.out.println("The specified file not found" + fnfe);
                }
                catch(IOException ioe)
                {
                    System.out.println("I/O Exception: " + ioe);
                }
                finally
                {
                    try{
                       if(bis != null && fis!=null)
                       {
                             fis.close();
                          bis.close();
                       }
                     }catch(IOException ioe)
                      {
                          System.out.println("Error in InputStream close(): " + ioe);
                      }
                }
           }


    }

試したこと

1:エクスプローラーを開く 
2:表示をクリックしてオプションを選択
3:フォルダーオプションの表示を選択して詳細設定の”登録登録されている拡張子の表示しない"のチェックを外し適応させ閉じた
4:参照したいフォルダのdirectory pathをコピーしたのをそのまま使用した。
5:参照したいフォルダの前に"\\"を付け加えてあります。

補足情報(FW/ツールのバージョンなど)

Java_version:8.0

追記1

names.text"→names.txtに変更

public static void main(String[] args) {

            System.out.println("<出現回数>");
              //Specify the path of the file here
              File file = new File("C:\\JavaAssignment\\names.txt");
              BufferedInputStream bis = null;
              FileInputStream  fis= null;
追記2

-問題点
fileはとりあえず読み込めてerrorが発生しないんですけど、表示された文字が文字化けしてます。恐らく文字コードが一致していないからだと思うんです。
-前提
・eclipseの文字コード
>>コンテナーからの継承(l) MS932
-試したことeclipseで文字コードの変更(UTF-8)にしても正しく表示されません。
-分からない
上記で試したこと以外で文字化けを解決する方法があればご教示願います。

#追記3

・元のテキストファイルの内容は以下です。
![イメージ説明![イメージ説明2a3502ce52dfff585001ae9bdbca.png)説明](9a3c1e7ce6372c9d97e2753879ee9e51.png)](1b46938a6ace287bd519de6a96d9e477.png)
・英語テキストファイルは以下です。
イメージ説明
※日本語でのテキストファイの中身は日本人の名前に、英語でのテキストファイには外国人の名前で記載しています
どちらにしても、英語で記載した中身か日本語かの違いだけですが。
・コンソールでは以下の様にテキストファイから読み込まれた文字のみ文字化け
イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2020/04/06 13:08

    > names.txtの内容を英語にしてみました。結果は同じく文字化け
    通常使用で半角アルファベットが文字化けというのはまず考えられないのですが...
    どのような「文字化け」なのか, 元ファイルと結果をキャプチャでご提示頂いたり, 結果をバイナリで表示してみると良いかもしれません.

    キャンセル

  • LouiS0616

    2020/04/06 13:09

    ネットに落ちているサンプルだと、InputStreamReaderを利用しているものが多いかと。

    ---
    英字が文字化けするのは不可解ですね。
    文字化けはどのような範囲で発生しているでしょうか。全体的でしょうか/あるいは局所的でしょうか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/04/06 13:36

    読み込んだテキストファイの文字のみコンソールに文字化けしてますね。
    日本語でかいた中身のテキストファイルと英語で書いたのをキャプチャーして挿入したのでご確認ください。

    キャンセル

回答 1

checkベストアンサー

+1

InputStream の代わりに Reader を使った次のコードを試すとどうなりますか?

import java.io.*;

public class Assignment5 {
    public static void main(String[]args) {
        System.out.println("<出現回数>");
        File file = new File("C:\\JavaAssignment\\names.txt");
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(file);
            br = new BufferedReader(fr);
            int c;
            while ((c = br.read()) != -1)
                System.out.print((char)c);
        } catch(FileNotFoundException fnfe) {
            System.out.println("The specified file not found" + fnfe);
        } catch(IOException ioe) {
            System.out.println("I/O Exception: " + ioe);
        }
    }
}

追記
「安」という漢字の文字コードは次のようになります。
Shit-JIS: 88 c0 (ファイル上のコード)
UTF-8: e5 ae 89 (ファイル上のコード)
Unicode: 5b89 (Java の char の内部コード)

InputStream の read() は 1バイトずつ読み込むので、それを 2バイトの char に
キャストすると、0088 00c0 または 00e5 00ae 0089 という文字列になります。
だから文字化けします。

Reader の read() は複数バイトを読み込んで 5b89 という 1文字に変換します。
だから文字化けしません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/06 15:23

    なんか、回答して下さったコードで解決はできました。
    FileReaderでないとそもそも読み込みされないってことですか?
    FileReader and BuffaReaderでできて、私が書いたコードでできない明確な理由があればご教示願います。

    キャンセル

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

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る