You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
Matlab using Java openStream(url) get :Java exception occurred: java.lang.NullPointerException
5 views (last 30 days)
Show older comments
buer
on 20 Nov 2014
Hi,
I want to download one file from a URL. According to this: http://www.mathworks.com/matlabcentral/newsreader/view_thread/294528. all works fine until i go to the line: is = jurl.openStream; This gave one error says Java exception occurred: java.lang.NullPointerException.
Anyone can help? thanks
12 Comments
Geoff Hayes
on 20 Nov 2014
buer - what happens on the previous line
jurl = java.net.URL(linki);
What is linki? Is it a valid URL? I ran the code with a couple of test URLs and was able to download each without any problems.
buer
on 21 Nov 2014
Hi, the only thing is my URL is few parts and the file name is not in the URL...so I have to define the name again myself...
Company='Abc';
Depar='Fin';
url1='com/';;
url2='/download_h5_Depar=';
url3='.h5' ;
url=strcat(url1,Company,url2,Depar,url3);
links=url;
% copy files to local folder
[pathstr, name, ext ] = fileparts(links);
% name changed here
name=strcat(Company,'-',Depar);
Here you can see....now I am suspect about the security of the website....it needs to be in exact network domain with username and passpord for login...so i am not sure if this matters....
Geoff Hayes
on 21 Nov 2014
Have you verified that the link that you build, linki, is valid? i.e. can you copy and paste it into your browser and view the file?
As for needing a username and password, that could be the problem...
Geoff Hayes
on 25 Nov 2014
An alternative to this code may be to use webread or urlread. The first function can be used if you have R2014b. Both seem to allow for username and passwords. See also http://www.mathworks.com/matlabcentral/answers/161160-urlread-vs-view-source-need-view-source-data which may be useful.
buer
on 25 Nov 2014
Thanks Geoff, unfortunately I have only R2013b.... any possible way to do it? I am ´sure I can ´not get R2014b,I am using school Matlab....Thanks...
Geoff Hayes
on 25 Nov 2014
You may be able to urlread...it should be a function that your version of MATLAB has.
buer
on 1 Dec 2014
Hi Geoff,
I tried with urlread....
url2=urlread(links, 'Authentication','basic','Username','Myname','Password','Myword');
It gives me such errors all the time:
Error using urlreadwrite (line 91)
The IP address of "HostName" could not be determined.
Error in urlread (line 36)
[s,status] =
urlreadwrite(mfilename,catchErrors,url,varargin{:});
Can you help me with this? Is it possible to add the authentication inside the code I post in the link? Thanks in advance...
buer
on 2 Dec 2014
Hi Groff.
Thanks a lot. It is valid link..I got it solved by learning this http://stackoverflow.com/questions/1317931/how-do-i-provide-a-username-password-to-access-a-web-resource-using-matlab-urlre
This is the answer...thanks a lot.
Geoff Hayes
on 2 Dec 2014
Buer - good that you figured it out. Could you summarize it as an answer below?
Accepted Answer
buer
on 17 Dec 2014
Yes. so the answer is Matlab urlread does not support authentication with lower level request. So we need to code firectly against the Java URL class to use them:
% Matlab's urlread() doesn't do HTTP Request params, so work directly with Java
jUrl = java.net.URL(url);
conn = jUrl.openConnection();
conn.setRequestProperty('Authorization', ['Basic ' base64encode([user ':' password])]);
conn.connect();
info.status = conn.getResponseCode();
info.errMsg = char(readstream(conn.getErrorStream()));
s = readstream(conn.getInputStream());
function out = base64encode(str)
% Uses Sun-specific class, but we know that is the JVM Matlab ships with
encoder = sun.misc.BASE64Encoder();
out = char(encoder.encode(java.lang.String(str).getBytes()));
function out = readstream(inStream)
%READSTREAM Read all bytes from stream to uint8
try
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier;
byteStream = java.io.ByteArrayOutputStream();
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier();
isc.copyStream(inStream, byteStream);
inStream.close();
byteStream.close();
out = typecast(byteStream.toByteArray', 'uint8'); %'
catch err
out = []; %HACK: quash
end
Hope it will help others later.
More Answers (0)
See Also
Categories
Find more on Call Java from MATLAB in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom(English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)