输出文件比输入(原始)文件大

时间:2017-02-27 08:28:55

标签: java android file-handling

我正在读取文件并编写相同的文件,但问题是下载的文件比输入的原始文件大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");

2 个答案:

答案 0 :(得分:0)

  1. 请勿使用ObjectOutputStream。只需使用FileOutputStream或围绕它的BufferedOutputStream

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