2016-09-16 7 views
0

Я написал код, набивающий 8 различных значений синуса в байтовой форме (используя .getbytes) в текстовый файл.Строка в байтовой форме с исходной строкой в ​​java

После того как я запустить его файл создается, содержащий следующее: [B @ 5f18cd5 [B @ 1c515979 [B @ 20c92575 [B @ 75ba3523 [B @ f4c7f77 [B @ 67446579 [B @ 3b621fe6 [B @ 271c537f

до сих пор так хорошо ...

Сейчас я хотел, чтобы инвертировать весь этот процесс в другом проекте Java. Для этого мне нужно знать, как обратиться, например, [B @ 1c515979 к его первоначальному значению, которое равно 0.7071.

Я пытался использовать

System.out.println("Text [Byte Format] : " + bytes.toString()); 

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

Это мой статус-кво ... У кого-то появилась идея?

Благодарим за прослушивание.

+0

Почему вы не храните значения как текст в первую очередь? – aviad

+0

Вы вызываете 'getBytes()' на String? Затем вы должны использовать 'new String (bytes);' вместо 'bytes.toString();'. – Clayn

+0

«Пока все хорошо» ... Нет, не хорошо. Вы записываете данные не так. [B @ ... строки, которые вы видите, не являются представлениями байтовых массивов. Вы получаете их, потому что массивы не имеют метода toString. – Jesper

ответ

2

[[email protected] не байт, это строковое представление ссылки. Вы не можете превратить их во что-либо.

public class Ref { 
    public static void main(final String[] args) { 
     System.out.println(new Ref()); 
    } 
} 
//Outputs: [email protected] 

[email protected] является ссылкой. Вы фактически не записываете значения в файл, а ссылаетесь как на String. B[ означает, что вы пишете byte[] в файл, но не фактические байты в этот массив.

Update

Вы, вероятно, ищете что-то вроде этого:

public static void main(final String[] args) throws FileNotFoundException, 
     IOException { 
    final File f = new File("/tmp/output"); 

    final ObjectOutputStream oos = new ObjectOutputStream(
      new FileOutputStream(f)); 

    for (int i = 0; i < 8; i++) { 
     final double d = Math.sin(i); 
     System.out.println(d); 
     oos.writeDouble(d); 
    } 

    oos.flush(); 
    oos.close(); 

    System.out.println("---"); 

    final ObjectInputStream ois = new ObjectInputStream(
      new FileInputStream(f)); 

    for (int i = 0; i < 8; i++) 
     System.out.println(ois.readDouble()); 

    ois.close(); 

} 
1

Вы не можете. Вы уже потеряли все важные данные. Вызов toString() на byte[] не дает вам ничего полезного, потому что массивы в Java не переопределяют toString() ... поэтому вы получаете реализацию от Object, которая просто указывает тип и хеш-код (который фактически является идентификатором хэш-код, для массивов). Если вы измените содержимое массива байтов и назовите его toString(), вы получите то же значение.

Вместо этого вам необходимо изменить способ сохранения данных. Если вы вообще можете избежать текстового файла, это было бы идеально ... но если вам нужно сделать нужен текстовый файл, самым простым вариантом, вероятно, является преобразование двоичных данных в base64, например. используя java.util.Base64:

String text = Base64.getEncoder().encodeToString(bytes); 
// Write out text... 

... 

// String text = // read from a file 
byte[] bytes = Base64.getDecoder().decode(text); 
0

Строки, которые вы показываете ([[email protected] и т.д.) не являются кодировки значений байтов. Скорее они являются выходным значением метода toString() по умолчанию java.lang.Object: «имя класса» + «@» «хэш-код в шестнадцатеричном формате».

Вы не можете преобразовать это обратно в содержимое байтов.

Вам необходимо изменить способ записи байтов. Попробуйте DataOutputStream написать каждый массив байтов.

Для каждого массива укажите длину массива, используя DataOutputStream.writeInt(), а затем сами байты. Чтобы прочитать их обратно, используйте DataInputStream, сначала прочитайте длину, затем постройте массив байтов этой длины, а затем прочитайте данные обратно в массив.

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

  • Нет связанных вопросов^_^