2015-09-09 1 views
0

У меня возникла проблема с записью файла. Мое приложение просто берет файл с SD-карты, записывает на нем строку и переносит этот файл на сервер ftp. Загрузка файла прекрасна, но я не могу написать строку в файле, я пробовал писать строку во многом, но никто не работал. Это мой код, Main и FTPUploadAndroid: не удается написать строку в текстовом файле

public class MainActivity extends ActionBarActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    FtpUpload upload = new FtpUpload(handler,this); 
    upload.execute(); 

} 

private final Handler handler = new Handler() { 
    public void handleMessage(Message message) { 
     ArrayList result = (ArrayList) message.getData().get("data"); 

     for(Object fileName : result) {    
      Toast.makeText(getApplicationContext(), fileName.toString(), 
        Toast.LENGTH_LONG).show(); 

     } 
    } 
}; 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

FTPupload:

public class FtpUpload extends AsyncTask<Void, Void, ArrayList> { 

private Handler handler; 
private Context context; 

public FtpUpload(Handler hand, Context context) { 
    this.handler = hand; 
    this.context = context; 

} 

@Override 
protected ArrayList doInBackground(Void... params) { 

    ArrayList files = new ArrayList(); 
    FTPClient mFTPClient = new FTPClient(); 

    boolean status = false; 

    String filename = "prova.txt"; 
    String srcFilePath = "/mnt/extSdCard/Download/"; 
    try { 
     mFTPClient.setConnectTimeout(10 * 1000); 
     mFTPClient.connect(InetAddress.getByName("+++++++++++++")); 
     status = mFTPClient.login("**********", "*********"); 
     mFTPClient.changeWorkingDirectory("/"); 
     mFTPClient.setFileType(FTP.BINARY_FILE_TYPE); 
     mFTPClient.enterLocalPassiveMode(); 
     File file = new File(srcFilePath + filename); 

     final String TESTSTRING = new String("AAAAAAAAAAAAAAA"); 


     try { 
      final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      baos.write(TESTSTRING.getBytes()); 
       final FileOutputStream fos = new FileOutputStream(file); 
       fos.write(baos.toByteArray()); 
       fos.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     BufferedInputStream buffIn = null; 
     buffIn = new BufferedInputStream(new FileInputStream(file), 8192); 

     status = mFTPClient.storeFile(filename, buffIn); 

    } catch (Exception e) { 
    } 

    return files; 
} 

@Override 
protected void onPostExecute(ArrayList result) { 
    Message message = handler.obtainMessage(); 
    Bundle bundle = new Bundle(); 
    bundle.putStringArrayList("data", result); 
    message.setData(bundle); 
    handler.sendMessage(message); 
} 

}

Я попытался differt способ написания на файл, например:

FileOutputStream dfdfd = new FileOutputStream(file); 
OutputStreamWriter osw = new OutputStreamWriter(dfdfd); 
osw.write(TESTSTRING) 

или:

try { 
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(file.getName(), context.MODE_PRIVATE)); 
    outputStreamWriter.write(TESTSTRING); 
    outputStreamWriter.close(); 
} 
catch (IOException e) { 
    Log.e("Exception", "File write failed: " + e.toString()); 
} 

добавить два разрешения:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

NB: приложение не дают ошибок, и загрузка файла на сервере работает правильно

ответ

0

Вы пробовали с BufferedWriter вместо OutputStreamWriter? Это работало для меня (не на Android, хотя, но дать ему пойти и посмотреть, если он работает :)

FileOutputStream dfdfd = new FileOutputStream(file); 
BufferedWriter bw = new BufferedWriter(dfdfd); 
bw.write(TESTSTRING); 

И не забудьте закрыть его после

bw.close(); 
0

Я не думаю, что экономия файл на SD-карте - это правильный путь. Возможно, вам стоит попробовать context.getdirs() context.getfiledirs() или context.getcachedirs(). потому что Android предполагает, что приложение должно использовать свои собственные dirs в/sdcard/Android/packagenames /. .

Смежные вопросы