#現在取り組んでいること
javaでsocket通信を利用してffftpのようなftpクライアントアプリを作成してします。
#やりたいこと
ftpサーバーにあるファイルの情報を取得して、別クラスの下記メソッドの引数にしたい。
下記メソッドを実行することで、ftpサーバーに保存されているファイルがアプリ上に一覧表示される。
Java
1 private void setFiles(File file, DefaultListModel<File> listModel) { // フォルダとファイルをリストに追加 2 listModel.removeAllElements(); // 全クリア 3 File[] files = file.listFiles(); 4 if (files == null) 5 return; 6 7 for (File f : files) { 8 if (f.isDirectory()) 9 listModel.addElement(f); // フォルダを追加 10 } 11 for (File f : files) { 12 if (f.isFile()) 13 listModel.addElement(f); // ファイルを追加 14 } 15 } 16 17 private static class FileListCellRenderer extends DefaultListCellRenderer { // ファイルアイコン表示 18 private final FileSystemView fs = FileSystemView.getFileSystemView(); 19 20 public Component getListCellRendererComponent(JList list, Object value, 21 int index, boolean isSelected, boolean cellHasFocus) { 22 super.getListCellRendererComponent(list, value, index, isSelected, 23 cellHasFocus); 24 25 if (value instanceof File) { 26 File f = (File) value; 27 setText(fs.getSystemDisplayName(f)); 28 setIcon(fs.getSystemIcon(f)); 29 } 30 return this; 31 } 32 }
#問題
下記プログラムを実行した際、86行目のFileOutputStream fo = new FileOutputStream(file);を通るときに、アクセスが拒否されましたとエラーが表示されてしまう。
Java
1import java.io.BufferedReader; 2import java.io.DataInputStream; 3import java.io.File; 4import java.io.FileOutputStream; 5import java.io.InputStreamReader; 6import java.io.PrintWriter; 7import java.net.ServerSocket; 8import java.net.Socket; 9 10class List { 11 12 public static void main(String args[]){ 13 String host = "ipアドレス"; 14 int ctrl_port = 8021; 15 String user = "ユーザネーム"; 16 String pass = "パスワード"; 17 String home = "/"; 18 19 Socket ctrlSocket = null; 20 PrintWriter ctrlOutput = null; 21 22 Socket dataSocket = null; 23 BufferedReader dataReader = null; 24 25 try { 26 // FTPサーバと8021番ポートでコネクションをはる 27 ctrlSocket = new Socket(host, ctrl_port); 28 29 // コマンドを書くよう 30 ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream()); 31 32 // FTPクライアント(このプログラムを実行するホスト)のアドレスを取得 33 byte[] local_address = ctrlSocket.getLocalAddress().getAddress(); 34 35 // FTPログイン 36 ctrlOutput.println("USER " + user); 37 ctrlOutput.flush(); 38 ctrlOutput.println("PASS " + pass); 39 ctrlOutput.flush(); 40 41 // ディレクトリに移動 42 ctrlOutput.println("CWD " + home); 43 ctrlOutput.flush(); 44 45 // 接続をまつ 46 ServerSocket dataServerSocket = new ServerSocket(0, 1); 47 // 待ちうけポートを取得 48 int data_port = dataServerSocket.getLocalPort(); 49 50 // PORTコマンドを作成 51 String port_command = "PORT "; 52 for (byte b : local_address) { 53 port_command += (b & 0xff) + ","; 54 } 55 port_command += (data_port / 256) & 0xff; 56 port_command += ","; 57 port_command += data_port & 0xff; 58 59 // FTPサーバに待ちうけている場所を教えてあげる 60 ctrlOutput.println(port_command); 61 ctrlOutput.flush(); 62 63 // NLSTコマンド 64 ctrlOutput.println("LIST"); 65 ctrlOutput.flush(); 66 67 // サーバからの接続をうけつける 68 dataSocket = dataServerSocket.accept(); 69 dataServerSocket.close(); 70 71 // サーバから送られてくる情報をよみとる 72 dataReader = new BufferedReader(new InputStreamReader( 73 dataSocket.getInputStream())); 74 75 System.out.println("dataReader =" + dataReader); 76 77 for (String line = dataReader.readLine(); line != null; line = dataReader 78 .readLine()) { 79 // 表示 80 System.out.println("line ="+line); 81 } 82 83 DataInputStream di = new DataInputStream(dataSocket.getInputStream()); 84 File file = new File("/ファイル名"); 85 System.out.println("file = "+file); 86 FileOutputStream fo = new FileOutputStream(file); 87 System.out.println("ここで止まります。"); 88 89 90 int length = di.readInt(); 91 if(length > 0) { 92 byte[] data = new byte[length]; 93 di.readFully(data, 0, data.length); 94 fo.write(data); 95 } 96 97 98 } catch (Exception e) { 99 e.printStackTrace(); 100 } finally { 101 if (dataReader != null) { 102 try { 103 dataReader.close(); 104 } catch (Exception e) { 105 e.printStackTrace(); 106 } 107 } 108 if (dataSocket != null) { 109 try { 110 dataSocket.close(); 111 } catch (Exception e) { 112 e.printStackTrace(); 113 } 114 } 115 116 if (ctrlOutput != null) { 117 ctrlOutput.close(); 118 } 119 if (ctrlSocket != null) { 120 try { 121 ctrlSocket.close(); 122 } catch (Exception e) { 123 e.printStackTrace(); 124 } 125 } 126 } 127 } 128 129} 130
#わからないこと
アクセスが拒否される原因
- 何かコードが足りないのか
- プログラムではなくftpサーバー上でアクセス権限の設定しないといけないのか。
#エラーメッセージ
以下が実行時に表示されるエラーメッセージです。
java.io.FileNotFoundException: \test.txt (アクセスが拒否されました。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at List.main(List.java:86)
あなたの回答
tips
プレビュー