Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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 Don';我不太明白InputStream.read(字节[],int,int)是如何工作的_Java_Android_Inputstream - Fatal编程技术网

Java Don';我不太明白InputStream.read(字节[],int,int)是如何工作的

Java Don';我不太明白InputStream.read(字节[],int,int)是如何工作的,java,android,inputstream,Java,Android,Inputstream,我知道这很琐碎,但对我来说毫无意义。Java不能将指针/引用作为参数传递,但是read()函数被传递到一个缓冲区,数据被读入该缓冲区,并且只返回一个int,即读入缓冲区的总字节数 我希望从这个设备读取五个单独的字节,但是当我给函数传递一个缓冲区,然后尝试访问它时,它仍然是null。如果我打印出函数的返回值,它会给出预期的int 5。但是我如何访问实际放入缓冲区的数据呢 这里是一个链接到 编辑: 这是对read函数的原始调用 public boolean onOptionsItemSelected

我知道这很琐碎,但对我来说毫无意义。Java不能将指针/引用作为参数传递,但是read()函数被传递到一个
缓冲区,数据被读入该缓冲区,并且只返回一个int,即
读入缓冲区的总字节数

我希望从这个设备读取五个单独的字节,但是当我给函数传递一个缓冲区,然后尝试访问它时,它仍然是
null
。如果我打印出函数的返回值,它会给出预期的
int 5
。但是我如何访问实际放入缓冲区的数据呢

这里是一个链接到

编辑:

这是对read函数的原始调用

public boolean onOptionsItemSelected( MenuItem item ) {
    switch( item.getItemId() ) {
    case R.id.connect:
        startActivityForResult( new Intent( this, DeviceList.class ), 1 );
        return true;
    case R.id.readTest:
        Log.i(TAG,  "Before write." );
        byte[] b = {'$'};
        for( int i = 0 ; i < 3 ; i++ ) {
            mService.write( b );
        }
        Log.i(TAG, "After write." );
        return true;

    case R.id.readData:
        byte[] c = mService.read( 5 );

        Toast.makeText(this, Integer.toString( mService.bytes ), Toast.LENGTH_LONG).show();
    default:
        return super.onContextItemSelected( item );
    }
}
这里是ConnectedThread类,它调用read本身

/**
 * This thread runs during a connection with a remote device.
 * It handles all incoming and outgoing transmissions.
 */
private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket, String socketType) {
        Log.d(TAG, "create ConnectedThread: " + socketType);
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        // Get the BluetoothSocket input and output streams
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) {
            Log.e(TAG, "temp sockets not created", e);
        }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run(int length) {
        Log.i(TAG, "BEGIN mConnectedThread");
        byte[] buffer = new byte[1024];


        // Keep listening to the InputStream while connected
        //while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer, 0, length);

                // Send the obtained bytes to the UI Activity
                mHandler.obtainMessage(MainMenu.MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                // Start the service over to restart listening mode
                BluetoothService.this.start();
                //break;
            }
       // }
            Log.i(TAG, "MADE IT HERE" );
    }

    /**
     * Write to the connected OutStream.
     * @param buffer  The bytes to write
     */
    public void write(byte[] buffer) {
        try {
            mmOutStream.write(buffer);

            // Share the sent message back to the UI Activity
            mHandler.obtainMessage(MainMenu.MESSAGE_WRITE, -1, -1, buffer)
                    .sendToTarget();
        } catch (IOException e) {
            Log.e(TAG, "Exception during write", e);
        }
    }

    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) {
            Log.e(TAG, "close() of connect socket failed", e);
        }
    }
}

您必须初始化数组,否则它将继续保持为null。

您必须初始化数组,否则它将继续保持为null。

也许您的C背景使您在适当地调用read()时感到困惑。read(byte[])和read(byte[]b,int offset,int len)不是返回数组或使用指向指针的指针创建数组,而是在参数列表中使用实际的字节数组(后一种形式,大小大于或等于offset+len)。假设从该方法返回值x,那么从offsetoffset+x-1的数组元素将在数组中定义(除非返回了-1,这表示EOF)。

也许您的C背景使您在适当地调用read()时感到困惑。read(byte[])和read(byte[]b,int offset,int len)不是返回数组或使用指向指针的指针创建数组,而是在参数列表中使用实际的字节数组(后一种形式,大小大于或等于offset+len)。假设从方法返回值x,则将在数组中定义从offsetoffset+x-1的数组元素(除非返回了-1,表示EOF)

Java不能将指针/引用作为参数传递

是的,它可以

像这样一个基本的误解会让你非常困惑

read(…)
的使用方式如下:

byte[] buffer = new byte[42];
int nosRead = is.read(buffer, 0, buffer.length);
分配缓冲区对象并将其作为参数传递给
read
方法。字节从(在本例中)偏移量0开始读取并复制到缓冲区中。当方法调用返回时,它返回实际读取的字节数。。。并且字节在缓冲区中,可供调用方处理

如您所见,这依赖于将字节数组引用作为参数传递给
read
方法

Java不能将指针/引用作为参数传递

是的,它可以

像这样一个基本的误解会让你非常困惑

read(…)
的使用方式如下:

byte[] buffer = new byte[42];
int nosRead = is.read(buffer, 0, buffer.length);
分配缓冲区对象并将其作为参数传递给
read
方法。字节从(在本例中)偏移量0开始读取并复制到缓冲区中。当方法调用返回时,它返回实际读取的字节数。。。并且字节在缓冲区中,可供调用方处理



如您所见,这依赖于将字节数组引用作为参数传递给
read
方法。

您能否提供一些代码来说明问题?您必须初始化数组。你不能一开始就让它为空。啊,谢谢你,也许是这样。艺术家,请发表一个答案,我会接受的。我真蠢,不过谢谢你。是的,它发生了:)你能提供一些代码来演示这个问题吗?你必须初始化数组。你不能一开始就让它为空。啊,谢谢你,也许是这样。艺术家,请发表一个答案,我会接受的。我真蠢,不过谢谢你。是的,它确实发生了:)实际上这是Java的一部分,它非常紧密地反映了底层的C API。C stdlib避免为您分配/释放内存。(IIRC有一些系统调用违反了这个约定。)实际上,这是Java的一部分,非常接近地反映了底层的C API。C stdlib避免为您分配/释放内存。(IIRC有一些系统调用违反此约定。)read如何确定下次必须从上次读取的字节+1开始读取?下面是代码
public int read(byte[]buffer)抛出IOException{return read(buffer,0,buffer.length);}
作为偏移量传递0,因此我无法理解它将如何确定下一步从何处开始?您误解了
read(…)
的作用。它正在读取字节>>我知道
read
正在将字节放入数组中。从
public int read(byte[]buffer,int byteOffset,int byteCount)的实现中引用行
buffer[byteOffset+i]=(byte)c;这就是我们通常读取流
的方式,而((count=is.read(data))!=-1{total+=count;fos.write(data,0,count);}
在每次迭代中,它读取流并将字节放入字节[],在下一次迭代中,它也这样做。1/2我不明白的是,
如何读取
知道它已经读取了一些字节,现在必须从下一个未读取的字节开始。假设它在第一次迭代中读取10字节,在下一次迭代中,它必须从11字节开始。它在代码中的什么位置被确定。2/2在后台,输入流跟踪它缓冲的未读字节。请记住,
InputStream
实际上是一个抽象类。对于(比如)从文件或标准输入读取的输入流,实际的读取方法正在做其他事情。例如,如果您查看GrepCode中的代码,您可以