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

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

ただいまの
回答率

88.04%

Invalid file pathのエラーで困ってます

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,867

score 4

前提・実現したいこと

javaで画像の送受信を行いたい
受信側でswingのJFrame上で画像のファイル名を設定し受け取ることをしたい
つたないコードと質問ですが回答くださると幸いです
また足りない点等ありましたら指摘してください

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

java.io.IOException: Invalid file path
java.io.FileNotFoundException: Invalid file path
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:229)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:124)
at Connect.run(Cli.java:118)

該当のソースコード

String la = FileName+"."+str; //FileNameはテキストボックス内の文字をgetText()で取得
//strはbyte[] b1で受信した文字をdis.read(b1); str = new String(b1, "UTF-8");でString型に変換した後格納
//strは送信側で指定された拡張子を格納(jpg、bmpなど)
a = "C:/Users/REN/Desktop/Bitmap_Cliant/"+ la;
System.out.println(a);// C:/Users/ユーザ名/デスクトップ/Bitmap_Cliant/FaleNameの値.strに格納してる拡張子名 が出力されます

File newfile = new File(a);
 try{
  newfile.createNewFile();
 }catch(IOException e){
  System.out.println(e);
 }
FileOutputStream fos = new FileOutputStream(a); //ここが118行目になります

試したこと

ソースコードでC:/Users/ユーザ名/デスクトップ/Bitmap_Cliant/123.jpg
などのように変数を使わずに明示した上でテキストボックス内のファイル名をソースコード同じものに揃えると問題なく送受信を行えました

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

javac -encoding utf8 Cli.java
java -Dfile.encoding=UTF-8 Cliant
ubuntu環境下から移してwindows環境で行っているためutf-8でエンコードしてます

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2019/11/27 23:34

    質問は編集できますので
    本文に追記してください

    キャンセル

  • luna_

    2019/11/27 23:52

    補足情報の欄でよかったのでしょうか

    キャンセル

  • ironya

    2019/11/28 12:22 編集

    コンパイル時と実行時のクラス名が違いますが、、、大丈夫ですか? 他にコンパイル済みの Client.class があるのでしょうか。。。

    キャンセル

回答 4

+1

FileNameやstr変数について詳しく見る必要があるかもしれません。toCharArrayして中身を見るなどして、余計な空白文字が紛れていないか見てください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/28 16:28

    ファイル名のPATHの生成に問題がある気がします。様々な変数をくっつけた結果の、最終的なPATH文字列のシーケンスを確認すべき、との観点から高評価させていただきました。

    キャンセル

0

java.io.IOException: Invalid file path

存在しないファイルパス
といってます。
それはあなたのPC内で存在してるんでしょうか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/27 23:48 編集

    送信側
    String[] extension = {"jpg","bmp","wdmp","png","gif"};
    JTextField text1 = new JTextField(15);
    public void actionPerformed(ActionEvent e){ //JFrameでボタンを押したときの動作
    se.set(text1.getText());
    int a = combo.getSelectedIndex();
    Operation.Ex = extension[a];
    }
    str = Ex;
    buf1 = str.getBytes();
    op.write(buf1);

    受信側
    String str ;
    static String FileName ;
    byte[] b1 = new byte[1024];
    dis.read(b1);
    str = new String(b1, "UTF-8");
    String la = FileName+"."+str;
    String a = "C:/ユーザー名/Desktop/Bitmap_Cliant/"+ la;

    流石に全部のコード貼るのは気が引けたので抜粋しましたが足りない点などがあったらすみません…

    キャンセル

  • 2019/11/28 03:03 編集

    コードは出来るだけ中略省略せずに, 実行されるルート上の全てをご提示ください. 特に原因が特定されていない場合は, 省略された部分が問題かもしれませんので.
    そして, ( m.ts10806 さんも書かれていますが ) ご質問の追加情報となりえるデータはご質問を編集して追加して頂ければ, 後からご覧になる方にも情報が纏まって良いかと思います.

    送信側を見る限りでは extension の文字列しか送っていないように見えますが, op.write の後は何も送らず close しているのでしょうか. 送信している buf1 の内容はバイナリでどうなっているでしょう.
    受信側の dis.read(b1) の dis が何者なのか分かりませんが, read の返り値は b1 に受信したバイト数かと思います. b1 の先頭からそのバイト数分をバイナリで表示してみて, buf1 の内容と比較しては如何でしょうか.

    キャンセル

  • 2019/11/29 23:21 編集

    byte[] b1 = new byte[1024];
    これを丸ごとStringに変換しているのが問題ではないでしょうか?
    str = new String(b1, "UTF-8");
    str.length()は1024になりませんか?

    キャンセル

0

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class TSET {
    public static void main(String[] args) throws FileNotFoundException {
        String FileName = "test";
        String str = "png";
        String la = FileName + "." + str;
        String a = "D:/Bitmap_Cliant/" + la;
        System.out.println(a);// C:/Users/ユーザ名/デスクトップ/Bitmap_Cliant/FaleNameの値.strに格納してる拡張子名 が出力されます

        File newfile = new File(a);
        try {
            newfile.createNewFile();
        } catch (IOException e) {
            System.out.println(e);
        }
        FileOutputStream fos = new FileOutputStream(a);
        System.out.println(fos.toString());

    }

}

出力結果:
D:/Bitmap_Cliant/test.png
java.io.FileOutputStream@7f5f5897

こんな感じで特にエラーは出ないみたいです。

デスクトップではなくCとかD直下にディレクトリ作っても駄目ですかね?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/27 23:15

    全く同じエラーがでました

    キャンセル

0

Windowsはディレクトリやファイル名を扱う際に、ワイド文字のUTF16で扱います。質問者さんのケースではJava実行時にプログラム内部の文字エンコーディングとしてUTF-8を指定して実行しているために、PATH名の生成においてWindowsとしてはミスマッチが起きているのかもしれません。フルPATHで日本語名の入っていないファイルをまず試してみて、もしそれでOKならばそう言うことなのだろうと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/28 12:21

    dodox86 さん

    >javac -encoding utf8 Cli.java

    こちらはソースファイルの中身の文字のエンコードがUTF-8

    >java -Dfile.encoding=UTF-8 Cliant

    こちらはテキストファイルの中身の文字のエンコードがUTF-8

    では?
    だとしたらファイル名に関しては特に問題ないのでは・・・と考えますが。

    キャンセル

  • 2019/11/28 16:24

    >ironyaさん

    私の回答ですが、ソースコードの中身とテキストファイルの中身の文字のエンコードをUTF-8に揃え、コンパイルした*.classファイルを
    Windowsマシンへ持ってきて「java -Dfile.encoding=UTF-8 Cliant」とのように実行したとしても、実行時にJVMを介してネイティブのファイルオープンAPI(WindowsでいえばCreateFileWやCreateFileA API)にファイルPATHを引き渡すときに、UTF-8のバイナリシーケンスで渡ってしまっているのでは?との懸念からしたものでした。

    ですがこちらで実際に確認したところ、問題なく動作しました。LinuxのJava環境は構築が大変だったので、以下の環境で試しました。
    (macOS 上でUTF-8端末でソースファイル作成、コンパイル。Windowsのコマンドプロンプトで実行。どちらもJava 1.8.x)
    思い直してみるとJavaの実行時、JVM内ではUTF16で動いていたはずで、そうであればエンコード種別は揃えられるので、私の回答は外れなようです。
    質問者さんのオリジナルのコードでPATH名の生成に問題があり、不正なファイル名になってしまっている気がします。

    キャンセル

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

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

関連した質問

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