InputStream의 크기 결정
내 현재 상황은 : 파일을 읽고 내용을 InputStream
. 나중에 나는 InputStream
(내가 아는 한)의 크기를 요구하는 바이트 배열에 의 내용을 배치해야 합니다 InputStream
. 어떤 아이디어?
요청에 따라 업로드 된 파일에서 생성중인 입력 스트림을 표시합니다.
InputStream uploadedStream = null;
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
java.util.List items = upload.parseRequest(request);
java.util.Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
uploadedStream = item.getInputStream();
//CHANGE uploadedStreambyte = item.get()
}
}
요청은 Apache Commons FileUpload 패키지 와 HttpServletRequest
같은 객체 입니다.FileItemFactory
ServletFileUpload
추가하고 싶었습니다. Apache Commons IO에는 복사를 수행하는 스트림 지원 유틸리티가 있습니다. (Btw, 입력 스트림에 파일을 배치한다는 것은 무엇을 의미합니까? 코드를 보여줄 수 있습니까?)
편집하다:
좋습니다. 항목의 내용으로 무엇을 하시겠습니까? 가 item.get()
반환하는 바이트 배열에 전체 일을.
편집 2
item.getSize()
업로드 된 파일 크기를 반환합니다 .
이것은 정말 오래된 스레드이지만 문제를 검색했을 때 여전히 가장 먼저 팝업되었습니다. 그래서 나는 이것을 추가하고 싶었습니다.
InputStream inputStream = conn.getInputStream();
int length = inputStream.available();
나를 위해 일했습니다. 그리고 여기의 다른 답변보다 훨씬 간단합니다.
ByteArrayOutputStream을 읽은 다음 toByteArray () 를 호출 하여 결과 바이트 배열을 가져옵니다. 크기를 미리 정의 할 필요는 없습니다 ( 알고 있다면 최적화 일 수 있지만 대부분의 경우에는 그렇지 않습니다).
읽기 없이는 스트림의 데이터 양을 확인할 수 없습니다. 그러나 파일 크기를 요청할 수 있습니다.
http://java.sun.com/javase/6/docs/api/java/io/File.html#length ()
이것이 가능하지 않은 경우 입력 스트림에서 읽은 바이트를 필요에 따라 증가 하는 ByteArrayOutputStream에 쓸 수 있습니다 .
Utils.java의 getBytes (inputStream)을 사용하여 InputStream의 크기를 얻을 수 있습니다. 다음 링크를 확인하십시오.
InputStream의 경우
org.apache.commons.io.IoUtils.toByteArray(inputStream).length
선택적 <MultipartFile>
Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()
ByteArrayInputStream
이 페이지의 일부 주석과 달리 명시 적으로 처리 할 때 .available()
함수를 사용 하여 크기를 가져올 수 있습니다. 당신이 그것을 읽기 시작하기 전에 그것을해야합니다.
JavaDocs에서 :
이 입력 스트림에서 읽거나 건너 뛸 수있는 남은 바이트 수를 반환합니다. 반환 된 값은 count-pos이며, 입력 버퍼에서 읽을 남은 바이트 수입니다.
https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#available ()
당신 InputStream
이 a FileInputStream
또는 a 라는 것을 알고 있다면 , 전체 내용을 읽지 않고ByteArrayInputStream
스트림 크기를 얻기 위해 약간의 반사를 사용할 수 있습니다 . 다음은 방법의 예입니다.
static long getInputLength(InputStream inputStream) {
try {
if (inputStream instanceof FilterInputStream) {
FilterInputStream filtered = (FilterInputStream)inputStream;
Field field = FilterInputStream.class.getDeclaredField("in");
field.setAccessible(true);
InputStream internal = (InputStream) field.get(filtered);
return getInputLength(internal);
} else if (inputStream instanceof ByteArrayInputStream) {
ByteArrayInputStream wrapper = (ByteArrayInputStream)inputStream;
Field field = ByteArrayInputStream.class.getDeclaredField("buf");
field.setAccessible(true);
byte[] buffer = (byte[])field.get(wrapper);
return buffer.length;
} else if (inputStream instanceof FileInputStream) {
FileInputStream fileStream = (FileInputStream)inputStream;
return fileStream.getChannel().size();
}
} catch (NoSuchFieldException | IllegalAccessException | IOException exception) {
// Ignore all errors and just return -1.
}
return -1;
}
이것은 추가 입력 스트림을 지원하도록 확장 될 수 있습니다.
이 메서드를 사용하면 InputStream을 전달하기 만하면됩니다.
public String readIt(InputStream is) {
if (is != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
is.close();
return sb.toString();
}
return "error: ";
}
try {
InputStream connInputStream = connection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
int size = connInputStream.available();
int available ()이 입력 스트림에 대한 메소드의 다음 호출에 의해 차단되지 않고이 입력 스트림에서 읽거나 건너 뛸 수있는 바이트 수의 추정치를 리턴합니다. 다음 호출은 동일한 스레드 또는 다른 스레드 일 수 있습니다. 이 많은 바이트의 단일 읽기 또는 건너 뛰기는 차단되지 않지만 더 적은 바이트를 읽거나 건너 뛸 수 있습니다.
InputStream-안드로이드 SDK | Android 개발자
참고URL : https://stackoverflow.com/questions/1119332/determine-the-size-of-an-inputstream
'Nice programing' 카테고리의 다른 글
C # 클래스 이름에는 어떤 문자가 허용됩니까? (0) | 2020.12.04 |
---|---|
Google Web Toolkit (GWT)의 여러 페이지 자습서 (0) | 2020.12.04 |
일반 열거 형을 int로 C # 비 박싱 변환? (0) | 2020.12.04 |
ASP.NET / PHP의 주류 Java 대안은 무엇입니까? (0) | 2020.12.04 |
IntelliJ IDEA-캐럿 동작 (0) | 2020.12.04 |