Filewriter создает файл, доступный только для чтения

Я использую средство записи файлов для записи массива объектов в файл в виде строк в формате, похожем на CSV. Во всяком случае, у меня были проблемы с его работой, но теперь я получаю исключение FileNotFound, и в нем говорится, что созданный файл доступен только для чтения в исключении. Файл создается, как я проверял, но видимо не может быть записан. Однако я все равно хочу перезаписать содержимое, но получаю эту ошибку.

        ///Like a CSV file. 
        try{
            FileWriter writer_file = new FileWriter("PeopleDetailsFile");

            String filestring = ""; ///initializes filestring, which is written to the file.
            for(PeopleDetails person : peopledetails_file){
                String person_detail_string = "";
                person_detail_string = person.name + "," + person.number;
                filestring = filestring + person_detail_string + ";";

            }
            writer_file.write(filestring);
            writer_file.close();
        }
            catch (IOException e) {
                Log.e("ERROR", e.toString());

        }finally{
            ///Hopefully won't get an error here.
            Intent switch_menu = new Intent(this, MenuList.class);
            startActivity(switch_menu);
        }

person Swedish Architect    schedule 02.01.2014    source источник
comment
У вас есть необходимые разрешения? Также убедитесь, что вы не подключили свое устройство к компьютеру при работе с файлами, потому что, хотя у вас есть доступ к файлам с вашего компьютера, вы не можете получить к ним доступ из приложений.   -  person Ridcully    schedule 03.01.2014
comment
какие разрешения мне нужны? Запись во внутренние файлы данных для моего приложения (надеюсь :)), работающего на эмуляторе   -  person Swedish Architect    schedule 03.01.2014
comment
В одном из ваших других вопросов вы говорите, что файл (тот же код) не создается, что происходит? Кстати, вы рассматривали возможность чтения документации по этим методам? Вы действительно должны привыкнуть понимать классы, прежде чем пытаться их использовать.   -  person Simon    schedule 03.01.2014
comment
ааа... дерьмо, я вставил неправильный код, отсюда и другая проблема, но тот же код!!! Спасибо!!   -  person Swedish Architect    schedule 03.01.2014


Ответы (5)


Вызовите этот метод с fileName и List в качестве аргумента.

public void fileWrite(String fileName,ArrayList<PeopleDetails> person){
        File           f ;
        FileWriter     fw = null;
        BufferedWriter bw = null;
        try {
            f  = new File(fileName);
            fw = new FileWriter(f.getAbsoluteFile());
            bw = new BufferedWriter(fw);
            for(PeopleDetails i:person){
                bw.write(i.name+","+i.number+";");
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if(bw!=null)
                    bw.close();
                if(fw!=null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }   
    }
person Rakesh KR    schedule 02.01.2014

Попробуйте использовать PrintWriter. Я даю вам несколько кратких указаний ниже, но потребуются изменения. Кроме того, обратите внимание, что я сохраняю имя и номер в разных строках, поэтому при чтении деталей вы должны использовать тот же подход.

 public void writeToFile(String fileName, ArrayList<PeopleDetails> peopledetails) {
        try {
            /*
             * Create a FileWriter object that handles the low-level details of
             * writing
             */
            FileWriter theFile = new FileWriter(fileName);

            /* Create a PrintWriter object to wrap around the FileWriter object */
            /* This allows the use of high-level methods like println */
            PrintWriter fileOut = new PrintWriter(theFile);

            /* Print some lines to the file using the println method */
            for (int i = 0; i < peopledetails.size(); i++) {
                fileOut.println(peopledetails.get(i).getName());
                fileOut.println(peopledetails.get(i).getNumber());
            }
            /* Close the file so that it is no longer accessible to the program */
            fileOut.close();
        }

        /* Handle the exception thrown by the FileWriter methods */
        catch (IOException e) {
            System.out.println("Problem writing to the file");
        }
    } /* End of method writeToFile */
person nmargaritis    schedule 02.01.2014

Вы можете попробовать удалить файл каждый раз, когда не хотите его перезаписывать. пытаться{

        File file = new File("PeopleDetailsFile");

        if(file.delete()){
            System.out.println(file.getName() + " is deleted!");
        }else{
            System.out.println("Delete operation is failed.");
        }

    }catch(Exception e){

        e.printStackTrace();

    }

В качестве альтернативы: вы можете сделать FileWriter там, где он добавляется к текущему документу:

 FileWriter writer_file = new FileWriter("PeopleDetailsFile", true); //true means append = true;
person snocavotia    schedule 02.01.2014
comment
возможное решение, но не идеальное. Спасибо хоть :) - person Swedish Architect; 03.01.2014

Используйте другой конструктор FileWriter, который принимает флаг добавления: FileWriter (файл файла, логическое добавление)

person Daniel Nuriyev    schedule 02.01.2014
comment
да, но дело в том, чтобы перезаписать его, чтобы я мог его заказать. Если я добавлю, это не будет заказано. Я мог бы заказать его в приложении, конечно... спасибо - person Swedish Architect; 03.01.2014
comment
Так что удалите старую перед тем как писать. Это очевидно. Почему ты не сделал этого в первую очередь? - person Daniel Nuriyev; 03.01.2014

Возможно, вы пытаетесь записать в «корневую» папку. Вы должны следить за контекстом Android openFileOutput вместо FileWriter для записи в каталог приложения (вместо корня).

Согласно документации:

Откройте для записи частный файл, связанный с пакетом приложения этого контекста. Создает файл, если он еще не существует.

person StoopidDonut    schedule 02.01.2014