java中,ImputStream类中的read(byte []b)方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中,ImputStream类中的read(byte []b)方法相关的知识,希望对你有一定的参考价值。

我不是很明白这个方法,解释是这样的“读取输入流中的字节数部分,并将其存储在缓冲区数组b”。但我还是不怎么明白这个方法。方法不是对象调用它,然后传入参数,返回数据吗?这里传入是的是一个byte[]数组,返回类型是int类型。但是为什么能把方法外定义的byte[]数组的内容改变了?我很疑惑的地方就是这里,一直想不通诶。请前辈们指点迷津一下,不胜感激!!!

read(byte[] b) :  
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于 b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到 b[b.length-1] 的元素。 

举例说明一下:

/** 

 * User: liuwentao 

 * Time: 12-1-25 上午10:11 

 */  

public class InputStreamTest2   

    public static void main(String[] args)  

        String path = "D:\\\\project\\\\opensouce\\\\opensouce_demo\\\\base_java\\\\src\\\\demo\\\\java\\\\inputstream\\\\";  

        File file = new File(path + "xuzhimo.txt");  

        InputStream inputStream = null;  

        int i=0;  

        try   

            inputStream = new FileInputStream(file);  

            byte[] bytes = new byte[16];  

            while ((i = inputStream.read(bytes))!=-1)  

                String str = new String(bytes);  

                System.out.print(str);  

              

        catch (FileNotFoundException e)   

            e.printStackTrace();  

         catch (IOException e)   

            e.printStackTrace();  

          

      

 

运行结果:

参考技术A

以下为read(byte buffer)方法的源代码:


此read(byte[] buffer) 方法调用下面的read(byte[] buffer, int offset, int length)方法

 public int read(byte[] buffer) throws IOException 
        return read(buffer, 0, buffer.length);
    

 public int read(byte[] buffer, int offset, int length) throws IOException 
        Arrays.checkOffsetAndCount(buffer.length, offset, length);
        //length的长度为buffer.length,也就是字节数组的长度
        for (int i = 0; i < length; i++) 
            int c;
            //c==-1说明读到结尾了 方法return
            try 
                if ((c = read()) == -1) 
                    return i == 0 ? -1 : i;
                
             catch (IOException e) 
                if (i != 0) 
                    return i;
                
                throw e;
            
            //不等于-1 就把这个c赋值给这个字节数组的的一个对应的索引,然后强制转换成char类型
            //c是一个字符对应的assic码值
            buffer[offset + i] = (byte) c;
        
        return length;
    

参考技术B 这个是JAVA api里面的内部实现呀,就是他读文件的时候,先把文件流放到你传入的byte数组里面,byte数组是引用类型,他在往里面放东西,byte数组内容当然就改变了,至于返回什么类型,那就是方法随便定义的呀,他返回一个int类型起始就是告诉你文件有没有读取完毕啦,你再仔细看看API说明本回答被提问者和网友采纳 参考技术C 其实,这个byte[]数组相当于工地上的搬运车,把一堆砖块从一个地方转移到另一个地方,用到这个车一次一次的搬运;每次给车装满才能往另一个地方搬运,如果车装满了,返回值为-1; 参考技术D 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
希望能解决您的问题。

C++ 中温度类的类中的读取方法

【中文标题】C++ 中温度类的类中的读取方法【英文标题】:Read method in classes for Temperature Class in c++ 【发布时间】:2014-04-13 19:19:50 【问题描述】:

我正在尝试使用读取方法来读取温度值和华氏度或摄氏度的字符。我在我的编程书中找不到关于 read 方法的任何内容。我还必须在我的主程序中更改我的 for 循环以循环一系列值,但这也不起作用。这是我的代码:

#include <iostream>
using namespace std;

// Interface for Temperature class
class Temperature

public:
   Temperature();
   Temperature(const Temperature & Temp);
   ~Temperature();
   double getCelsius() const;
   double getFahrenheit() const;
   void setCelsius(double Temp);
   void setFahrenheit(double Temp);
   void print();
   void read();

private:
   static const double ABSOLUTE_ZERO = -273.15;
   double CelsiusTemperature;
;

// Implementation of Temperature class
void Temperature::print()

      cout << getFahrenheit() << "F = " << getCelsius() << "C\n";

void Temperature::read()

   double num;
   char C;

   cin >> num >> C;
   cin >> num >> C;
   if (C != 'F' || C != 'f' || C != 'C' || C != 'c')
     cout << " ";
 
Temperature::Temperature()

   CelsiusTemperature = 0;

Temperature::Temperature(const Temperature & Temp)

   CelsiusTemperature = Temp.CelsiusTemperature;


Temperature::~Temperature()

   

double Temperature::getCelsius() const

   return CelsiusTemperature;


double Temperature::getFahrenheit() const

   return 9.0 * CelsiusTemperature / 5.0 + 32.0;


void Temperature::setCelsius(double Temp)

   CelsiusTemperature = Temp;
   if (CelsiusTemperature < ABSOLUTE_ZERO)
      CelsiusTemperature = ABSOLUTE_ZERO;


void Temperature::setFahrenheit(double Temp)

   CelsiusTemperature = (Temp - 32.0) * 5.0 / 9.0 ;
   if (CelsiusTemperature < ABSOLUTE_ZERO)
      CelsiusTemperature = ABSOLUTE_ZERO;


// Program to test Temperature class
int main()

   Temperature Start;
   Temperature End;
   Temperature Temp;
   cout << "Enter start temperature: ";
   Temp.read();
   cout << "Enter end temperature: ";
   Temp.read();

   cout.precision(3);
   for (F = Start; F <= End; F++)
   
      Temperature Temp;
      Temp.setFahrenheit(F);
      Temp.print();
   
   return 0;

【问题讨论】:

【参考方案1】:

有几点:

你没有初始化StartEnd 您的read 函数未设置CelsiusTemperature 你没有声明变量F 您使用相同的 Temp 变量来读取开始和结束温度 您没有为Temperature 类定义任何特定的比较运算符,也没有任何转换运算符将其转换为整数/浮点值,您也没有采用非@ 值的非显式构造函数987654328@

【讨论】:

我应该如何初始化 Start 和 End?

以上是关于java中,ImputStream类中的read(byte []b)方法的主要内容,如果未能解决你的问题,请参考以下文章

Python 装饰器装饰类中的方法

在Java中,BufferedReader 是一个啥类啊,有啥作用啊

C++ 中温度类的类中的读取方法

java 输入输出流 一个类中只能使用一次吗? 流关闭后 就不能再打开吗?

java 输入输出流 一个类中只能使用一次吗? 流关闭后 就不能再打开吗?

如何在 python 中的 KMeans 聚类中获得 X 值?