Запись байтового массива в txt файл и его чтение

У меня есть байтовый массив, который мне нужно записать в txt файл. После этого мне нужно прочитать этот массив байтов, и здесь возникает проблема. Я прочитал эту Преобразование строки Java в байтовый массив Но он работает только с положительными числами. Вот что я имею

public static void main(String args[]) throws UnsupportedEncodingException
{
    byte [] a= new byte [2];
    a[0]=15;
    a[1]=-2;        
    String line = new  String(a, "UTF-8");      
    byte[] b = line.getBytes();
    System.out.println(b[0]);
    System.out.println(b[1]);
}

и результат

15
63

toString() тоже не работает.

Заранее спасибо за помощь.

Ответ 1

Я написал свою маленькую функцию, которая преобразует String как [-3, 123, 89, 0, -34, 78, -45, -78] в массив байтов. Я не знал, как использовать кодировку Base64. Поэтому я написал свою небольшую функцию. Чтобы получить вышеупомянутую строку, мы должны сделать String line = new String(Arrays.toString(name_of_array))

public class StringToByteArray {
public static void main(String args[])
{
    String line= "[-3, 123, 89, 0, -34, 78, -45, -78]";
    String some=line.substring(1, line.length()-1);     
    int element_counter=1;

    for(int i=0; i<some.length(); i++)
    {           
        if (some.substring(i, i+1).equals(","))
        {
            element_counter++;
        }       

    }
    int [] comas =new int[element_counter-1];
    byte [] a=new byte[element_counter];
    if (a.length==1)
    {
        a[0]= Byte.parseByte(some.substring(0));
    }       
    else 
    {
        int j=0;
        for (int i = 0; i < some.length(); i++) 
        {
            if (some.substring(i, i+1).equals(","))
            {
                comas[j]=i;
                j++;
            }
        }           
        for (int i=0; i<element_counter; i++)
        {
            if(i==0)
            {
                a[i]=Byte.parseByte(some.substring(0, comas[i]));
            }
            else if (i==element_counter-1)
            {
                a[i]=Byte.parseByte(some.substring(comas[comas.length-1]+2));
            }
            else
            {
                a[i]=Byte.parseByte(some.substring(comas[i-1]+2, comas[i]));
            }

        }
    }
    System.out.println(a[0]);

}
}

Результат -3

Надеюсь, это будет полезно

Ответ 2

Для меня это сохраняет отрицательное значение:

package com.sandbox;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Arrays;

public class Sandbox {

    public static void main(String args[]) throws UnsupportedEncodingException {
        byte[] a = new byte[2];
        a[0] = 15;
        a[1] = -2;
        String line = new String(a);
        byte[] b = line.getBytes();
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
        System.out.println(Charset.defaultCharset());
    }        
}

Для меня это выдает:

[15, -2]
[15, -2]
windows-1250

В основном, вы используете неправильную кодировку для сохранения отрицательных байтов. Здесь вы можете найти более подробную информацию. И на самом деле недостаток в том, что вы пытаетесь сделать, это поместить байты в строку. Как вы можете видеть здесь,

... Если вы начинаете с байта [] и на самом деле не содержат текстовых данных, нет "правильного преобразования". Строки для текста, byte [] - для двоичных данных, и единственно разумная вещь - избегать конвертации между ними, если вам не нужно.

Если вы действительно должны использовать String для хранения двоичных данных, самым безопасным способом является использование кодировки Base64.

Если вам действительно не нужно сохранять это в String, вы должны написать/прочитать из потока ввода/вывода в файл. Существует много ответов SO, в которых показано, как это сделать.