我正在读取文件并编写相同的文件,但问题是下载的文件比输入的原始文件大2kb。
一些代码
@Override
public void run() {
try {
BufferedInputStream bis;
ArrayList<byte[]> al =new ArrayList<byte[]>();
File file = new File(Environment.getExternalStorageDirectory(), "test.mp3");
byte[] bytes = new byte[2048];
bis = new BufferedInputStream(new FileInputStream(file));
OutputStream os = socket.getOutputStream();
int read ;
int fileSize = (int) file.length();
int readlen=1024;
while (fileSize>0) {
if(fileSize<1024){
readlen=fileSize;
System.out.println("Hello.........");
}
bytes=new byte[readlen];
read = bis.read(bytes, 0, readlen);
fileSize-=read;
al.add(bytes);
}
ObjectOutputStream out1 = new ObjectOutputStream(new FileOutputStream(Environment.getExternalStorageDirectory()+"/newfile.mp3"));
for(int ii=1;ii<al.size();ii++){
out1.write(al.get(ii));
// out1.flush();
}
out1.close();
File file1 = new File(Environment.getExternalStorageDirectory(), "newfile.mp3");
答案 0 :(得分:0)
请勿使用ObjectOutputStream
。只需使用FileOutputStream
或围绕它的BufferedOutputStream
。
在Java中复制流的正确方法如下:
byte[] buffer = new byte[8192]; // or more, or even less, anything > 0
int count;
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
out.close();
请注意,您不需要输入大小的缓冲区,并且在写入任何输出之前无需读取整个输入。
希望每次发布此内容都有1美元。
答案 1 :(得分:-1)
我认为你应该使用ByteArrayOutputStream而不是ObjectOutputStream。 我相信这不是原始代码,而是代码的各个部分,放在不同的程序中,否则就没有意义了。 例如,如果要从文件中流式传输某些数据,请处理此数据,然后将数据写入另一个文件。
BufferedInputStream bis = null;
ByteArrayOutputStream al = new ByteArrayOutputStream();
FileOutputStream out1 = null;
byte[] bytes;
try {
File file = new File("testfrom.mp3");
bis = new BufferedInputStream(new FileInputStream(file));
int fileSize = (int) file.length();
int readLen = 1024;
bytes = new byte[readLen];
while (fileSize > 0) {
if (fileSize < readLen) {
readLen = fileSize;
}
bis.read(bytes, 0, readLen);
al.write(bytes, 0, readLen);
fileSize -= readLen;
}
bis.close();
} catch (IOException e){
e.printStackTrace();
}
//proceed the data from al here
//...
//finish to proceed
try {
out1 = new FileOutputStream("testto.mp3");
al.writeTo(out1);
out1.close();
} catch (IOException e){
e.printStackTrace();
}
不要忘记在需要的地方使用try-catch
指令
http://codeinventions.blogspot.ru/2014/08/creating-file-from-bytearrayoutputstrea.html