• 締切済み

FILEのクラスが正常に動作しないPCがある。

あるディレクトリからファイルのみ抽出する関数を作ったのですが、 あるPCでは正常に動作するが、違うPCで実行するとFILEクラスでエラーになる。 以下のソースなのですが原因として何が考えられますか? public static String[] ExtractFile(String s[],String Folder){//フォルダからファイルのみを抽出 String umeBackup[]; File f = new File( Folder ); String files[] = f.list(); int N = files.length; int k; String FileName; for( k=0; k<N; k++ ){ FileName = Folder + "/" + files[k]; File file = new File( FileName ); if( file.isFile() ){ umeBackup = s; s = new String[s.length + 1]; System.arraycopy(umeBackup, 0, s, 0, umeBackup.length); umeBackup = null; s[s.length - 1] =files[k]; } } System.out.println(s.length); f = null; return s; } ======================= String files[] = f.list();←この部分でエラーになります。 内容の詳細やソースはこちらにあります。↓ http://aomatudera.web.fc2.com/fc2/help_java.htm よろしくお願いします。

  • noby-
  • お礼率10% (2/20)
  • Java
  • 回答数5
  • ありがとう数0

みんなの回答

回答No.5

Servletでのfileuploadをしたいのでしょうか? だとしたら、考え方が間違っています。 ブラウザから送られるファイル名は、 クライアント側のファイル名ですから、 Servlet側でそのファイル名で開こうとしても、 サーバー側にそんなファイルはありません。 詳しくは、Servlet fileupload等で検索してみてください。

回答No.4

No.1です。 エラーを見るとサーブレットなんですね。 > 画像ファイルのパスとファイル名称の値をFilePathでセットして > request.getParameterで値の取得をしているのですがこのときに FilePathってなんですか? 画像ファイルのパスとファイル名称ってことは、 inputタグのtypeはtextでしょうか。 もしかして画像ファイルパスとファイル名称に 同じパラメータ名をつけてるなんてことはないですよね。 だから、パスが取得できずファイルしか取得できてない、とか。 申し訳ないですが、いまいち、問題とされている事柄が理解できません。

noby-
質問者

補足

回答ありがとうございます。 >inputタグのtypeはtextでしょうか そのとおりです。 以下のように、サーブレットで、FilePathでファイルパス名+ファイル名を設定してます。 out.println("<input type=\"file\" name = \"FilePath\" size =\"150\"><br>"); ダブってはいないです。 一ついえることは、PCによってはうまく動いているということです。 PCの違いにより、ここの値がファイル名しか設定されないのかなあ?

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

>String files[] = f.list();←この部分でエラーになります。 本当にここでNullPointerExceptionが発生するのですか? >int N = files.length; ここではなくて? ssk38様の提示されたURLで言っているのは、 「File#list(あちらではlistFilesですが)がnullを返す」であって、NullPointerExceptionが発生するわけではないですよね。 ディレクトリが本当に存在しているのは間違いないのでしょうか?

noby-
質問者

補足

エラーの場所は間違いないようです。 今調べてわかったことは 画像ファイルのパスとファイル名称の値をFilePathでセットして request.getParameterで値の取得をしているのですがこのときに ファイル名しかデータが引き渡されていないようです。 なぜこのような現象が起こるのだろうか? ちなみにパスの長さが原因かと思ってCドライブ直下でも試しましたがファイル名のみでした。 パス及びファイル名にスペースとかは含まれていません。

  • ssk38
  • ベストアンサー率44% (22/49)
回答No.2
noby-
質問者

補足

それだと思うのですが、jdkは1.6を使っています。 32bit,64bitで両方同じように動作するfileクラスはないのかなあ・・

回答No.1

どんなエラーが出るのか示さなければ、原因なんて分からない。

noby-
質問者

補足

以下のようなエラーが出ます。 ================================================================================== type 例外レポート メッセージ 説明 The server encountered an internal error () that prevented it from fulfilling this request. 例外 java.lang.NullPointerException DmiFileArrangemet.ExtractFile(DmiFileArrangemet.java:142) MakePhoto6.doGet(MakePhoto6.java:111) MakePhoto6.doPost(MakePhoto6.java:189) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:404) org.apache.catalina.servlets.InvokerServlet.doPost(InvokerServlet.java:172) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122)

関連するQ&A

  • NullPointerExceptionの件

    あるフォルダからファイルのみを取得する処理です。 うまく動くときもあるのですがたまに←の部分でNullPointerExceptionエラーが起こります。 わかる方は教えてください。 public static String[] ExtractFile(String s[],String Folder){//フォルダからファイルのみを抽出 String umeBackup[]; File f = new File( Folder ); System.out.println("2:" + f.getAbsolutePath()); String files[] = f.list(); int N = files.length; ←←←←← int k; String FileName; for( k=0; k<N; k++ ){ FileName = Folder + "/" + files[k]; File file = new File( FileName ); if( file.isFile() ){ umeBackup = s; s = new String[s.length + 1]; System.arraycopy(umeBackup, 0, s, 0, umeBackup.length); umeBackup = null; s[s.length - 1] =files[k]; } } System.out.println(s.length); f = null; return s; }

  • javaのファイル読み込み処理の質問です

    あるディレクトリから.txtファイルを検索し 検索して出た結果を1つずつ読み込んでいきたいです どのようにしたらよいのでしょうか? private static String path="C:\\textfolder "; public static voif main(String[] args) { File dir = new File(path); File[] files = dir.listFiles(); String fileName = dir.getName(); for (int s = 0; s < files.length; s++) { try {//ファイルオープン BufferedReader br = new BufferedReader(new FileReader(fileName)); } } catch (IOException e) { e.printStackTrace(); } } return; } } 現状はこのような感じになっています pathの中身はディレクトリのパスを指定しています。 ディレクトリはC:\textfolder でtextfolderというフォルダに.txt(拡張子)のファイルが複数あったとします。

    • ベストアンサー
    • Java
  • ファイル管理ツールを作りたいのですが

    ファイル管理ツールを作る際に、ディレクトリ内のファイル名を取得し、それをアプレット画面のテキストエリアに表示させたいのですが全くやり方がわかりません。 初心者なりに頑張って作ってみたのですが、 import java.io.File; public class Filekanri{ public static void main(String args[]){ File dir = new File("C:\\MyDir"); File[] files = dir.listFiles(); // 全ファイルの名前を取得 String fnames[] = new String[files.length]; for( int i = 0; i < files.length; i++ ) { fnames[i] = files[i].getName(); } これで良いのでしょうか?このあとどうすれば良いのかどうかどうか教えてください。宜しくお願いします。

  • ファイル転送が正常に動作しない

    サーバ側からクライアント側へファイル転送をJavaで行おうとしています。 そこで以下のようなプログラムを作成し、実行するのですが 実行自体はうまくいき、1つめのファイルはきちんと転送できるのですが、 2つめのファイルが転送完了後に確認すると0バイトとなっており、 きちんと動作しません。どうするべきでしょうか。 サーバ側 ※上でソケットはつないであります。 if(command.equals("put.") == true){ System.out.println("putモードに入りました"); // カーネル(linux.uml)の送信 String filename1 = args[1]; byte[] data1 = new byte[1024]; //ストリームの作成 FileInputStream fin1= new FileInputStream(filename1); BufferedOutputStream out2 = new BufferedOutputStream(sock.getOutputStream()); System.out.println("送信ファイル : " + filename1); //int totalSize1 = 0; int len1; while((len1 = fin1.read(data1)) != -1){ out2.write(data1); } out.flush(); fin1.close(); System.out.println(filename1 + "を送信完了しました"); // ルートファイルシステム(uml-root-hardy)の送信 String filename2 = args[2]; byte[] data2 = new byte[1024]; //ストリームの作成 FileInputStream fin2 = new FileInputStream(filename2); //ファイルの内容を読み出し、送信する System.out.println("送信ファイル" + filename2); //long totalSize2 = 0; long len2 = 0; while((len2 = fin2.read(data2)) != -1){ out2.write(data2); } out.flush(); fin2.close(); System.out.println(filename2 + "を送信完了しました"); } クライアント側 ※上でソケットはつないであります。 if(change.equals("put.") == true){ System.out.println("putモードに入りました"); // 2つのファイルを転送する // カーネル(linux.uml)の転送 String filename1 = args[2]; System.out.println("受信するファイル : " + filename1); // FileOutputStreamの作成 FileOutputStream fout1 = new FileOutputStream(filename1); BufferedInputStream in2 = new BufferedInputStream(sock.getInputStream()); int recvMsgSize1; int bufSize = 1024; byte[] byteBuffer1 = new byte[bufSize]; //int totalByte1 = 0; while((recvMsgSize1 = in2.read(byteBuffer1)) != -1){ fout1.write(byteBuffer1); } System.out.println(filename1 + "を受信完了しました"); fout1.close(); // ルートファイルシステム(uml-root-hardy)の転送 String filename2 = args[3]; System.out.println("受信するファイル : " + filename2); FileOutputStream fout2 = new FileOutputStream(filename2); long recvMsgSize2; //byte[] byteBuffer = new byte[bufSize]; byte[] byteBuffer2 = new byte[bufSize]; //long totalByte2 = 0; while((recvMsgSize2 = in2.read(byteBuffer2)) != -1){ fout2.write(byteBuffer2); } System.out.println(filename2 + "を受信完了しました"); fout2.close(); } またプログラム中では、サーバ、クライアントでそれぞれ len1,len2(サーバ側)、recvMsgSize1,recvMsgSize2(クライアント側) に警告で「ローカル変数len1(recvMsgSize1)は読み取られません」 と出ています。 どのように解決するべきでしょうか。

    • ベストアンサー
    • Java
  • C++ ファイル列挙について

    以下のコードで指定のファイルを検索し、フルパスで配列に格納しています。 このとき、ファイル名のみ(パスと拡張子無し)で格納する方法はありますでしょうか。 どうかよろしくお願いします。 // enum_files.cpp // compile with: /clr using namespace System; using namespace System::IO; int main() { String^ folder = "C:\\"; array<String^>^ dir = Directory::GetDirectories( folder ); Console::WriteLine("--== Directories inside '{0}' ==--", folder); for (int i=0; i<dir->Length; i++) Console::WriteLine(dir[i]); array<String^>^ file = Directory::GetFiles( folder ); Console::WriteLine("--== Files inside '{0}' ==--", folder); for (int i=0; i<file->Length; i++) Console::WriteLine(file[i]); return 0; }

  • ファイルの削除が出来ません

    java.io.Fileのdelete()メソッドを利用してファイルの削除をしたいと思っています。 一度もアクセスしていないファイルはdelete()メソッドを利用して削除できるのですが、java.io.Readerなどを利用してファイルの読み込みなどを行った後にそのファイルを削除しようとすると削除がうまく出来ません。 ファイルにアクセスするときに利用したReaderや、Fileのオブジェクトは削除する前にnullを代入して開放しているのですが。。。 どなたか回避方法をご存知の方はいらっしゃいませんでしょうか。よろしくお願いいたします。 コード例: File f = new File(dirName, fileName); BufferedReader br = new BufferedReader(new FileReader(f)); ・・・(読み込みの処理)・・・ f=null; br=null; ・・・ File f = new File(dirName, fileName); boolean b = f.delete(); と、上記のように一度アクセスしたファイルを削除しようとすると、削除が出来ず、変数bにはfalseが入ってしまいます。

    • ベストアンサー
    • Java
  • ファイル読み込みを配列に入れる方法

    ファイルから数字を読み込んで 並び替えて出力するプログラムを作成しているのですが ファイルから一度に配列に取り込んで、その配列で並び変えたいのですが取り込みができないのです、int型の配列に一度に取り込むのは可能なのでしょうか? import java.io.*; class Sort { public static void main(String[] args) { String path = args[0]; File file = new File(path); FileReader fr = null; int[] buf = new int[(int)file.length()]; try { fr = new FileReader(file); fr.read(buf); for (int i=0; i<buf.length-1;i++) { int mini=buf[i]; int miniIndex = i; for(int j = i+1; j<buf.length;j++){ if(buf[j] < mini){ mini = buf[j]; miniIndex = j; } } buf[miniIndex] = buf[i]; buf[i] = mini; } for(int i =0; i<buf.length;i++) { System.out.print( buf[i]+","); } } catch (IOException e) { System.out.println("ファイル入力エラー"); } } } と作ってみたのですが‥ ご教授お願いいたします。

    • ベストアンサー
    • Java
  • ファイル検索の方法

    フォルダ内にある、最後が「D00」で終わるファイルを表示させたいのですがうまくいきません。 以下のようなコードを書いたのですが、「*D00」の「*」の使い方が悪いのでしょうか? import java.io.*; class D00_gets { public static void main(String args[]) { String Dir_Name = "E:\\TEST\\TestData20040106"; File D_File = new File(Dir_Name); String list1[] = D_File.list(); String str01 = "*D00"; for(int i = 0;i<list1.length; i++) { if(list1[i].equals(str01)) System.out.println(list1[i]); } } }

    • ベストアンサー
    • Java
  • javaでコンパイルが出来ない

    java勉強中の初心者です。 カレントディレクトリのファイルを一覧表示するプログラムを作ろうと思い、下のようなコードを書いたのですが、 「構文解析中にファイルの終わりに移りました」というエラーが出ます。 何度か見直したんですが、コードが間違っているのか、どこか別に問題があるのかわかりません。 教えてください。よろしくお願いします。 ________________________________________________________________ import java.io.File; public class ListFiles { public static void main(String[] args) { ListFiles listFiles = new ListFiles(); listFiles.execute(); } private void execute() { File currentDir = new File("."); File[] files=currentDir.listFiles(); for (File file : files) { String fileName = file.getName(); String kind; if (file.isDirectory()) { kind="DIR "; }else{ kind="FILE"; } System.out.printf("%s %s%n", kind, fileName); } }

  • なぜ無限ループになるかが分かりません。

    こんにちは。 関数内でCSVファイルからデータを読み取り、そのデータをリストに入れて、先頭を指すポインタをmain内に返すと言う作業をさせたくて書いたソースです。なぜ無限ループするのか分かりません。 どなたか教えていただけませんか? 以下ソース #include <stdio.h> #include <stdlib.h> struct account{ int ID; char Sname[50]; char Fname[50]; char Adress[100]; int Sex; int Age; char Group[100]; struct account *next; }; struct account *Rfile(char *FileName,struct account *top); int main(void) { char FileName[FILENAME_MAX]; struct account *top,*q; top = NULL; printf("読み込むファイルの名前を入力してください>>>"); scanf("%s",FileName); q = Rfile(FileName,top); return 0; } struct account *Rfile(char *FileName,struct account *top) { FILE *fp; char filename[FILENAME_MAX]; int ret; struct account *new; new = (struct account *) malloc(sizeof(struct account)); new->next = NULL; strcpy(filename,FileName); if( (fp = fopen( filename,"r")) == NULL) { printf("ファイルが見つかりません。>>>%s\n",filename); //exit(EXIT_FILURE); } while( (ret = fscanf( fp, "%d,%[^,],%[^,],%[^,],%d,%d,%[^,]", &(new->ID), new->Sname, new->Fname, new->Adress, &(new->Sex), &(new->Age), new->Group ) ) != EOF )//ファイルの最後でないなら { printf("%d,%s,%s,%s,%d,%d,%s",new->ID,new->Sname,new->Fname,new->Adress,new->Sex,new->Age,new->Group); if(top != NULL){ while(top->next != NULL){ top = top->next; } top = new; } else{//top == NULL top = new; } new = NULL; new = (struct account *) malloc(sizeof(struct account)); new->next = NULL; } fclose(fp); return top; }