目前我有这个实现从字节流读取并写入文件。我想知道这是否特别危险或气馁,在时间的本质上,我无法测试这种机制的所有不同实现,这似乎是有效的。任何建议都将不胜感激。
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();
我知道它看起来很傻但是有效。
再次感谢任何输入
答案 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)
我看到一些问题,我会按重要性列出它们。
您正在将整个字节流读入bites
,然后将bites
写入另一个流(可能是磁盘)。这很糟糕,因为您消耗的内存需要两倍中间结构。执行此操作也需要更多CPU,因此速度较慢。
你没有关闭你的作家。使用后请务必关闭所有溪流。
Use the overload for read accepting a byte array而不是一次读取一个字节。一次读取一个字节相对较慢。在处理大量数据时,它是显而易见的。
以下是我建议的更改代码:
编辑:正如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();
此解决方案适用于任何大小的数据,并且比以前的代码快得多。