문제

나는 입력 스트림 안드로이드 플랫폼에서. 이것이 Android 특정 문제인지 또는 내가 일반적으로 잘못하고 있는지 확실하지 않습니다.

안드로이드 특정 유일한 것은이 호출입니다.

InputStream is = getResources().openRawResource(R.raw.myfile);

이것은 반환합니다 입력 스트림 Android 자산의 파일 용. 어쨌든, 여기에 내가 문제를 해결하는 곳이 있습니다.

bytes[] buffer = new bytes[2];
is.read(buffer);

read ()가 실행되면 an ioexception. 이상한 점은 내가 두 개의 순차적 인 바이트 읽기 (또는 단일 바이트 읽기 수)를 수행하면 예외는 없다는 것입니다. 예를 들어, 이것은 작동합니다.

byte buffer;
buffer = (byte)buffer.read();
buffer = (byte)buffer.read();

두 개의 순차적 인 바이트를 읽는 이유는 무엇입니까? 그러나 한 번에 읽기 위해 한 번의 호출은 예외를 던지십니까? 그만큼 입력 스트림 괜찮아 보인다 ... is.available() 백만 바이트를 반환합니다 (필요한대로).

스택 트레이스는이 라인 직전 에이 선을 보여줍니다 InputStream.read():

java.io.IOException
at android.content.res.AssetManager.readAsset(Native Method)
at android.content.res.AssetManager.access$800(AssetManager.java:36)
at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542)

버퍼 크기를 단일 바이트로 변경하면 여전히 오류가 발생합니다. 바이트 배열로 읽을 때만 예외가 제기되는 것처럼 보입니다.

파일을 100,000 바이트 (파일은 : 원래 1,917,408 바이트)로 자르면 정상적으로 작동합니다. 특정 크기에 걸쳐 파일에 문제가 있습니까?

모든 도움이 감사합니다!
감사!

도움이 되었습니까?

해결책

(Android 개발자에 대한 내 게시물이 표시되지 않으므로 여기에 다시 게시 해 보겠습니다).

IIRC,이 문제는 APK 구축의 일부로 압축 된 파일에 액세스하려고합니다.

따라서 문제를 해결하기 위해 압축되지 않는 파일 확장자를 제공하십시오. 어떤 확장이 건너 뛸 것인지 목록을 잊어 버렸지 만 이미 압축 된 것으로 알려진 파일 유형 (예 : MP3, JPG)이 작동 할 수 있습니다.

다른 팁

파일 확장자를 변경합니다 .mp3 파일 압축을 피하기 위해서는 작동하지만 앱의 APK는 훨씬 더 큽니다 (내 경우 0.99MB 대신 2.3MB).

이 문제를 피할 수있는 다른 방법이 있습니까?

내 대답은 다음과 같습니다.자산 폴더에서 1m보다 큰 파일을로드합니다

GZIP로 파일을 직접 압축하여 gzipinputstream 클래스로 포장을 풀 수 있습니다.

http://developer.android.com/reference/java/util/zip/gzipinputstream.html

파일 추출을위한 특정 크기 제한이 있다는 점에서 귀하는 맞습니다. 더 큰 파일을 1MB 조각으로 분할하고, 어떤 파일이 어떤 조각으로 만들어 졌는지 알 수있는 방법이있어 앱이 실행될 때 다시 함께 스티칭합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top