1

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

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();

我知道这看起来很傻,但它确实有效。

再次感谢您的任何意见

4

3 回答 3

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();

这是我的代码,完美运行

于 2013-08-09T15:20:14.910 回答
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 是一种更好的实现,它既更高效,也可能具有更小的内存占用。

于 2013-08-09T15:24:58.600 回答
1

我看到了一些问题,我将按重要性顺序列出它们。

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

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

  3. 使用重载进行读取,接受一个字节数组,而不是一次读取一个字节。一次读取一个字节相对较慢。在处理大量数据时,它很明显。

这是您的代码以及我建议的更改:

编辑:正如cs所指出的,您正在写入一个文件,并且根本不需要将您的字节转换为字符串,因为它们只会在文件中再次作为字节结束。(我看错了,不确定您是否正在写入文件,因此没有包含此内容。)

使用文件输出流代替编写器。我还建议您不要将 a 添加\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();

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

于 2013-08-09T15:25:04.880 回答