输入流不读取所有文件[关闭]

问题描述 投票:-2回答:2

我写的文件比原始文件小2048字节,是一个完美的副本。

byte [] buffer = new byte[2048];
int readBytes = inputstream.read(buffer, 0, 2048);

while(readBytes !=-1){  
    readBytes = inputstream.read(buffer, 0, 2048); 
    for(int i = 0;i<readBytes;i++){    
        int decimal = buffer[i];
        String binario = conversor.ConverterDecimalToBinario(decimal);
        int decimal1 = conversor.ConverterBinarioToDecimal(binario);
        outputstream.write(decimal1);//-----------------------------------------GRAVAÇÃO
    }//FIM DO FOR
}//FIM DO WHILE
java inputstream
2个回答
2
投票

在代码进入循环并放入缓冲区之前,最多可读取2048个字节。

在使用下一个(最多)2048字节的循环中覆盖缓冲区之前,不会以任何方式处理此(最多)2048。 (见代码中的标记)

本质上,第一个2048被跳过。

byte [] buffer = new byte[2048]; 
//reads   2048 bytes.
int readBytes = inputstream.read(buffer, 0, 2048);

while(readBytes !=-1){ 
    //reads   2048 bytes - overwrites buffer - furst chunk is skipped! 
    readBytes = inputstream.read(buffer, 0, 2048); 
    for(int i = 0;i<readBytes;i++){    
        int decimal = buffer[i];
        String binario = conversor.ConverterDecimalToBinario(decimal);
        int decimal1 = conversor.ConverterBinarioToDecimal(binario);
        outputstream.write(decimal1);//-----------------------------------------GRAVAÇÃO
    }//FIM DO FOR 
}//FIM DO WHILE

对于不会覆盖的东西 - 这里在循环结束时读取下一个块:

byte [] buffer = new byte[2048]; 
//reads   2048 bytes.
int readBytes = inputstream.read(buffer, 0, 2048);

while(readBytes !=-1){ 
    for(int i = 0;i<readBytes;i++){    
        int decimal = buffer[i];
        String binario = conversor.ConverterDecimalToBinario(decimal);
        int decimal1 = conversor.ConverterBinarioToDecimal(binario);
        outputstream.write(decimal1);//-----------------------------------------GRAVAÇÃO

    }//FIM DO FOR 
    readBytes = inputstream.read(buffer, 0, 2048);  
}//FIM DO WHILE

或者你可以做这样的事情(如果你喜欢这种分配和比较的组合,这是一个品味问题):

byte [] buffer = new byte[2048];
int readBytes;

while(-1 != ( readBytes = inputstream.read(buffer, 0, 2048))){ 
    for(int i = 0;i<readBytes;i++){    
        int decimal = buffer[i];
        String binario = conversor.ConverterDecimalToBinario(decimal);
        int decimal1 = conversor.ConverterBinarioToDecimal(binario);
        outputstream.write(decimal1);//-----------------------------------------GRAVAÇÃO
    }//FIM DO FOR 
}//FIM DO WHILE

0
投票
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileNotFoundException;
import java.util.*;
import java.nio.charset.StandardCharsets;
import java.io.File;

//===========================================================================================================================*/

class conversor {



   /**
    * Converte decimal em binário
    * */
   public static String ConverterDecimalToBinario(int numeroDecimal){
       String binario = "";
       String bin7 = "0000000";
       String bin6 = "000000";
       String bin5 = "00000";            //Completa números binários pequenos, para ficar com 8 bits
       String bin4 = "0000";
       String bin3 = "000";
       String bin2 = "00";
       String bin1 = "0";
       if (numeroDecimal==0){binario = "00000000";}   //Se entra 0 decimal sai 8 zeros(em binário)                                       // Converte decimal em binário
       while(numeroDecimal > 0) {
           binario = (numeroDecimal % 2) + binario;
           numeroDecimal /= 2;
       }
        int stringLength = binario.length();      //tamanho do número sem completar os zero dos 8 bits
        if(stringLength==1){binario = bin7+binario; } 
        if(stringLength==2){binario = bin6+binario; } //concatena os zeros que faltam
        if(stringLength==3){binario = bin5+binario; }         
        if(stringLength==4){binario = bin4+binario; }
        if(stringLength==5){binario = bin3+binario; }
        if(stringLength==6){binario = bin2+binario; }
        if(stringLength==7){binario = bin1+binario; }

return binario;

}

 //-------------------------------------------------
   /**
    * Converte binario em decimal
    * */
   public static int ConverterBinarioToDecimal(String numeroBinario){
       int sum = 0;
       int size = numeroBinario.length();                                        //converte binário em decimal
       char c;
       for(int i = 0; i < size; i++){
           c = numeroBinario.charAt(i);
           if (c == '0') continue;
           sum += Math.pow(2, (size-(i+1)));
       }
       return sum;

}}
//----------------------------------------------------FIM DO CONVERSOR---------------------------------------------------


        public class teste {

    public static void main(String[] args)throws java.io.IOException {


int contadorx = 0;
int terminou = 0;


                      InputStream inputstream;  OutputStream outputstream;
                     inputstream = new BufferedInputStream(new FileInputStream("C:\\Users\\klebe\\Desktop\\tatuagem.png"));
                     outputstream = new FileOutputStream("C:\\Users\\klebe\\Desktop\\deucerto.png");
 //--------------------------------------------TAMANHO DO ARQUIVO--------------------------------------------
                        File f = new File ("C:\\Users\\x\\Desktop\\tatuagem.png");
                        Long tamanhodoarquivo1 = f.length();
                        double tamanhodoarquivo = (double)tamanhodoarquivo1;

                         double conttamanhodoarquivo=0;
//-------------------------------------FIM TAMANHO DO ARQUIVO----------------------------------------
int x = 0;




                                byte [] buffer = new byte[2048];
                                int readBytes = inputstream.read(buffer, 0, 2048);

                                while(readBytes !=-1){  
                                  readBytes = inputstream.read(buffer, 0, 2048); 
                               for(int i = 0;i<readBytes;i++){    
                                int decimal = buffer[i];
                                String binario = conversor.ConverterDecimalToBinario(decimal);
                                int decimal1 = conversor.ConverterBinarioToDecimal(binario);
                             outputstream.write(decimal1);//-----------------------------------------GRAVAÇÃO
}//FIM DO FOR
}//FIM DO WHILE

                                   conttamanhodoarquivo=conttamanhodoarquivo+1;


















//-------------------------------------------------------------------------------------------------------------                    
                   // if (outputstream != null){
                   //  outputstream.close();
                   //  inputstream.close();
                   // }//FIM DO IF

    }//FIM DO PUBLIC STATIC VOID MAIN

}//FIM DA CLASS PRINCIPAL
© www.soinside.com 2019 - 2024. All rights reserved.