Skip to content

Commit 71f6433

Browse files
committed
[zmat] make zlib/gzip encoder/decoder use java for octave, update octavezmat.m
1 parent 011df31 commit 71f6433

5 files changed

Lines changed: 459 additions & 160 deletions

File tree

gzipdecode.m

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
%
1616
% input:
1717
% input: a string, int8/uint8 vector or numerical array to store the GZIP-compressed data
18-
% info (optional): a struct produced by the zmat/lz4hcencode function during
18+
% info (optional): a struct produced by the zmat/gzipencode function during
1919
% compression; if not given, the inputs/outputs will be treated as a
2020
% 1-D vector
2121
%
@@ -46,28 +46,53 @@
4646
[varargout{1:nargout}] = zmat(varargin{1}, 0, 'gzip', varargin{2:end});
4747
end
4848
return
49-
elseif (isoctavemesh)
50-
[varargout{1:nargout}] = octavezmat(varargin{1}, 0, 'gzip');
51-
return
5249
end
53-
error(javachk('jvm'));
5450

5551
if (ischar(varargin{1}))
5652
varargin{1} = uint8(varargin{1});
5753
end
5854

5955
input = typecast(varargin{1}(:)', 'uint8');
6056

61-
gzip = java.util.zip.GZIPInputStream(java.io.ByteArrayInputStream(input));
62-
buffer = java.io.ByteArrayOutputStream();
63-
org.apache.commons.io.IOUtils.copy(gzip, buffer);
64-
gzip.close();
57+
if (~usejava('jvm'))
58+
if (nargin > 1)
59+
[varargout{1:nargout}] = octavezmat(varargin{1}, varargin{2}, 'gzip');
60+
else
61+
[varargout{1:nargout}] = octavezmat(varargin{1}, 0, 'gzip');
62+
end
63+
return
64+
end
6565

66-
if (nargout > 0)
67-
varargout{1} = typecast(buffer.toByteArray(), 'uint8')';
68-
if (nargin > 1 && isstruct(varargin{2}) && isfield(varargin{2}, 'type'))
69-
inputinfo = varargin{2};
70-
varargout{1} = typecast(varargout{1}, inputinfo.type);
71-
varargout{1} = reshape(varargout{1}, inputinfo.size);
66+
if (isoctavemesh)
67+
% Octave with Java: write/read bytes one at a time
68+
n = numel(input);
69+
inputBaos = javaObject('java.io.ByteArrayOutputStream', n);
70+
for i = 1:n
71+
inputBaos.write(int32(input(i)));
72+
end
73+
bais = javaObject('java.io.ByteArrayInputStream', inputBaos.toByteArray());
74+
gzis = javaObject('java.util.zip.GZIPInputStream', bais);
75+
baos = javaObject('java.io.ByteArrayOutputStream');
76+
while true
77+
b = gzis.read();
78+
if (b < 0)
79+
break
80+
end
81+
baos.write(b);
7282
end
83+
gzis.close();
84+
varargout{1} = typecast(baos.toByteArray(), 'uint8')';
85+
else
86+
% MATLAB with Java: use IOUtils for efficient copy
87+
gzip = java.util.zip.GZIPInputStream(java.io.ByteArrayInputStream(input));
88+
buffer = java.io.ByteArrayOutputStream();
89+
org.apache.commons.io.IOUtils.copy(gzip, buffer);
90+
gzip.close();
91+
varargout{1} = typecast(buffer.toByteArray(), 'uint8')';
92+
end
93+
94+
if (nargin > 1 && isstruct(varargin{2}) && isfield(varargin{2}, 'type'))
95+
inputinfo = varargin{2};
96+
varargout{1} = typecast(varargout{1}, inputinfo.type);
97+
varargout{1} = reshape(varargout{1}, inputinfo.size);
7398
end

gzipencode.m

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,11 @@
4040
if ((exist('zmat', 'file') == 2 || exist('zmat', 'file') == 3) && (isempty(nozmat) || nozmat == 0))
4141
[varargout{1:nargout}] = zmat(varargin{1}, 1, 'gzip');
4242
return
43-
elseif (isoctavemesh)
44-
[varargout{1:nargout}] = octavezmat(varargin{1}, 1, 'gzip');
45-
return
4643
end
4744

48-
error(javachk('jvm'));
49-
5045
input = varargin{1}(:)';
46+
inputinfo = struct('type', class(varargin{1}), 'size', size(varargin{1}), 'method', 'gzip', 'status', 0);
47+
5148
if (ischar(input))
5249
input = uint8(input);
5350
elseif (isa(input, 'string'))
@@ -56,15 +53,30 @@
5653
input = typecast(input, 'uint8');
5754
end
5855

59-
input = typecast(input, 'uint8');
60-
61-
buffer = java.io.ByteArrayOutputStream();
62-
gzip = java.util.zip.GZIPOutputStream(buffer);
63-
gzip.write(input, 0, numel(input));
64-
gzip.close();
56+
if (~usejava('jvm'))
57+
[varargout{1:nargout}] = octavezmat(varargin{1}, 1, 'gzip');
58+
return
59+
end
6560

66-
varargout{1} = typecast(buffer.toByteArray(), 'uint8')';
61+
if (isoctavemesh)
62+
% Octave with Java: write bytes one at a time
63+
baos = javaObject('java.io.ByteArrayOutputStream');
64+
gzos = javaObject('java.util.zip.GZIPOutputStream', baos);
65+
for i = 1:numel(input)
66+
gzos.write(int32(input(i)));
67+
end
68+
gzos.finish();
69+
gzos.close();
70+
varargout{1} = typecast(baos.toByteArray(), 'uint8')';
71+
else
72+
% MATLAB with Java: direct array write
73+
buffer = java.io.ByteArrayOutputStream();
74+
gzip = java.util.zip.GZIPOutputStream(buffer);
75+
gzip.write(input, 0, numel(input));
76+
gzip.close();
77+
varargout{1} = typecast(buffer.toByteArray(), 'uint8')';
78+
end
6779

6880
if (nargout > 1)
69-
varargout{2} = struct('type', class(varargin{1}), 'size', size(varargin{1}), 'method', 'gzip', 'status', 0);
81+
varargout{2} = inputinfo;
7082
end

0 commit comments

Comments
 (0)