java中为什么会有字节流,java中输入流去读取文件时为什么要创建一个缓存数组
很多朋友对于java中为什么会有字节流和java中输入流去读取文件时为什么要创建一个缓存数组不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
java的io中为什么有那么多种流啊
1.因为java要和各种其他的譬如电脑文档等交换信息,就有了输入输出流。
2.从最简单的输入输出流懂起,以后遇到什么解决什么。
3.两大类,字节流和字符流
字节流:BufferedInputStream,BufferedOutputStream,FileInputStream,FileOutputStream
字符流:BufferedReader,BufferedWriter,FileReader,FileWriter
4.在读写二进制数据时就会使用字节流。在设计用于处理字符输入输出时用的是Unicode,所以要用字符流,在某些情况下,字符流比字节流更高效。字节流和字符流的功能大部分是并行的。
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中为什么会有字节流的内容到此结束,希望对大家有所帮助。