JAVA中关于Fileinputstream类的read()方法的一个问题,我不太明白,请高手解答一下。
importjava.io.*;publicclassTestFileOutputStream{publicstaticvoidmain(String[]args){in...
import java.io.*;
public class TestFileOutputStream {
public static void main(String[] args) {
int b = 0;
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("d:/share/java/HelloWorld.java");
out = new FileOutputStream("d:/share/java/io/HW.java");
while((b=in.read())!=-1){ ////////// A
out.write(b); ////////// B
}
in.close();
out.close();
} catch (FileNotFoundException e2) {
System.out.println("找不到指定文件"); System.exit(-1);
} catch (IOException e1) {
System.out.println("文件复制错误"); System.exit(-1);
}
System.out.println("文件已复制");
}
}
关于A处的语句b=in.read(), API文档说read()方法“从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。”那么读取的这个字节存到哪里去了,是存放在int类型的b的空间里了吗?如果是的话,那为什么要把字节存放到一个int类型的空间里而不是byte类型的空间。
API文档说read()方法返回“下一个数据字节;如果已到达文件末尾,则返回 -1。”既然是返回一个字节,那为什么要用一个int类型的b去接收这个返回值?
关于B处的out.write(b);write()方法在API文档中是这样定义的:public void write(int b),参数b代表“要写入的字节”。既然参数是一个字节,那参数为什么又是一个int类型的?
是不是read()方法把读到的字节转换为了int类型存放到变量b中,然后write()方法又把这个int类型的变量转换为字节然后输出。我的理解对吗?如果对,那为什么JAVA要用int类型存放read()读出的字节,为什么不用byte?byte占8位,int占32位,这样换来换去,不会发生数据的变化吗?
初学JAVA,有些问题可能太钻牛角尖了,但还是希望能有会的人解释一下,谢谢~~~ 展开
public class TestFileOutputStream {
public static void main(String[] args) {
int b = 0;
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("d:/share/java/HelloWorld.java");
out = new FileOutputStream("d:/share/java/io/HW.java");
while((b=in.read())!=-1){ ////////// A
out.write(b); ////////// B
}
in.close();
out.close();
} catch (FileNotFoundException e2) {
System.out.println("找不到指定文件"); System.exit(-1);
} catch (IOException e1) {
System.out.println("文件复制错误"); System.exit(-1);
}
System.out.println("文件已复制");
}
}
关于A处的语句b=in.read(), API文档说read()方法“从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。”那么读取的这个字节存到哪里去了,是存放在int类型的b的空间里了吗?如果是的话,那为什么要把字节存放到一个int类型的空间里而不是byte类型的空间。
API文档说read()方法返回“下一个数据字节;如果已到达文件末尾,则返回 -1。”既然是返回一个字节,那为什么要用一个int类型的b去接收这个返回值?
关于B处的out.write(b);write()方法在API文档中是这样定义的:public void write(int b),参数b代表“要写入的字节”。既然参数是一个字节,那参数为什么又是一个int类型的?
是不是read()方法把读到的字节转换为了int类型存放到变量b中,然后write()方法又把这个int类型的变量转换为字节然后输出。我的理解对吗?如果对,那为什么JAVA要用int类型存放read()读出的字节,为什么不用byte?byte占8位,int占32位,这样换来换去,不会发生数据的变化吗?
初学JAVA,有些问题可能太钻牛角尖了,但还是希望能有会的人解释一下,谢谢~~~ 展开
3个回答
展开全部
如果你仔细看API的话,那么你就能看见read是覆盖的InputStream里面的同名方法,而它的解释为:
ead
public abstract int read()
throws IOException
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
子类必须提供此方法的一个实现。
返回:
下一个数据字节;如果到达流的末尾,则返回 -1。
抛出:
IOException - 如果发生 I/O 错误。
可以看出,它的返回值为0-255,但是byte的范围呢?-128-127,也就是说前面所说的读取一个字节的内容并不是java中的byte。
也就是说你把一个字节的数据和java中的byte类型的数据混淆了。
而且在除非特殊情况是不建议使用byte数据类型的,容易引起数据的溢出。
ead
public abstract int read()
throws IOException
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
子类必须提供此方法的一个实现。
返回:
下一个数据字节;如果到达流的末尾,则返回 -1。
抛出:
IOException - 如果发生 I/O 错误。
可以看出,它的返回值为0-255,但是byte的范围呢?-128-127,也就是说前面所说的读取一个字节的内容并不是java中的byte。
也就是说你把一个字节的数据和java中的byte类型的数据混淆了。
而且在除非特殊情况是不建议使用byte数据类型的,容易引起数据的溢出。
展开全部
read()
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有字节可用,则返回 -1。
可见此数据字节并不等同于java中的byte(范围: -128-->127)
由于此方法是native我们也无法查看具体细节,以后看API仔细点就是了~~~
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有字节可用,则返回 -1。
可见此数据字节并不等同于java中的byte(范围: -128-->127)
由于此方法是native我们也无法查看具体细节,以后看API仔细点就是了~~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
java网站的解释:
Notice that read() returns an int value. If the input is a stream of bytes, why doesn't read() return a byte value? Using a int as a return type allows read() to use -1 to indicate that it has reached the end of the stream.
为什么读取的是byte而返回一个int?因为想使用-1来表示流的结尾。
你问的存放问题:
byte是一个字节,int是四个字节,在int b = strean.read()后,java会自动类型转换(按照隐式转换的原则,低级变量可以直接转换为高级变量,将byte的数据放入int的第一个字节)
Notice that read() returns an int value. If the input is a stream of bytes, why doesn't read() return a byte value? Using a int as a return type allows read() to use -1 to indicate that it has reached the end of the stream.
为什么读取的是byte而返回一个int?因为想使用-1来表示流的结尾。
你问的存放问题:
byte是一个字节,int是四个字节,在int b = strean.read()后,java会自动类型转换(按照隐式转换的原则,低级变量可以直接转换为高级变量,将byte的数据放入int的第一个字节)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询