Nice programing

InputStream의 크기 결정

nicepro 2020. 12. 4. 20:38
반응형

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같은 객체 입니다.FileItemFactoryServletFileUpload


추가하고 싶었습니다. 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에서 바이트 가져 오기


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

반응형