FileNotFoundException beim Drücken des "Abbrechen"

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich habe den folgenden Code zum imporiteren eines Files von einem Server von Jsch übernommen:

Code:
public void importFile(String user, String host, String remoteFile, String localFile)
    {
        FileOutputStream fos = null;
        try
        {
            String prefix = null;
            if (new File(localFile).isDirectory())
            {
                prefix = localFile + File.separator;
            }

            JSch jsch = new JSch();
            Session session = jsch.getSession(user, host, 22);

            // username and password will be given via UserInfo interface.
            UserInfo ui = new MyUserInfo();
            session.setUserInfo(ui);
            session.connect();

            // exec 'scp -f remoteFile' remotely
            String command = "scp -f " + remoteFile;
            Channel channel = session.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);

            // get I/O streams for remote scp
            OutputStream out = channel.getOutputStream();
            InputStream in = channel.getInputStream();

            channel.connect();

            byte[] buf = new byte[1024];

            // send '\0'
            buf[0] = 0;
            out.write(buf, 0, 1);
            out.flush();

            while (true)
            {
                int c = checkAck(in);
                if (c != 'C')
                {
                    break;
                }

                // read '0644 '
                in.read(buf, 0, 5);

                long filesize = 0L;
                while (true)
                {
                    if (in.read(buf, 0, 1) < 0)
                    {
                        // error
                        break;
                    }
                    if (buf[0] == ' ')
                        break;
                    filesize = filesize * 10L + (long) (buf[0] - '0');
                }

                String file = null;
                for (int i = 0;; i++)
                {
                    in.read(buf, i, 1);
                    if (buf[i] == (byte) 0x0a)
                    {
                        file = new String(buf, 0, i);
                        break;
                    }
                }

                // System.out.println("filesize="+filesize+", file="+file);

                // send '\0'
                buf[0] = 0;
                out.write(buf, 0, 1);
                out.flush();

                // read a content of localFile
                fos = new FileOutputStream(prefix == null ? localFile : prefix + file);
                int foo;
                while (true)
                {
                    if (buf.length < filesize)
                        foo = buf.length;
                    else
                        foo = (int) filesize;
                    foo = in.read(buf, 0, foo);
                    if (foo < 0)
                    {
                        // error
                        break;
                    }
                    fos.write(buf, 0, foo);
                    filesize -= foo;
                    if (filesize == 0L)
                        break;
                }
                fos.close();
                fos = null;

                if (checkAck(in) != 0)
                {
                    System.exit(0);
                }

                // send '\0'
                buf[0] = 0;
                out.write(buf, 0, 1);
                out.flush();
            }

            session.disconnect();

//            System.exit(0);
        }
        catch (Exception e)
        {
            System.out.println(e);
            try
            {
                if (fos != null)
                    fos.close();
            }
            catch (Exception ee)
            {

            }
        }
    }

    static int checkAck(InputStream in) throws IOException
    {
        int b = in.read();
        // b may be 0 for success,
        // 1 for error,
        // 2 for fatal error,
        // -1
        if (b == 0)
            return b;
        if (b == -1)
            return b;

        if (b == 1 || b == 2)
        {
            StringBuffer sb = new StringBuffer();
            int c;
            do
            {
                c = in.read();
                sb.append((char) c);
            }
            while (c != '\n');
            if (b == 1)
            { // error
                System.out.print(sb.toString());
            }
            if (b == 2)
            { // fatal error
                System.out.print(sb.toString());
            }
        }
        return b;
    }

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive
    {
        public String getPassword()
        {
            return passwd;
        }

        public boolean promptYesNo(String str)
        {
            return true;
        }

        String     passwd;

        JTextField passwordField = (JTextField) new JPasswordField(20);

        public String getPassphrase()
        {
            return null;
        }

        public boolean promptPassphrase(String message)
        {
            return true;
        }

        public boolean promptPassword(String message)
        {
            Object[] ob = { passwordField };
            int result = JOptionPane.showConfirmDialog(null, ob, message, JOptionPane.OK_CANCEL_OPTION);
            if (result == JOptionPane.OK_OPTION)
            {
                passwd = passwordField.getText();
                return true;
            }
            else
            {
                return false;
            }
        }

        public void showMessage(String message)
        {
            JOptionPane.showMessageDialog(null, message);
        }

        final GridBagConstraints gbc = new GridBagConstraints(0,
                                                              0,
                                                              1,
                                                              1,
                                                              1,
                                                              1,
                                                              GridBagConstraints.NORTHWEST,
                                                              GridBagConstraints.NONE,
                                                              new Insets(0, 0, 0, 0),
                                                              0,
                                                              0);

        private Container        panel;

        public String[] promptKeyboardInteractive(String destination,
                                                  String name,
                                                  String instruction,
                                                  String[] prompt,
                                                  boolean[] echo)
        {
            panel = new JPanel();
            panel.setLayout(new GridBagLayout());

            gbc.weightx = 1.0;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.gridx = 0;
            panel.add(new JLabel(instruction), gbc);
            gbc.gridy++;

            gbc.gridwidth = GridBagConstraints.RELATIVE;

            JTextField[] texts = new JTextField[prompt.length];
            for (int i = 0; i < prompt.length; i++)
            {
                gbc.fill = GridBagConstraints.NONE;
                gbc.gridx = 0;
                gbc.weightx = 1;
                panel.add(new JLabel(prompt[i]), gbc);

                gbc.gridx = 1;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                gbc.weighty = 1;
                if (echo[i])
                {
                    texts[i] = new JTextField(20);
                }
                else
                {
                    texts[i] = new JPasswordField(20);
                }
                panel.add(texts[i], gbc);
                gbc.gridy++;
            }

            if (JOptionPane.showConfirmDialog(null,
                                              panel,
                                              destination + ": " + name,
                                              JOptionPane.OK_CANCEL_OPTION,
                                              JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION)
            {
                String[] response = new String[prompt.length];
                for (int i = 0; i < prompt.length; i++)
                {
                    response[i] = texts[i].getText();
                }
                return response;
            }
            else
            {
                return null; // cancel
            }
        }
    }

Nun habe ich zwei Probleme:

1. Beim drücken des "Abbrechen" Buttons bekomme ich eine FileNotFoundException. Es sollte allerdings möglich sein, den Dialog ohne Fehlermeldung zu schliessen, auch wenn kein File zum Import ausgewählt wurde

2. Das zu importierende File wird in einer properties Datei angegeben. Das Programm sucht nach dem File auf dem Server und wenn es das File nicht finden kann, bekomme ich ebenfalls eine FileNotFoundException.

Kann mir evtl. jemand sagen, wie ich diese beiden Probleme beseitigen kann, blicke durch den Code von Jsch nicht 100%ig durch.

Für die zweite Variante wäre z.B. ein JOptionPane mit einem Hinweis für den User denkbar.

MfG Patrick
 
hi,

also ein Tipp wäre sicher mal die Exceptions nicht auszugeben (siehe z.B. Zeile 121). Ausserdem gibt es funktionen die Exceptions weiterleiten statt verarbeiten (evtl. gehts auch nicht anders).

mfg theGregg
 
theGregg hat gesagt.:
also ein Tipp wäre sicher mal die Exceptions nicht auszugeben (siehe z.B. Zeile 121). Ausserdem gibt es funktionen die Exceptions weiterleiten statt verarbeiten (evtl. gehts auch nicht anders).
Exceptions müssen immer ausgegeben oder geloggt werden.
Der Trick ist, sofern vermeidbar, es nicht zur Exception kommen zu lassen.
 
hmja,

Ich dachte es wäre ihm egal, hauptsache das Programm läuft weiter. Ich habe da etwas falsch gelesen.

Vom Stil her ist es natürlich Käse, da gebe ich dir recht!

mfg theGregg
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben