Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用write()方法,文件变得太大_Java_Android_Arrays_Fileoutputstream - Fatal编程技术网

Java 使用write()方法,文件变得太大

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

我试图写入一个文件,从套接字接收的数据,我将数据存储在一个数组中,但当我写入它们时,文件变得太大。。。 我认为这是由于使用了大数组造成的,因为我不知道数据流的长度

但是,检查方法write时,说明write(byte[]b)将指定字节数组中的b.length字节写入此文件输出流, write()方法读取数组的长度,但长度为2000。。。 我如何知道将要写入的数据的长度

...
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.