Преобразовать ArrayList <String>в байт [] - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу иметь возможность преобразовать ArrayList<String>, в котором хранится содержимое файла, считанного из BufferedReader, а затем преобразовать содержимое в байт [], чтобы его можно было зашифровать с помощью класса шифра Java.

Я пытался использовать .getBytes(), но он не работает, так как я думаю, что мне нужно сначала преобразовать ArrayList, и у меня возникают проблемы с выяснением, как это сделать.

Код:

// File variable
private static String file;

// From main()
file = args[2];

private static void sendData(SecretKey desedeKey, DataOutputStream dos) throws Exception {
        ArrayList<String> fileString = new ArrayList<String>();
        String line;
        String userFile = file + ".txt";

        BufferedReader in = new BufferedReader(new FileReader(userFile));
        while ((line = in.readLine()) != null) {
            fileString.add(line.getBytes()); //error here
        }

        Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, desedeKey);
        byte[] output = cipher.doFinal(fileString.getBytes("UTF-8")); //error here
        dos.writeInt(output.length);
        dos.write(output);
        System.out.println("Encrypted Data: " + Arrays.toString(output));
    }

Большое спасибо, заранее!

Ответы [ 6 ]

0 голосов
/ 12 февраля 2019

Почему вы хотите прочитать его как строку и преобразовать в байтовый массив?Начиная с Java 7 вы можете сделать:

byte[] input= Files.readAllBytes(new File(userFile.toPath());

, а затем передать этот контент в шифр.

byte[] output = cipher.doFinal(input);

Также вы можете рассмотреть возможность использования потоков (InputStream и CipherOutputStream) вместо загрузки всего файла в память на тот случай, если вам понадобится обрабатывать большие файлы.

0 голосов
/ 12 февраля 2019

Вы можете попытаться воспользоваться преимуществами функции сериализации Java и использовать ObjectOutputStream, обернутый вокруг ByteOutputStream:

try (ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bout)) {
  out.writeObject(list);
  out.flush();

  byte[] data = bout.toByteArray();
} catch (IOException e) {
  // Do something with the exception
}

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

0 голосов
/ 12 февраля 2019

Либо объедините строки, либо создайте StringBuffer.

StringBuffer buffer = new StringBuffer();
String line;
String userFile = file + ".txt";

BufferedReader in = new BufferedReader(new FileReader(userFile));
while ((line = in.readLine()) != null) {
   buffer.append(line); //error here
}

byte[] bytes = buffer.toString().getBytes();
0 голосов
/ 12 февраля 2019

Объедините все строки в один на Like

String anyName = allstring;

и затем назовите это

anyName.getBytes();

, это поможет вам.

0 голосов
/ 12 февраля 2019

Зачем использовать ArrayList.Просто используйте StringBuffer и сохраните все содержимое файла в одну строку.

0 голосов
/ 12 февраля 2019

Таким образом, полное значение ArrayList на самом деле является единственным String?

. Одним простым подходом было бы объединить все Strings в нем в один и затем вызвать .getBytes()на нем.

...