首页编程java编程java中为什么会有字节流,java中输入流去读取文件时为什么要创建一个缓存数组

java中为什么会有字节流,java中输入流去读取文件时为什么要创建一个缓存数组

编程之家2023-10-1284次浏览

很多朋友对于java中为什么会有字节流和java中输入流去读取文件时为什么要创建一个缓存数组不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

java中为什么会有字节流,java中输入流去读取文件时为什么要创建一个缓存数组

java的io中为什么有那么多种流啊

1.因为java要和各种其他的譬如电脑文档等交换信息,就有了输入输出流。

2.从最简单的输入输出流懂起,以后遇到什么解决什么。

3.两大类,字节流和字符流

java中为什么会有字节流,java中输入流去读取文件时为什么要创建一个缓存数组

字节流:BufferedInputStream,BufferedOutputStream,FileInputStream,FileOutputStream

字符流:BufferedReader,BufferedWriter,FileReader,FileWriter

4.在读写二进制数据时就会使用字节流。在设计用于处理字符输入输出时用的是Unicode,所以要用字符流,在某些情况下,字符流比字节流更高效。字节流和字符流的功能大部分是并行的。

java中为什么会有字节流,java中输入流去读取文件时为什么要创建一个缓存数组

1. Java I/O中字符流和字节流的区别

字节流与和字符流的使用非常相似,但实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。

下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。

1、使用字节流不关闭执行

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.OutputStream;

publicclassOutputStreamDemo05{

publicstaticvoidmain(String[]args)throwsException{//异常抛出,不处理

//第1步:使用File类找到一个文件

Filef=newFile("d:"+File.separator+"test.txt");//声明File对象

//第2步:通过子类实例化父类对象

OutputStreamout=null;

//准备好一个输出的对象

out=newFileOutputStream(f);

//通过对象多态性进行实例化

//第3步:进行写操作

Stringstr="HelloWorld!!!";

//准备一个字符串

byteb[]=str.getBytes();

//字符串转byte数组

out.write(b);

//将内容输出

//第4步:关闭输出流

//out.close();

//此时没有关闭

}

}

打开文件会发现,此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继续使用字符流完成,再观察效果。

2、使用字符流不关闭执行

packageorg.lxh.demo12.chariodemo;

importjava.io.File;

importjava.io.FileWriter;

importjava.io.Writer;

publicclassWriterDemo03{

publicstaticvoidmain(String[]args)throwsException{//异常抛出,不处理

//第1步:使用File类找到一个文件

Filef=newFile("d:"+File.separator+"test.txt");//声明File对象

//第2步:通过子类实例化父类对象

Writerout=null;

//准备好一个输出的对象

out=newFileWriter(f);

//通过对象多态性进行实例化

//第3步:进行写操作

Stringstr="HelloWorld!!!";

//准备一个字符串

out.write(str);

//将内容输出

//第4步:关闭输出流

//out.close();

//此时没有关闭

}

}

程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。

如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

importjava.io.File;

importjava.io.FileWriter;

importjava.io.Writer;

publicclassWriterDemo04{

publicstaticvoidmain(String[]args)throwsException{//异常抛出不处理

//第1步:使用File类找到一个文件

Filef=newFile("d:"+File.separator+"test.txt");//声明File

对象

//第2步:通过子类实例化父类对象

Writerout=null;

//准备好一个输出的对象

out=newFileWriter(f);

//通过对象多态性进行实例化

//第3步:进行写操作

Stringstr="HelloWorld!!!";

//准备一个字符串

out.write(str);

//将内容输出

out.flush();

//强制性清空缓冲区中的内容

//第4步:关闭输出流

//out.close();

//此时没有关闭

}

}

此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。

Java中字节流和字符流的read()方法为什么返

*如果返回byte,同样无法表示流末尾.

* byte的取值范围是从-128到127

*这个范围内所有的数据,都有可能在数据中出现

* read()方法需要返回一个特殊的值来表示流末尾,这个值不能和流中的数据重复

*

*字符流中读取到的char是直接当作int使用,例如读取到一个'a'也就是97的时候,那么就相当于返回了一个int的97

*字节流中不能这么做,因为如果文件中存在数据-1,把-1直接当作int返回还是-1,那么就无法区分这个读到的结果是流末尾还是流中的数据了

*

* read()方法内部将读取到的所有字节高位补0转为int返回,这样做所有的数据都会是正数

*这时就可以用-1表示流末尾了

*而改变后的数据只要强转回byte,就可以得到原有数据

java中输入流去读取文件时为什么要创建一个缓存数组

IO流自定义字节流的缓冲区:

思路:BufferedInputStream类中read()方法的工作原理

1)先一个一个从字节流中读取字节,读取一定量(自定义)之后,存储在一个字节数组(缓冲区)(FileInputStream.read(byte[] b)),并获得存储数量(read方法的返回值)。

2)一个一个字节返回,返回一个,存储数量减1,然后指针往后移一位,准备取下一个。

3)如果存储数量为0,代表当前数组中所有数据已经全部取完,此时再来一次读取(read(byte[] b)),再获得此次存储数量。

4)如果存储数量(即read方法返回-1),代表读到文件末尾,返回-1。

因此,需要用到以下几个变量:

读取的字节数量,指向数组中准备取哪一个的指针,将要返回的字节变量。

关于java中为什么会有字节流的内容到此结束,希望对大家有所帮助。

java .2f 什么意思(c语言中%.2f是什么意思)add.java是什么(JAVA中的add()方法为什么可以直接到用)