powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / как это сделать на Java?
7 сообщений из 7, страница 1 из 1
как это сделать на Java?
    #32434090
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с Java только начал разбираться, и решил разобрать такой примерчик. Как лучше на Java считать массив структур из файла, кот. записан скажем вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
#include <stdio.h>

typedef struct 
{
	int deptno;
	char dname[ 14 ];
	char loc[ 13 ];
}DEPT;
DEPT dept[ 4 ]={
	{ 10 , "ACCOUNTING" , "NEW YORK" },
	{ 20 , "RESEARCH" , "DALLAS" },
    { 30 , "SALES" , "CHICAGO" },
    { 40 , "OPERATIONS" , "BOSTON" }};

void main()
{
	FILE *f;
	
	if ( (f = fopen( "dept.dat" , "w" )) ==NULL ) return;
	fwrite(dept,sizeof(DEPT), 4 ,f);
	fclose(f);
 /*
	{
		DEPT d[4]={0};
		int i;

		if ( (f = fopen("dept.dat","r")) ==NULL ) return;
		fread(d,sizeof(DEPT),4,f);
		fclose(f);

		for (i=0;i<4;i++)
			printf("%d %15s %15s\n",d[i].deptno,d[i].dname,d[i].loc);
	}
*/ 
}


Интересует как организовать ( через вектор или object ) java-код , аналогичный тому, что закоментирован в данном Си-примере.

Еще 2-ой вопрос
Есть ли в java альтернатива опции для задания выравнивания границ байтов, навроде того:

# pragma pack (push)
# pragma pack (1)
typedef struct
{
char c[6];
int i;
}ST1;
# pragma pack (pop)


Буду благодарен за ответ с примером.
...
Рейтинг: 0 / 0
как это сделать на Java?
    #32434297
Edgiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо будет создать буффер - массив байтов
потом записать в него содержимое файла и из буфера уже заполнять соотвеструющий java-класс
например для установки int потребуеться

dept.deptno =
( (buffer[offset++]&0xFF)<<24 ) |
( (buffer[offset++]&0xFF)<<16 ) |
( (buffer[offset++]&0xFF)<<8 ) |
( (buffer[offset++]&0xFF) )

сам уже давно сделал отдельный класс для считывания int, short, char, строк и т.п.
...
Рейтинг: 0 / 0
как это сделать на Java?
    #32435038
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял что задача состоит в основном в поддержке уже существующего
решения
т.е. есть множество двоичных файлов в виде определенном виде
и java-код должен их читать
тогда дейтсвительно так как сказал предыдущий оратор.

Дело в том, что в C++ способ хранения структур в файлах был такой и ничего другого не было, но java имеет множество новых концепций
попробуй сначала сериализацию во всех вариациях,
потом хранение в виде properties файлов
ну и наконец с помощью документов xml и заниматься его анализом с помощью apache решений.
еще удобно сделать хранение данных в виде xml а по ним создавать классы
есть castor, что-то еще, забыл, давно не программил.

Может продолжит кто еще.
...
Рейтинг: 0 / 0
как это сделать на Java?
    #32435043
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Есть ли в java альтернатива опции для задания выравнивания границ байтов,
>> навроде того:


ну вообще-то сама концепция жабы этому противоречит, если у тебя есть переменная типа byte (8 бит) то это значит только что при различных мат и бинарных операциях она будет себя вести как байт, но как именно она в памяти и внутри jvm будет представляться это никого не должно интересовать.
...
Рейтинг: 0 / 0
как это сделать на Java?
    #32435115
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да нет, с задачей там все не совсем так на самом деле.
Просто в промышленной базе есть одна табличка где в поле типа varchar2(2000) впихнули си-шным кодом массив структур. Ну допустим из servlet-а через JDBC я все поля прочитал, а это одно мне как разгребсти, думал в java это как то несложно будет, а оказалось вон оно что. Придется искать какое-то другое решение.
...
Рейтинг: 0 / 0
как это сделать на Java?
    #32436002
Грасоff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто в промышленной базе есть одна табличка где в поле типа varchar2(2000) впихнули си-шным кодом массив структур. Ну допустим из servlet-а через JDBC я все поля прочитал, а это одно мне как разгребсти, думал в java это как то несложно будет, а оказалось вон оно что. Придется искать какое-то другое решение.

чего тут искать. прочитал поле. да? например,

Код: plaintext
byte[] data2000 = getFromDB();


сама структура DEPT не что иное как отражение в массив байт:

Код: plaintext
byte[] dept1 = new byte[ 4  +  14  +  13 ]; // сколько там в си размер int? я принял  4  байта.


ну и все. читай циклом массив data2000:

Код: plaintext
1.
2.
3.
for (int i =  0 ; ...) {
  System.arraycopy(...); // здесь из массива data2000 копируются ( 4  +  14  +  13 ) байт в массив dept1
  // а здесь берешь из массива dept1 по соотв. смещениям поля структуры DEPT
}


это самое простое решение. можно пойти дальше, создав класс работающий с массивом data2000 как с потоком (stream) и как поток его представляющий.

или не так?
...
Рейтинг: 0 / 0
как это сделать на Java?
    #32436519
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Грасоff
впринципе так, покрайне мере смысл ясен

подобный вопрос еще тут нашел
http://www.relib.com/forums/topic.asp?id=812162

Вообщем буду пробовать :)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / как это сделать на Java?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]