读取字节流并写入文件

时间:2013-08-09 15:16:17

标签: java inputstream

目前我有这个实现从字节流读取并写入文件。我想知道这是否特别危险或气馁,在时间的本质上,我无法测试这种机制的所有不同实现,这似乎是有效的。任何建议都将不胜感激。

SharedByteArrayInputStream stream = (SharedByteArrayInputStream) content;
ArrayList<Byte> bites = new ArrayList<Byte>();
byte bite = 0;
while((bite=(byte) stream.read())!=-1){
    bites.add(bite);
}
byte[] bytes = new byte[bites.size()];
for(int x = 0; x < bites.size(); x++){
    bytes[x] = (byte) bites.get(x);
}
String aloha = new String(bytes, Charset.forName( "ISO-8859-1" ));
writer.append(aloha+"\n");
stream.close();

我知道它看起来很傻但是有效。

再次感谢任何输入

3 个答案:

答案 0 :(得分:2)

File f = new File(//PATHFILE);
            FileOutputStream fOut = new FileOutputStream(f);
            InputStream is=//InputStream
            byte data[] = new byte[1024];
            int count;
            while ((count = is.read(data)) != -1) {
              fOut.write(data, 0, count);   
            }
            fOut.flush();
            fOut.close();
            is.close();

这是我的代码并完美运作

答案 1 :(得分:1)

我假设您只是创建临时ArrayList,因为您无法确定输入的长度。请尝试使用ByteArrayOutputStream。

请考虑以下代码:

SharedByteArrayInputStream stream = (SharedByteArrayInputStream) content;
ByteArrayOutputStream bOut = new ByteArrayOutputStream();

//Reading in chunks is better performance-wise than reading one byte at once.
int r;
byte[] buffer = new byte[32 * 1000];

//Read and write into the ByteArrayOutputStream
while((r = stream.read(buffer) != -1){
    bOut.write(buffer, 0, r);
}

String aloha = new String(bOut.toByteArray(), Charset.forName( "ISO-8859-1" ));
writer.append(aloha+"\n");
stream.close();

您的代码使用了比必要内存更多的内存,并且只需要一个循环就会迭代两个循环,从而使其效率非常低。 ByteArrayOutputStream是一个更好的实现,既更高效又可能具有更小的内存占用。

答案 2 :(得分:1)

我看到一些问题,我会按重要性列出它们。

  1. 您正在将整个字节流读入bites,然后将bites写入另一个流(可能是磁盘)。这很糟糕,因为您消耗的内存需要两倍中间结构。执行此操作也需要更多CPU,因此速度较慢。

  2. 你没有关闭你的作家。使用后请务必关闭所有溪流。

  3. Use the overload for read accepting a byte array而不是一次读取一个字节。一次读取一个字节相对较慢。在处理大量数据时,它是显而易见的。

  4. 以下是我建议的更改代码:

    编辑:正如c.s.所指出的,你正在写一个文件,并且根本不需要将你的字节转换为字符串,因为它们只会在文件中再次作为字节。 (我误读了,不确定你是在写文件,所以不包括这个。)

    使用文件输出流而不是编写器。我还建议您不要将\n附加到您的数据中作为不必要的内容。

    FileOutputStream fileOutputStream = new FileOutputStream(filepath);
    SharedByteArrayInputStream stream = (SharedByteArrayInputStream) content;
    byte bite = 0;
    byte[] buffer = new byte[1024];
    //here we're reading more than one byte at a time.
    while((bite=(byte) stream.read(buffer))!=-1){
       //write to file output stream instead.
       fileOutputStream.write(buffer,0,bite);
       //don't append new line character.
    }
    stream.close();
    //close the output stream if you're done.
    fileOutputStream.close();
    

    此解决方案适用于任何大小的数据,并且比以前的代码快得多。