InputStream.read(byte)方法如何工作?

时间:2013-07-20 12:43:32

标签: java

我对InputStream类的一个方法有疑问,因为在我看来它不会起作用。

我们有这样的事情:

InputStream is;
byte[] b = new byte[64];

is.read(b);
// and now the byte array b contains data comming through InputStream???

我会理解.read()方法的用法是否类似:

b = is.read();

因为read方法将返回字节数组。

但是真正的方法如何能够为其论点写出一些内容并使其在自身之外可见?

就像我会这样:

String myString = "myText";

public void myMethod(String s) {
  s = "abc123";
}

myMethod(myString);
// and now is the content of myString equal to "abc123" instead of "myText" ???
// ANSWER: no!

感谢您的回复。

5 个答案:

答案 0 :(得分:2)

除了基元类型之外的所有东西都是java中的对象(包括数组)。 对象通过引用副本从一个方法传递到另一个方法。因此,如果被调用的方法对传递给它的对象进行更改,则方法最终会对传递给它的同一对象进行更改。因此,更改也会反映到调用方法中。

您需要了解对象以及它们如何在方法调用之间传递以详细了解它。有关更好的理解,请参阅this link

答案 1 :(得分:2)

  

因为read方法将返回字节数组。

嗯?你在哪里读到的? InputStream's .read() method returns an integer

  

真正的方法怎样才能将某些内容写入其参数并使其在自身之外可见?

Because you pass in a reference to an array where the .read(byte[]) will write。并且此方法的返回值是实际写入作为参数传递的字节数组的字节数。

此代码有效:

public void writeOneToFirstElement(final int[] array)
{
    array[0] = 1;
}

final int[] foo = { 0 };
writeOneToFirstElement(foo);
System.out.println(foo[0]); // prints 1

答案 2 :(得分:0)

数组只是对象的引用,并且导致数据所在的地址在修改时不会改变它可以这样工作 在这里解释: http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html
编辑:错字

答案 3 :(得分:0)

byte array以及String都是reference types ..当您将它们作为参数传递时,会复制引用并且它们都引用同一个对象..


例如,remote就像是对TV的引用。当您将遥控器传递给其他人时,他仍然可以访问TV

答案 4 :(得分:0)

对象通过引用副本从一个方法传递到另一个方法。因此,如果被调用的方法对传递给它的对象进行了更改,则方法最终会对传递给它的同一对象进行更改。因此,更改也会反映到调用方法中。例如,使用String替换参数中的String[]并检查输出。

public static void main(String[] args) 
{
 String[] myString =  {"myText"};
 myMethod(myString);
 System.out.println(myString[0]);
}

public void myMethod(String[] s) {
  s[0] = "abc123";
}