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

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

ただいまの
回答率

88.37%

javaでディレクトリからテキストファイル拡張子のファイルだけ抜き出してMap格納したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,870

kamekawashinta

score 38

前提・実現したいこと

C:\\test\\tes\\sampleに
tes.xml
tes.jpg
が入っており、ここからXMLファイルだけ抜き出して
ファイル名のパス=キー
テキスト内容 =格納する値
としてMapに格納したいのですが、うまく行きません。
どなたか間違っている箇所を教えていただけませんでしょうか?

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

現コードでは下記のERRORが出ます

Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at java.nio.file.Files.readAllLines(Files.java:3205)
    at java.nio.file.Files.readAllLines(Files.java:3242)
    at MapCreater$1.visitFile(MapCreater.java:43)
    at MapCreater$1.visitFile(MapCreater.java:33)
    at MapCreater.CreatePathAndStringListMap(MapCreater.java:33)
    at Main.main(Main.java:31)

該当のソースコード

public class Main {

    public static void main(String[] args) throws IOException {

        String userSelect = "C:\\test\\tes\\sample";


        Map<Path, List<String>> filePathAndStringListMap = new HashMap<Path, List<String>>();
        MapCreater mp = new MapCreater();


        filePathAndStringListMap = mp.CreatePathAndStringListMap(userSelect, filePathAndStringListMap);

        System.out.println(filePathAndStringListMap.keySet());

    }

}

public class MapCreater {


    public boolean isXml(Path path) {
        boolean b = path.getFileName().endsWith(Paths.get("xml"));
        return b;
    }

    public Map<Path, List<String>> CreatePathAndStringListMap(String userSelectedPath, Map<Path, List<String>> fileMap) throws IOException {


        Files.walkFileTree(Paths.get(userSelectedPath), new SimpleFileVisitor<Path>() {

            public FileVisitResult visitFile(Path file,
                    BasicFileAttributes attrs) throws IOException {

                if (isXml(file)) {

                    List<String> Lines = Files.readAllLines(file);

                    Path filesPath = file.toAbsolutePath().getFileName();


                    fileMap.put(filesPath, Lines);
                    System.out.println(filesPath + "は" + Lines.hashCode() + "に格納されました");
                    //ファイルの処理を継続
                    return FileVisitResult.CONTINUE;
                } else {
                    return FileVisitResult.SKIP_SUBTREE;

                }

            }
        });
        return fileMap;
    }

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

Java8
netBeans

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

0

すみません。文字セットの理解が乏しかった点については勉強します。
ご回答を早とちりして解釈していました。

事故解決いたしまして
テキストファイルかどうかの判定として
バイナリファイルは、00のコードが含まれるので、FileInputStreamを呼んで
Bite配列に渡して、00が入ったらfalseを返すisTestをisXmlの代わりに作ったら解決しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

java.nio.charset.MalformedInputException
指定した文字セットと異なる文字セットのファイルを
デコードしようとして例外が発生したと考えられます。

発生元のjava.nio.file.Files.readAllLinesを調べたところ、
readAllLines(Path path)
引数がPathのみのreadAllLinesメソッドではUTF-8の文字セットでデコードを行うようです。

デコードを行う前に、文字セットの判定を行い、
適切な文字セットを指定して、デコードを実行することで解決できると思います。
readAllLines(Path path, Charset cs)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/03 12:27

    List<String> Lines = Files.readAllLines(file,Charset.forName( "UTF-8"));
    に変更し実行したところ、同じERRORが出ました。
    さらにC:\\test\\tes\\samplen内のjpgファイルを削除して実行したところ

    sample.xmlは866879820に格納されました
    [sample.xml]

    と表示されます。

    希望しているのはディレクトリ内のxmlファイルのみを読み込んでそれを表示させる動作なのですが、うまくいかないようです。

    キャンセル

  • 2016/06/03 12:34

    文字セット(文字コード)の概念については理解されているでしょうか?

    キャンセル

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

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

関連した質問

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