Как разбить массив байтов, который содержит несколько «строк» ​​в Java? - PullRequest
0 голосов
/ 08 ноября 2019

Скажем, у нас есть такой файл:

one 
two 
three

(но этот файл был зашифрован)

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

Я бы хотел пройти каждую строку, преобразовать ее в строку и выполнить мойоперация на нем, но я не знаю, как:

  1. Найти строки в байтовом массиве
  2. Нарезать исходный байтовый массив на «линии» (я бы преобразовал эти кусочки в строку, чтобы отправить другим моим методам)
  3. Правильно пройти через байтовый массив, где каждая итерация представляет собой новую «строку»

Также: нужно ли рассматривать разные ОС файлвозможно, был составлен в? Я знаю, что есть некоторые различия между новыми строками в Windows и Linux, и я не хочу, чтобы мой метод работал только с одним форматом.

Редактировать: Следуя некоторым советам из ответов здесь, я смог написать некоторыекод, который выполняет работу. Я все еще задаюсь вопросом, достоин ли этот код сохранения или я делаю что-то, что может не сработать в будущем:

byte[] decryptedBytes = doMyCrypto(fileName, accessKey);
ByteArrayInputStream byteArrInStrm = new ByteArrayInputStream(decryptedBytes);
InputStreamReader inStrmReader = new InputStreamReader(byteArrInStrm);
BufferedReader buffReader = new BufferedReader(inStrmReader);

String delimRegex = ",";
String line;
String[] values = null;

while ((line = buffReader.readLine()) != null) {
    values = line.split(delimRegex);
    if (Objects.equals(values[0], tableKey)) {
        return values;
    }
}
System.out.println(String.format("No entry with key %s in %s", tableKey, fileName));
return values;

В частности, мне посоветовали явно установить кодировку, но я не смог точно определить, где

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Если вы хотите передать это, я бы посоветовал:

  • Создать ByteArrayInputStream, чтобы обернуть ваш массив
  • Обернуть это в InputStreamReader для преобразования двоичных данных. к тексту - я предлагаю вам явно указать используемую кодировку текста
  • Создать вокруг нее BufferedReader для чтения строки за раз

Тогда вы можете просто использовать:

String line;
while ((line = bufferedReader.readLine()) != null)
{
    // Do something with the line
}

BufferedReader обрабатывает разрывы строк во всех операционных системах.

Примерно так:

byte[] data = ...;
ByteArrayInputStream stream = new ByteArrayInputStream(data);
InputStreamReader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(streamReader);

String line;
while ((line = bufferedReader.readLine()) != null)
{
    System.out.println(line);
}

Обратите внимание, что в общем you 'Я хотел бы использовать блоки try-with-resources для потоков и читателей - но в данном случае это не имеет значения, потому что это просто в памяти.

0 голосов
/ 08 ноября 2019

Как сказал Скотт, я хотел бы увидеть, что вы придумали, чтобы мы могли помочь вам изменить его в соответствии с вашими потребностями.

Что касается вашего последнего комментария об ОС;если вы хотите поддерживать несколько типов файлов, вам следует рассмотреть возможность создания нескольких функций, которые поддерживают эти различные расширения файлов. Насколько я знаю, вам нужно указать, какой файл и какой тип файла вы читаете с вашим кодом.

...