2009-09-25 5 views
7

자바 기능을 사용할 수있는 자바 스크립트 파일 (.js)에 추가 기능을 쓸 수있는 소프트웨어가 있습니다. java 호출 이전에 자바 스크립트 파일에)바이너리 파일을 Java로 디스크에 복사하십시오.

웹 서버에서 이진 파일을 다운로드하여 하드 드라이브에 써야합니다. 다음 코드를 시도 :

baseencoder = new org.apache.commons.codec.binary.Base64(); 
url = new java.net.URL("https://server/file.tgz"); 

urlConnect = url.openConnection(); 
urlConnect.setDoInput(true); 
urlConnect.setDoOutput(true); 
urlConnect.setRequestProperty("authorization","Basic "+ java.lang.String(baseencoder.encodeBase64(java.lang.String(username + ":" + password).getBytes()))); 
urlConnect.setRequestProperty("content-type","application/x-www-form-urlencoded"); 

is = new java.io.DataInputStream(urlConnect.getInputStream()); 
fstream = new FileWriter("C:\\tmp\\test.tgz"); 
out = new BufferedWriter(fstream); 
while((data = is.read()) != -1){ 
    out.write(data); 
} 

out.close(); 
is.close(); 

결과 파일은 더 이상 유효한 gzip 아카이브가 아닙니다. 거대한 오류가 있었다면 미안하지만 나는 프로그래머가 아니며 자바를 너무 많이 모른다.

답변

33

FileWriter을 사용하지 마십시오. 데이터를 텍스트로 변환하려고합니다.

그냥 FileOutputStream을 사용하십시오.

byte[] buffer = new byte[8 * 1024]; 

InputStream input = urlConnect.getInputStream(); 
try { 
    OutputStream output = new FileOutputStream(filename); 
    try { 
    int bytesRead; 
    while ((bytesRead = input.read(buffer)) != -1) { 
     output.write(buffer, 0, bytesRead); 
    } 
    } finally { 
    output.close(); 
    } 
} finally { 
    input.close(); 
} 
+1

또한 while 루프에서 올바른 테스트 조건을 사용하려고합니다. while ((data = ** is ** read())! = null) {...}. –

+0

FileOutputStream을 사용하여 고마워요. 객체가 아니므로 자바 스크립트에서 바이트 버퍼를 사용할 수없는 것 같아서 (여전히 간단한 read() 만 사용합니다.) – radius

2

DataInputStream은 일반 데이터가 아닌 Java 프리미티브를 읽는 것을 의미합니다.

urlConnect.getInputStream();은 이미 InputStream을 반환하고 모든 InputStreams는 read()를 지원하므로 중복됩니다.

is = urlConnect.getInputStream(); 

P. 이것은 isbis이 동일한 변수라고 가정합니다. 그렇지 않으면 루프에서 잘못된 스트림을 읽게됩니다.

+0

bis는 오타였습니다. 고맙습니다. – radius

+0

Nice 정보! 이름 짓기가 DataInputStream이 제네릭 데이터 용으로 제안하지 않은 것에도 불구하고 그것을 배우는 것에 흥미가 있습니다 ..! – Gewure

9

나는이 질문에 이미 답을 알고 있지만 더 간단한 접근법은 을 OutputStream으로 완전히 복사 할 수있는 Apache Commons IO의 IOUtils.copy() 방법을 사용하는 것이다.

0

LimitInputStream 사운드는 입력 스트림을 버퍼링하여 효율성을 높이는 것처럼 정확하게 들립니다.

관련 문제