Java 使用write()方法,文件变得太大
我试图写入一个文件,从套接字接收的数据,我将数据存储在一个数组中,但当我写入它们时,文件变得太大。。。 我认为这是由于使用了大数组造成的,因为我不知道数据流的长度 但是,检查方法write时,说明write(byte[]b)将指定字节数组中的b.length字节写入此文件输出流, write()方法读取数组的长度,但长度为2000。。。 我如何知道将要写入的数据的长度Java 使用write()方法,文件变得太大,java,android,arrays,fileoutputstream,Java,Android,Arrays,Fileoutputstream,我试图写入一个文件,从套接字接收的数据,我将数据存储在一个数组中,但当我写入它们时,文件变得太大。。。 我认为这是由于使用了大数组造成的,因为我不知道数据流的长度 但是,检查方法write时,说明write(byte[]b)将指定字节数组中的b.length字节写入此文件输出流, write()方法读取数组的长度,但长度为2000。。。 我如何知道将要写入的数据的长度 ... byte[] Rbuffer = new byte[2000]; dis = new DataInputStream(s
...
byte[] Rbuffer = new byte[2000];
dis = new DataInputStream(socket.getInputStream());
dis.read(Rbuffer);
writeSDCard.writeToSDFile(Rbuffer);
...
void writeToSDFile(byte[] inputMsg){
File root = android.os.Environment.getExternalStorageDirectory();
File dir = new File (root.getAbsolutePath() + "/download");
if (!(dir.exists())) {
dir.mkdirs();
}
Log.d("WriteSDCard", "Start writing");
File file = new File(dir, "myData.txt");
try {
FileOutputStream f = new FileOutputStream(file, true);
f.write(inputMsg);
f.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
Log.i(TAG, "******* File not found. Did you" +
" add a WRITE_EXTERNAL_STORAGE permission to the manifest?");
} catch (IOException e) {
e.printStackTrace();
}
}
read()
返回读取的字节数,或-1。您忽略了这两种可能性,并假设它填满了缓冲区。您只需将结果存储在变量中,检查-1,然后将其传递给write()
方法
实际上,您应该将输入流传递给方法,并在创建文件后使用循环:
int count;
byte[] buffer = new byte[8192];
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
您在现已删除的注释中声明每个数据包都会创建一个新的输入流是不正确的。您可以在下载时写入整个文件,而不是一次读取整个文件,然后不管它是什么。从输入流中读取一个位,然后将其复制到输出流,一次512字节到8 KB。@peter lawrey我怎样才能只读取几位而不丢失流。。。当另一个流到来时(同时…),通过
read
方法读取文档。它有一个将要使用的返回值为了将它传递给write方法,我必须插入和偏移量(我认为它将是0),因为我希望所有的输入流都被插入到文件中。。。但是,在我收到了大量长度为负的消息之后,这意味着什么,(传输完成了吗?)是的。我确实提到了-1。您是否考虑过咨询Javadoc?刚刚意识到,文件对于存储来说不是太大,文件比它应该的大。给定文件的预期大小,可以尝试2048字节的缓冲区+1.