0

次のように、ftp ダウンロードしてファイルを文字列に変換する必要があります。

    public static boolean leArquivos(String inicioArquivo) {
    try {
        FTPClient mFtp = new FTPClient();
        mFtp.connect(FTPHOST, PORTA);
        mFtp.login(USUARIO, SENHA);
        FTPFile[] ftpFiles = mFtp.listFiles();
        int length = ftpFiles.length;
        for (int i = 0; i < length; i++) {
            String nome = ftpFiles[i].getName();
            String[] itens = nome.split("_");
            boolean isFile = ftpFiles[i].isFile();
            String arquivo_id = itens[0];
            if (isFile && (arquivo_id.equals(inicioArquivo))) {
                // the follow lines work if outside the for loop
                InputStream inStream = mFtp.retrieveFileStream(nome.toString());
                String arquivoLido = convertStreamToString(inStream);
                String[] arquivoLidoPartes = arquivoLido.split("#");
                Retorno.adicionaRegistro(nome, arquivoLidoPartes[0], arquivoLidoPartes[1], false);
            }
        }
    } catch(Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

これは「inicioArquivo_anything.txt」を読み取り、文字列に入れます。FTP と Registro.adicionaRegistro は正常に動作します。「if」内の 4 行を「for」ループの外に移動すると、1 つのファイルに対して機能します。複数のファイルに対してアクションを実行する必要があります。

英語が下手で申し訳ありません(そしてJavaも下手です)...

編集

このように働いた

変換コード:

    private static String convertStreamToString(InputStream is, FTPClient mFtp) throws IOException { // added the client
    BufferedReader r = new BufferedReader(new InputStreamReader(is));
    StringBuilder total = new StringBuilder();
    String line;
    while ((line = r.readLine()) != null) {
        total.append(line);
    }
    r.close(); // close stream
    is.close(); // close stream
    mFtp.completePendingCommand(); 
    return total.toString();
}

そしてこれを変更しました:

String arquivoLido = convertStreamToString(inStream, mFtp);
inStream.close();
4

1 に答える 1

2

API ドキュメントに書かれているように、(変換後に) ストリームを閉じ、completePendingCommandメソッドを呼び出してファイナライズし、転送のステータスを確認する必要があります。

FTPClient.html#retrieveFileStream

そして、すべてのプログラムで、基本: ストリームを閉じることを忘れないでください!!

于 2013-05-17T13:22:52.773 に答える