다음 코드는 Java 6 (및 이전 버전)에서 정상적으로 작동하지만 JRE 7 (Java 7)로 업데이트 한 후 작동을 멈췄습니다./octet-stream을 -1 [Ljava.langJava 7 URL 연결 실패
응용 프로그램 :
여기 ftp://ftp-private.ncbi.nlm.nih.gov/pubchem/.fetch/96/4133257873201306969.sdf.gz
내가 얻을 출력 :
의 URL은 FTP 파일입니다. StackTraceElement; @ 5419f97c
Area: API: Networking
Synopsis: Server Connection Shuts Down when Attempting to Read Data When http Response Code is -1
이 어떻게 자바 7이 코드 호환 않습니다
이public static void store(URL url, File targetFile){
try
{
System.out.println(url);
URLConnection uc = url.openConnection();
String contentType = uc.getContentType();
System.out.println(contentType);
int contentLength = uc.getContentLength();
System.out.println(contentLength);
Settings.setDownloadSize(contentLength);
if (contentType.startsWith("text/") || contentLength == -1) {
throw new IOException("This is not a binary file.");
}
InputStream raw = uc.getInputStream();
InputStream in = new BufferedInputStream(raw);
byte[] data = new byte[contentLength];
int bytesRead = 0;
StatusPanel.updateProgrssBar(bytesRead);
int offset = 0;
while (offset < contentLength) {
bytesRead = in.read(data, offset, data.length - offset);
if (bytesRead == -1) {
break;
}
offset += bytesRead;
StatusPanel.updateProgrssBar(offset);
}
in.close();
if (offset != contentLength) {
throw new IOException("Only read " + offset + " bytes; Expected " + contentLength + " bytes");
}
FileOutputStream out = new FileOutputStream(targetFile);
out.write(data);
out.flush();
out.close();
//StatusPanel.setStatus("File has been stored at " + targetFile.toString());
//System.out.println("file has been stored at " + targetFile.toString());
}
내용 길이가 -1 반환 14,그리고 여기 내 코드?
설명 : CR 6886436에 대한 버그 수정의 결과로 HTTP 프로토콜 처리기는 유효한 HTTP 상태 줄없이 응답을 보내는 서버에 대한 연결을 닫습니다. 이 문제가 발생하면 해당 연결에서 데이터를 읽으려고하면 IOException이 발생합니다.
예를 들어, 다음 코드는 문제가있다 :
public static void test() throws Exception {
.....
HttpURLConnection urlc = (HttpURLConnection)url.openConnection();
....
System.out.println ("Response code: " + urlc.getResponseCode());
/** Following line throws java.io.IOException: Invalid Http response
* when Response Code returned was -1
*/
InputStream is = urlc.getInputStream(); // PROBLEMATIC CODE
는이 문제를 해결하려면 getResponseCode 메서드에서 반환 값을 확인하고 적절하게 -1 값을 처리하기 위해; 새 연결을 열거 나 스트림에서 getErrorStream을 호출합니다. 비 호환성의 성질 : behavioral RFE : 7055058
getContentLength()
방법은 분명히 문제입니다.
JRE6에서는이 메서드가 값을 반환하지만 JRE7에서는 -1이 반환됩니다.
서버가 반환하는 콘텐츠 길이를 확인할 가치가 있습니다. 예 : Wireshark로 네트워크를 스니핑합니다. 또한 같은 코드가 여전히 Java 6에서 작동하는지 확인 하시겠습니까? 즉 Java 7로 변경하고 작업을 중단 한 것이 우연이라는 가능성을 제거 했습니까? – DNA
자바 6에서 작동합니다. 일치하지 않습니다. 나는 그것에 대해 100 % 확실하다. 추가 된 내용을보십시오.이 경우 url은 ftp입니다. HTTP가 아닙니다 .. – lochi