2014-09-16 5 views
2

Я новичок в Java, и я не знаю, как сделать следующее:Как преобразовать строковое представлены ByteBuffer в массив байтов в Java

на Scala приложение где-то преобразует строку в байты:

ByteBuffer.wrap(str.getBytes) 

Я собираю этот байтовый массив как Java String, и я хотел бы сделать обратное, что выше сделал код Scala, следовательно, получить исходную строку (объект str выше).

Получение ByteBuffer как String для начала - это единственный вариант, который у меня есть, поскольку я читаю его из потока AWS Kinesis (или это?). Код Scala также не должен изменяться.

Пример строки:

String str = "AAAAAAAAAAGZ7dFR0XmV23BRuufU+eCekJe6TGGUBBu5WSLIse4ERy9............"; 

Как это может быть достигнуто в Java?

EDIT

Хорошо, так что я буду пытаться разработать немного больше о процессе:

  1. третья сторона Scala приложение производит CSV строки, которые мне нужно потреблять
  2. Перед хранением этих рядов в потоке AWS Kinesis приложение делает следующее для каждой строки:

    ByteBuffer.wrap(output.getBytes); 
    
  3. Я читать данные из потока в виде строки, а строка может выглядеть следующим образом одно:

    String str = "AAAAAAAAAAGZ7dFR0XmV23BRuufU+eCekJe6TGGUBBu5WSLIse4ERy9............"; 
    
  4. Мне нужно восстановить содержимое строки выше в исходную читаемую, форму;

Надеюсь, я сделал это яснее сейчас, извиняюсь за то, что вы все запутались.

+0

Будет не что-то вроде 'str.toCharArray.map (_. toByte)' работает на Java? – 4lex1v

+0

Возможно, но я не уверен, что я не знаю, что вы там сделали с помощью 'map (_. ToByte)' part – YuvalHerziger

+3

«Я прочитал данные из потока в виде строки» - как? Вы просто передаете массив байтов в конструктор 'String', или используете какую-то кодировку, например base64? –

ответ

2

Если вы хотите перейти от byte[] в String, попробуйте new String(yourBytes).

Оба getBytes и String(byte[]) используют кодировку по умолчанию.


От Amazon Kinesis Service API Reference:

сгустка данные поместить в записи, которая является кодировкой Base64, когда двоичный объект сериализации.

Необходимо, чтобы base64 декодировал строку.Использование Java 8 это будет выглядеть так:

byte[] bytes = Base64.getDecoder().decode("AAAAAAAAAAGZ7dFR0XmV23BR........"); 
str = new String(bytes, "utf-8")); 

Другие варианты: Base64 Encoding in Java

+0

Я действительно пробовал это, это могло быть проще, если мой вход не был строкой, которая является байтами (см. Выше). То, что вы предлагаете, просто обрабатывает строку, как если бы она была ее содержимым в ее читаемой форме. – YuvalHerziger

+0

Не могли бы вы уточнить. Я думал, вы в основном хотели бы обратного getBytes? – aioobe

+0

Уверен: у меня есть строка, которая выглядит так: '' String str = "AAAAAAAAAAGZ7dFR0XmV23BR" '. Я знаю, что она была преобразована в байты, но я получаю ее как тип String. Я хочу знать, что стоит за этими байтами в читаемая форма – YuvalHerziger

1

Я не уверен, если я понимаю, этот вопрос точно, но вы имеете в виду это?

String decoded = new String(bytes); 
0
public static void main(String[] args){ 
    String decoded = new String(bytesData); 
    String actualString; 
    try{ 
     actualString = new String(bytesData,"UTF-8"); 
     System.out.printLn("String is" + actualString); 
    }catch(UnsupportedEncodingException e){ 
     e.printstacktrace(); 
    } 
} 
+0

То, что вы предлагаете, просто обрабатывает строку так, как если бы она содержалась в ее читаемой форме. Исходная строка выглядит так: 'String str =" AAAAAAAAAAGZ7dFR0XmV23BR ........ "' – YuvalHerziger

0

К сожалению, ответ неверный. Опять же, ByteBuffer - это класс java. Таким образом, они могут работать так же, как Вам нужно Java версия ..

От Кафки ApiUtils:

def writeShortString(buffer:ByteBuffer,string:String){ 
    if(String == null){ 
     buffer.putShort(-1) 
    } 
    else{ 
    val encodedString = string.getBytes(“utf-8”) 
    if(encodedString.length > Short.MaxValue){ 
     throw YourException(Your Message) 
    else{ 
     buffer.putShort(encodedString.length.asInstanceOf[Short]) 
     buffer.put(encodedString) 
    } 
    } 

}

0

Для сгустков данных Kinesis:

private CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); 
decoder.decode(record.getData()).toString(); 
Смежные вопросы