Ja w jednym programie zrealizowałem zapis i odczyt tablicy stringów w .NET w poniższy sposób, w ten sposób można oczywiście zrobić w Javie, a nawet w sytuacji, gdy klient i serwer są napisane w różnych technologiach.
Wyglada to tak:
Tworzysz obiekt strumienia w pamięci, a następnie metody, które zapisują i odczytują z tego strumienia.
Strona wysyłająca tworzy strumień w pamięci, zapełnia go, konwertuje na tablicę bajtową i wysyła, natomiast strona odbierająca konwertuje otrzymaną tablicę bajtową na strumień w pamięci i wyciąga z niego dane w odpowiedni sposób. Oczywiście należy sprawdzić poprawność i kolejność odczytów po obu stronach, w przeciwnym wypadku się rozjedzie i i może dojść do próby odczytania danych poza strumieniem lub nieodczytanie całego strunienia, a dane będą z całą pewnością błędne. Do odczytu i zapisu danych trzeba sobie przygotować odpowiednie metody. W jednym programie w C# mam takie metody, w Javie mozna zrobić analogicznie. Wśród ponizszych metod jest właśnie odczyt i zapis listy.
// Zamiana napisu na ciag bajtow
public static byte[] ToBytes(string str)
{
return Encoding.UTF8.GetBytes(str);
}
// Zamiana ciagu bajtow na napis
public static string ToStr(byte[] bytes)
{
return Encoding.UTF8.GetString(bytes);
}
// Zapis do strumienia
public static void StreamWrite(Stream Str, bool S)
{
if (S)
{
Str.WriteByte(1);
}
else
{
Str.WriteByte(0);
}
}
public static void StreamWrite(Stream Str, byte[] S)
{
int L = S.Length;
StreamWrite(Str, L);
Str.Write(S, 0, L);
}
public static void StreamWrite(Stream Str, string S)
{
StreamWrite(Str, ToBytes(S));
}
public static void StreamWrite(Stream Str, List<string> S)
{
if (S == null)
{
StreamWrite(Str, 0);
}
else
{
StreamWrite(Str, S.Count);
for (int i = 0; i < S.Count; i++)
{
StreamWrite(Str, S[i]);
}
}
}
public static void StreamWrite(Stream Str, List<byte[]> S)
{
if (S == null)
{
StreamWrite(Str, 0);
}
else
{
StreamWrite(Str, S.Count);
for (int i = 0; i < S.Count; i++)
{
StreamWrite(Str, S[i]);
}
}
}
public static void StreamWrite(Stream Str, int S)
{
int IB1 = (S >> 24) & 255;
int IB2 = (S >> 16) & 255;
int IB3 = (S >> 8) & 255;
int IB4 = S & 255;
Str.WriteByte((byte)IB1);
Str.WriteByte((byte)IB2);
Str.WriteByte((byte)IB3);
Str.WriteByte((byte)IB4);
}
// Odczyt ze strumienia
public static void StreamRead(Stream Str, out bool S)
{
if (Str.ReadByte() != 0)
{
S = true;
}
else
{
S = false;
}
}
public static void StreamRead(Stream Str, out byte[] S)
{
int L;
StreamRead(Str, out L);
S = new byte[L];
Str.Read(S, 0, L);
}
public static void StreamRead(Stream Str, out string S)
{
byte[] X;
StreamRead(Str, out X);
S = ToStr(X);
}
public static void StreamRead(Stream Str, out int S)
{
byte[] B = new byte[4];
Str.Read(B, 0, 4);
int IB1 = ((int)B[0]) << 24;
int IB2 = ((int)B[1]) << 16;
int IB3 = ((int)B[2]) << 8;
int IB4 = ((int)B[3]);
S = IB1 + IB2 + IB3 + IB4;
}
public static void StreamRead(Stream Str, out List<string> S)
{
int L;
StreamRead(Str, out L);
S = new List<string>();
for (int i = 0; i < L; i++)
{
string X;
StreamRead(Str, out X);
S.Add(X);
}
}
public static void StreamRead(Stream Str, out List<byte[]> S)
{
int L;
StreamRead(Str, out L);
S = new List<byte[]>();
for (int i = 0; i < L; i++)
{
byte[] X;
StreamRead(Str, out X);
S.Add(X);
}
}