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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

4回答

8360閲覧

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

luna_

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/11/27 13:35

編集2019/11/27 14:51

前提・実現したいこと

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)

該当のソースコード

java

1String la = FileName+"."+str; //FileNameはテキストボックス内の文字をgetText()で取得 2//strはbyte[] b1で受信した文字をdis.read(b1); str = new String(b1, "UTF-8");でString型に変換した後格納 3//strは送信側で指定された拡張子を格納(jpg、bmpなど) 4a = "C:/Users/REN/Desktop/Bitmap_Cliant/"+ la; 5System.out.println(a);// C:/Users/ユーザ名/デスクトップ/Bitmap_Cliant/FaleNameの値.strに格納してる拡張子名 が出力されます 6 7File newfile = new File(a); 8 try{ 9 newfile.createNewFile(); 10 }catch(IOException e){ 11 System.out.println(e); 12 } 13FileOutputStream 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でエンコードしてます

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/11/27 14:18

コードのコンパイル、実行をどのような環境でしているか記載してください。
luna_

2019/11/27 14:29

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

2019/11/27 14:34

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

2019/11/27 14:52

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

2019/11/28 03:23 編集

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

回答4

0

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

投稿2019/11/27 14:13

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/11/28 07:28

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

0

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

投稿2019/11/27 16:52

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ironya

2019/11/28 03:21

dodox86 さん >javac -encoding utf8 Cli.java こちらはソースファイルの中身の文字のエンコードがUTF-8 >java -Dfile.encoding=UTF-8 Cliant こちらはテキストファイルの中身の文字のエンコードがUTF-8 では? だとしたらファイル名に関しては特に問題ないのでは・・・と考えますが。
dodox86

2019/11/28 07: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名の生成に問題があり、不正なファイル名になってしまっている気がします。
guest

0

Java

1import java.io.File; 2import java.io.FileNotFoundException; 3import java.io.FileOutputStream; 4import java.io.IOException; 5 6public class TSET { 7 public static void main(String[] args) throws FileNotFoundException { 8 String FileName = "test"; 9 String str = "png"; 10 String la = FileName + "." + str; 11 String a = "D:/Bitmap_Cliant/" + la; 12 System.out.println(a);// C:/Users/ユーザ名/デスクトップ/Bitmap_Cliant/FaleNameの値.strに格納してる拡張子名 が出力されます 13 14 File newfile = new File(a); 15 try { 16 newfile.createNewFile(); 17 } catch (IOException e) { 18 System.out.println(e); 19 } 20 FileOutputStream fos = new FileOutputStream(a); 21 System.out.println(fos.toString()); 22 23 } 24 25} 26

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

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

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

投稿2019/11/27 14:02

junzi

総合スコア279

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luna_

2019/11/27 14:15

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

0

java.io.IOException: Invalid file path

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

投稿2019/11/27 13:41

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luna_

2019/11/27 13:45

そこがちょっとわからないとこなんですが"試したこと"にある通り変数を使わずにやった場合は通ったのでnew FileOutputStream(a)の動作で変数 aを読み出せてないって可能性はあるんじゃないかなって思ったのですがどうなんでしょうか
y_waiwai

2019/11/27 13:47

> 変数を使わずにやった場合は通った というのがそもそもの間違いです。 本当にそれが同一だったのかよく確認しましょう。そこが間違ってますよ
luna_

2019/11/27 13:54

new file()等を変数 aaの方で行いました String la = FileName+"."+str; String aa = "C:/Users/REN/Desktop/Bitmap_Cliant/123.jpg"; String a = "C:/Users/REN/Desktop/Bitmap_Cliant/"+ la; System.out.println(aa); System.out.println(a); 出力結果が C:/Users/ユーザー名/Desktop/Bitmap_Cliant/123.jpg C:/Users/ユーザー名/Desktop/Bitmap_Cliant/123.jpg と全く同じものが出てきました 画像は送受信できました やはり変数laを使用した場合にエラーが生じるように思えます
y_waiwai

2019/11/27 13:57

末尾にスペース入ってますが。
luna_

2019/11/27 14:04

ありがとうございます!全く気づきませんでした本当にお恥ずかしい… dis.read(b1); str = new String(b1, "UTF-8"); の処理で入ってしまっているということなんですかね String[] kaku = {"jpg","bmp","wdmp","png","gif"}; if(str == "jpg")str = kaku[0]; else if(str == "bmp")str = kaku[1]; else if(str == "wdmp")str = kaku[2]; else if(str == "png")str = kaku[3]; else if(str == "gif")str = kaku[4]; 一応その受信したデータがおかしいのかなと思って上記のように拡張子名も入れなおしてみたりしたのですがなぜスペースが入るのでしょうか?
y_waiwai

2019/11/27 14:11

コードの一部分だけ出されてもどーしよーもないです コードをデバッグできる環境を整えましょう
luna_

2019/11/27 14:18

すみませんそうですよね… ただstrの中身を最後に更新してるのが上記のif文なので、その処理内容にスペースが含まれていないのに出力するとスペースが存在するっていうのはどうにも腑に落ちなくて…
jimbe

2019/11/27 14:34 編集

> dis.read(b1) で b1 に何が読み込まれているか, dis の向こうの送信側でどう送信しているか等の確認が必要と思います. それらが分かるようにコード/データをご提示願えますか. また, 文字列を表示する際は "'"+aa+"'" などとして何かで囲った形で出力されるようにしますと, 前後の空白や改行等の存在が分かって良いのではと思います.
luna_

2019/11/27 14:55 編集

送信側 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; 流石に全部のコード貼るのは気が引けたので抜粋しましたが足りない点などがあったらすみません…
jimbe

2019/11/27 18:04 編集

コードは出来るだけ中略省略せずに, 実行されるルート上の全てをご提示ください. 特に原因が特定されていない場合は, 省略された部分が問題かもしれませんので. そして, ( m.ts10806 さんも書かれていますが ) ご質問の追加情報となりえるデータはご質問を編集して追加して頂ければ, 後からご覧になる方にも情報が纏まって良いかと思います. 送信側を見る限りでは extension の文字列しか送っていないように見えますが, op.write の後は何も送らず close しているのでしょうか. 送信している buf1 の内容はバイナリでどうなっているでしょう. 受信側の dis.read(b1) の dis が何者なのか分かりませんが, read の返り値は b1 に受信したバイト数かと思います. b1 の先頭からそのバイト数分をバイナリで表示してみて, buf1 の内容と比較しては如何でしょうか.
xebme

2019/11/29 14:23 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問