Удаление начальных и конечных символов из потока - PullRequest
1 голос
/ 23 ноября 2011

У меня есть низкоуровневый механизм кэширования, который получает массив json с сервера и кэширует его в файл.

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

[{"id":3144,"created_at":"1322064201"}][{"id":3144,"created_at":"1322064201"}] 

где очевидно, что я желаю что-то вроде этого:

[{"id":3144,"created_at":"1322064201"},{"id":3144,"created_at":"1322064201"}]

Какой самый эффективный / действенный способ сделать это?

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

Для контекста мой код делает что-то вроде этого:

    ... input stream passed with new content

    File newCache = new File("JamesBluntHatersClub")
    FileOutputStream tempFileOutputStream = new FileOutputStream(newCache);
    FileInputStream fileInputStream = new FileInputStream(existingCache);
    copyStream(fileInputStream, tempFileOutputStream);
    copyStream(inputStream, tempFileOutputStream);

    ... clean up

ОБНОВЛЕНИЕ:

Реализовав FilterReader , который проверяет символы по одному за раз так:

@Override
public int read() throws IOException {
    int content = super.read();
    // replace open square brackets with comma
    switch (content) {
        case SQUARE_BRACKETS_OPEN:
            return super.read();
        case SQUARE_BRACKETS_CLOSE:
            return super.read();
        default:
            return content;
    }
}

время обработки неприемлемо медленно, поэтому я ищу другой вариант. Я думал об использовании размера файла для определения размера файла и удаления квадратной скобки таким образом

1 Ответ

0 голосов
/ 24 ноября 2011

Этот метод добился цели

/**
 * Copys the input streams in order to the output stream and retains json array
 * format
 * 
 * @param inputStreamA
 * @param inputStreamB
 * @param outputStream
 * @throws IOException
 */
private void copyStreamsToOutput(InputStream inputStreamA, InputStream inputStreamB,
        FileOutputStream outputStream) throws IOException {
    copyStream(inputStreamA, outputStream);
    // truncate file to remove trailing ']'
    outputStream.getChannel().truncate(outputStream.getChannel().size() - 1);
    // add comma between json objects
    outputStream.write(COMMA);
    // skip '['
    inputStreamB.skip(1);
    // and copy rest of streamas normal
    copyStream(inputStreamB, outputStream);
}

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

UPDATE

/**
 * Copys the input streams in order to output stream and retains json array
 * format
 * 
 * @param inputStreamA
 * @param inputStreamB
 * @param outputStream
 * @throws IOException
 */
private void copyStreamsToOutput(InputStream inputStreamA, InputStream inputStreamB,
        FileOutputStream outputStream) throws IOException {
    copyStream(inputStreamA, outputStream);
    long channelSize = outputStream.getChannel().size();
    // truncate file to remove trailing ']'
    outputStream.getChannel().truncate(channelSize - 1);
    // check to see if array was empty (2 = [])
    if (channelSize > 2) {
        // add comma between json objects
        outputStream.write(COMMA);
    }
    // skip '['
    inputStreamB.skip(1);
    // and copy rest of streams normal
    copyStream(inputStreamB, outputStream);
    long newChannelSize = outputStream.getChannel().size();
    // check if we haven't just added a empty array
    if(newChannelSize - channelSize < 2){
        // if so truncate to remove comma 
        outputStream.getChannel().truncate(channelSize - 1);
        outputStream.write(CLOSE_SQUARE_BRACKET);
    }
}

Добавлена ​​возможность обрабатывать пустой массив json в любом потоке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...