2013-03-11 2 views
0

вот что я делаю:Написать файл getFilesDir() терпит неудачу - NoSuchElementException

1 Получение файла из моей assests и поместить его в строку - УСПЕШНЫЙ

2- Сделать файл в getFilesDir() - не откажет (нет аварии пока)

3- Напишите строку я получил в этот файл не используя FileWriter - FAILS (никаких дорожно-пока)

4 Прочитайте новый файл, который я только что сделал - FAILS (броски NoSuchElementException)

Вот материал, Вы должны увидеть:

небольшой полезный метод, который я использовал:

public String inputStreamToString(InputStream stream){ 

     Scanner s = new Scanner(stream).useDelimiter("\\A"); 
     String aa = s.next(); 
     return aa; 

    } 

Отрывок из MainActivity.java:

//B2 and text are a well defined Button and TextView respectively, ensured through previous testings 
B2.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       AssetManager as = getAssets(); 
       InputStream stream = null; 
       try { 
        stream = as.open("updater-script"); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Scanner s = new Scanner(stream).useDelimiter("\\A"); 
       String aa = s.next(); 
       text.setText(aa); 

       File file = new File(getFilesDir() + "/updater-script"); 
       try { 
        boolean b = file.createNewFile(); //returns false, indicating the file wasn't made 
        text.setText(text.getText()+String.valueOf(b)); 
        new File(getFilesDir().getAbsolutePath()).mkdirs(); 
        FileWriter write = new FileWriter(getFilesDir().toString()+File.pathSeparator+"updater-script"); 
        Show(getFilesDir().toString()); 
        write.write(aa); 
        write.close(); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       } 
     }); 
     B2.setOnLongClickListener(new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
       File file = new File(getFilesDir(), "updater-script"); 
       try { 
        FileInputStream in = new FileInputStream(file); 
        String aa = inputStreamToString(in); 
        text.setText(aa); 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


       return true; 
      } 
     }); 

Мой Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="seaskyways.testingproject" 
    android:versionCode="1" 
    android:versionName="beta" > 

    <uses-sdk 
     android:minSdkVersion="14" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STROAGE"/> 
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.Sherlock" > 
     <activity 
      android:name="seaskyways.testingproject.MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" 
      android:theme="@android:style/Theme.Holo" 
      android:uiOptions="splitActionBarWhenNarrow" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="seaskyways.testingproject.MenuActivity" 
      android:label="@string/title_activity_menu" > 
     </activity> 
     <activity 
      android:name="seaskyways.testingproject.Splash" 
      android:label="@string/title_activity_splash" 
      android:theme="@style/Theme.Sherlock.Dialog" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="seaskyways.testingproject.HorizontalScrollView" 
      android:label="@string/title_activity_splash" > 
      <intent-filter> 
       <action android:name="android.intent.action.HSV" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="seaskyways.testingproject.ExpandableLists" 
      android:label="@string/title_activity_expandable_lists" 
      android:parentActivityName="seaskyways.testingproject.MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="seaskyways.testingproject.MainActivity" /> 
     </activity> 
     <activity 
      android:name="seaskyways.testingproject.SwipeStrips" 
      android:label="@string/title_activity_swipe_tabs" 
      android:parentActivityName="seaskyways.testingproject.MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="seaskyways.testingproject.MainActivity" /> 
     </activity> 
     <activity 
      android:name="seaskyways.testingproject.SwipeTabs" 
      android:label="@string/title_activity_swipe_tabs" 
      android:parentActivityName="seaskyways.testingproject.MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="seaskyways.testingproject.MainActivity" /> 
     </activity> 
    </application> 

</manifest> 

Stack Tra ce:

03-11 21:23:08.241: E/AndroidRuntime(3958): FATAL EXCEPTION: main 
03-11 21:23:08.241: E/AndroidRuntime(3958): java.util.NoSuchElementException 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at java.util.Scanner.next(Scanner.java:1007) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at java.util.Scanner.next(Scanner.java:980) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at seaskyways.testingproject.MainActivity.inputStreamToString(MainActivity.java:44) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at seaskyways.testingproject.MainActivity$7.onLongClick(MainActivity.java:171) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at android.view.View.performLongClick(View.java:4240) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at android.widget.TextView.performLongClick(TextView.java:8060) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at android.view.View$CheckForLongPress.run(View.java:17339) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at android.os.Handler.handleCallback(Handler.java:725) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at android.os.Looper.loop(Looper.java:137) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at android.app.ActivityThread.main(ActivityThread.java:5237) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
03-11 21:23:08.241: E/AndroidRuntime(3958):  at dalvik.system.NativeStart.main(Native Method) 

Пожалуйста, никаких обходных решений, потому что у меня есть планы на будущее ... Спасибо за любую помощь! Если вам нужна дополнительная информация здесь, а поле комментариев - на несколько сантиметров вниз: P

+0

Ваш LogCat фактически указывает ваша ошибка в s.следующий(); – DigCamara

+0

** boolean b = file.createNewFile(); // возвращает false, указывая, что файл не был создан ** - прочитайте документы для 'createNewFile()' http://developer.android.com/reference/java/io/File.html#createNewFile() Если файл не может быть создан, он выдает «IOException». Если вы получаете «false» в качестве возврата на вызов и не являетесь исключением, это связано с тем, что файл уже существует. – Squonk

+0

или, как и мой измененный ответ, указывает, что разрешения немного неправильны ... – DigCamara

ответ

1

От this documentation Я понимаю, что вы действительно должны защищать свои вызовы .next() с помощью .hasNext().

Вот, например:

public String inputStreamToString(InputStream stream){ 

    Scanner s = new Scanner(stream).useDelimiter("\\A"); 
    if (s.hasNext()){ 
     return s.next(); 
    }else{ 
     return null; 
    }  
} 

И, если ваши права написаны правильно, это

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

разрешение на самом деле не существует. Он должен быть

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

Если вы читаете то, что я написал хорошо, вы должны знать, что моя трассировка стека указывает на мой 's.next()', потому что 'boolean b = file.createNewFile();' return false, указывая, что файл не был создан, что мой сканер не найдет «next()», вызывая исключение ... Это не ответ, это заставит меня иметь NullPointerException ... – Seaskyways

+0

Вы правы. И я добавил к моему ответу новый раздел, который может объяснить, почему у вас нет прав на создание файла. Если это не сделает трюк, я с радостью отошлю ответ. – DigCamara

+0

По-прежнему возвращает false после исправления, файл не был создан ... – Seaskyways

0

Я сказал: «логическое б = file.createNewFile(); // возвращает ложь, показывая, что файл не был сделан» , который не является истинным, б = ложь без каких-либо исключений средств что файл уже сделан ... Но авария была вызвана тем, что созданный файл не имеет никакого текста для чтения, что приведет к сбою, так как я ничего не читаю ...

Поэтому, чтобы исправить это, мне не нужны никакие разрешения, просто Java ... Все, что мне нужно сделать, это либо написать что-то в этот файл, прежде чем пытаться его прочитать или запрограммировать мой класс, который дает мне StringInputStream, чтобы вернуть что-то вместо n ичто и грохот:

Так что первое решение, как это:

File file = new File(get_data_dir(getApplicationContext()), "updater-script"); 
       try { 

        InputStream stream = null; 
        try { 
         stream = getAssets().open("updater-script"); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        FileOutputStream ou = new FileOutputStream(file); 
        byte[] buffer = inputStreamToString(stream).getBytes(); 
        ou.write(buffer);//Now the file has something to be read ... 


        FileInputStream in = new FileInputStream(file); 



        String aa = inputStreamToString(in); 

И второе решение, которое, кажется, проще это:

public String inputStreamToString(InputStream stream){ 
     String aa; 
     Scanner s = new Scanner(stream).useDelimiter("\\A"); 
     if(s.hasNext()){ 
      aa = s.next(); 
     }else{ 
      aa = ""; 
     } 

     return aa;//Now it returns something no matter what ... 

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