2016-06-27 7 views
-1

Я пытаюсь прочитать текстовый файл в массиве, изменить массив и затем сохранить его обратно в текстовый файл для дальнейшего использования.Храните текстовый файл в массив и наоборот

Массив шириной всего один столбец, поэтому я хочу, чтобы каждая строка текстового файла хранилась в каждом элементе массива.

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

Вот мой код:.

checkReadHeader = parts[0]; 

if (checkReadHeader.equals("LETSDOIT")) 
{ 
    readMsg = parts[1]; 
    readj = 0; 

    if(readMsg.equals(logging1)){ 

     //--------------------------------------- 
     // READ readlist1.txt AND STORE IT INTO STRING ARRAY readlist 
     //--------------------------------------- 
     try 
     { 
      fIn = context.openFileInput("readList1.txt"); 
      isr = new InputStreamReader(fIn); 
      while ((charRead = isr.read(inputBuffer)) > 0) 
      { 
       String readString = String.copyValueOf(inputBuffer, 0, charRead); 
       if(!readString.equals("\n")) 
       { 
        readList[readj][0] += readString; 
       } 
       else 
       { 
        readj += 1; 
       }   
       inputBuffer = new char[100]; 
      } 
     } 
     catch (IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
    } 

    //--------------------------------------- 
    // MODIFY readlist 
    //--------------------------------------- 

    readList[j][0] = testdate; 

    //--------------------------------------- 
    // STORE readlist BACK INTO TEXT FILE readlist1.txt 
    //--------------------------------------- 

    try 
    { 
     fOut = context.openFileOutput("readList1.txt", context.MODE_WORLD_READABLE); 
     osw = new OutputStreamWriter(fOut); 
     osw.write(readList.toString()); 
     osw.flush(); 
     osw.close(); 
    } 
    catch (IOException ioe) 
    { 
     ioe.printStackTrace(); 
    } 
} 

Мое объявление переменных - все в порядке, поскольку я только сейчас сталкиваюсь с ошибкой во время выполнения. Пожалуйста, сообщите мне о каких-либо ошибках в моем коде - спасибо заранее :-)

+0

Что такое среда выполнения ошибок? – Fildor

+0

Считаете ли вы использование [read ** Line **] (https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine())? – Fildor

+0

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

ответ

1

Первый, не имеет смысла использовать массив в качестве внутренней структуры данных для вашего файла. Потому что вы не знаете, сколько строк вы прочтете заранее. A List<String> является более достаточным с ArrayList или LinkedList в качестве реализации.

Второе: Не используйте необработанное Reader, но BufferedReader. С помощью этого BufferedReader вы можете прочитать файл по строкам с помощью метода readLine(). Аналогичным образом вы можете использовать PrintWriter для записи строки за строкой в ​​файл.

В-третьих: Вы должны использовать явное кодирование символов. Не полагайтесь на стандартную кодировку, потому что стандартная кодировка может отличаться для разных операционных систем (например, Windows-ANSI aka Cp1252 для Windows и UTF-8 для Linux).

Четвертый: Используйте инструкцию try-with-resources, чтобы открыть входные и выходные потоки. Так что вам легче быть уверенными, что они закрыты в каждом случае.

Я предполагаю, что возвращаемый тип context.openFileInput("readList1.txt") является «InputStream` и символ кодировки UTF-8:

List<String> readList = new ArrayList<String>(); 
// Read the file line by line into readList 
try(
    BufferedReader reader = new BufferedReader(new InputStreamReader(
     context.openFileInput("readList1.txt"), "UTF-8")); 
) { 
    String line; 
    while((line = reader.readLine()) != null) { 
    readList.add(line); 
    } 
} catch(IOException ioe) { 
    ioe.printStackTrace(); 
} 

// Modify readList 
// ... 

// Write readList line by line to the file 
try(
    PrintWriter writer = new PrintWriter(new OutputStreamWriter(
    context.openFileOutput("readList1.txt", context.MODE_WORLD_READABLE), "UTF-8"))); 
) { 
    for(String line: readList) { 
    writer.println(line); 
    } 
    writer.flush(); 
} catch (IOException ioe) { 
    ioe.printStackTrace(); 
} 
+0

Линия try ( BufferedReader reader = new BufferedReader (новый InputStreamReader ( context.openFileInput ("readList1.txt »),« UTF-8 »)),« ) отображается как ошибка, и я думаю, что это потому, что неправильный или возвращаемый тип и кодировка символов. Как я могу это проверить? –

+0

Какая версия Java вы используете? Оператор try-with-resources доступен только с Java 7. – vanje

+0

Я использую версию 8, но я не уверен, действительно ли ваш метод решит мою проблему. В настоящее время у меня есть список имен в массиве.Если я получаю отчет «читать» от одного из этих людей, я хотел бы сохранить дату, когда я получил отчет в другом массиве с именем «readList», который будет отображаться рядом с списком имен. Следовательно, я сможет узнать, кто прочитал мое сообщение и дату его чтения. –

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