gpt4 book ai didi

java - 哪种方法更好,以便能够将包装类 read()/write() 方法与 android.content.res.Resources.openRawResource() 方法一起使用?

转载 作者:行者123 更新时间:2023-12-02 05:31:07 29 4
gpt4 key购买 nike

//Reading a image file from @drawable res folder and writing to a file on external sd card
//below one works no doubt but I want to imrpove it:
OutputStream os = new FileOutputStream(file); //File file.........
InputStream is =getResources().openRawResource(R.drawable.an_image);
byte[] b = new byte[is.available()];
is.read(b);
os.write(b);
is.close();
os.close();

在上面的代码中,我使用基本的 io 类来读取和写入。 我的问题是我该怎么做才能使用包装类,例如 DataInputStream/BufferedReaderd 或 PrintStream/BufferedWriter/PrintWriter。

当 openRawResources(int id ) 返回 InputStream 时;

要从 res 读取文件,我需要像这样进行类型转换:

DataInputStream is = (DataInputStream) getResources().openRawResource(R.drawble.an_image));

或者我可以像这样直接链接流:

DataInputStream is = new DataInputStream(getResources().openRawResource(R.drawable.greenball));

然后我可以这样做将其写入 SD 卡上的文件:

PrintStream ps =new PrintStream (new FileOutputStream(file));

while(s=is.readLine()!=null){
ps.print(s);
}

那么这是正确的方法吗?哪一个更好?有更好的方法吗?更好的实践..惯例?谢谢!!!

最佳答案

如果 openRawResource() 被记录为返回 InputStream,那么您不能依赖该结果是任何更具体类型的 InputStream,特别是,您不能依赖它作为 DataInputStream。选角并不能改变这一点;它只是让您有机会体验有趣和令人兴奋的异常(exception)。如果您想要一个 DataInputStream 包装 openRawResource() 的结果,那么您必须通过 DataInputStream 构造函数获取它。对于任何其他包装器流也类似。

但是,请注意 DataInputStream 可能不是您想要的类。它适合读回最初通过 DataOutputStream 写入的数据,但它是不合适的(或者至少没有提供比任何其他 InputStream 更好的优势) >) 用于读取一般数据。

此外,您对 InputStream.available() 的使用不正确。该方法返回当前可以在不阻塞的情况下从流中读取的字节数,它与可以从流中读取的总字节数只有微弱的关系。在耗尽之前进行流式传输(如果确实如此)。

此外,您的代码也不稳定,它假设 InputStream.read(byte[]) 将读取足够的字节来填充数组。它可能会,因为报告有许多字节可用,但这并不能保证。要将一个流复制到另一个流,您应该使用以下代码:

private final static int BUFFER_SIZE = 2048;

void copyStream(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[BUFFER_SIZE];
int nread;

while ( (nread = in.read(buffer) != 0 ) do {
out.write(buffer, 0, nread);
}
}

关于java - 哪种方法更好,以便能够将包装类 read()/write() 方法与 android.content.res.Resources.openRawResource() 方法一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532972/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com