Java中的字节流InputStream和OutputStream详解
作者:CodeJiao
这篇文章主要介绍了Java中的字节流InputStream和OutputStream详解,继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节8bit,我们看到的具体的某一些管道,凡是以InputStream结尾的管道,都是以字节的形式向我们的程序输入数据,需要的朋友可以参考下
1. InputStream(字节输入流)
- 我们看到的具体的某一些管道,凡是以InputStream结尾的管道,都是以字节的形式向我们的程序输入数据。
- 继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(Byte)=> (8bit);下图中深色为节点流,浅色为处理流。
InputStream的基本方法
//读取一个字节并以整数的形式返回(0~255) // 如果返回-1就说明已经到了输入流的末尾 int read () throws IOException //读取一系列字节并存储到一个数组buffer // 返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1 int read ( byte[] buffer) throws IOException //从offset位置开始,读取length个字节,并存储到一个字节数组buffer, // 返回实际读取的字节数,如果读取前以到输入流的末尾返回-1. int read ( byte[] buffer, int offset, int length) throws IOException //关闭流释放内存资源 void close () throws IOException //跳过n个字节不读,返回实际跳过的字节数 long skip(long n) throws IOException
read()方法是一个字节一个字节地往外读,每读取一个字节,就处理一个字节。read(byte[] buffer)方法读取数据时,先把读取到的数据填满这个byte[]类型的数组buffer(buffer是内存里面的一块缓冲区),然后再处理数组里面的数据。这就跟我们取水一样,先用一个桶去接,等桶接满水后再处理桶里面的水。如果是每读取一个字节就处理一个字节,这样子读取也太累了。
【演示:使用FileInputStream流来读取FileInputStream.java文件的内容】
read.txt
Test.java
package character1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Test { public static void main(String[] args) { // 使用变量b来装调用read()方法时返回的整数 int b = 0; /* 使用FileInputStream流来读取有中文的内容时,读出来的是乱码, 因为使用 InputStream流里面的read()方法读取内容时是一个字节一个字节地读取的, 而一个汉字是占用两个 字节的,所以读取出来的汉字无法正确显示。 使用FileReader流来读取内容时,中英文都可以正确显示, 因为Reader流里面的 read()方法是一个字符一个字符地读取的, 这样每次读取出来的都是一个完整的汉字,这样就可以正确 显示了。 */ FileInputStream inputStream = null; try { inputStream = new FileInputStream("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt"); } catch (FileNotFoundException e) { System.out.println("系统找不到指定的文件"); System.exit(-1);// 系统非正常退出 } long num = 0; // 使用变量num来记录读取到的字符数 // 调用read()方法时会抛异常,所以需要捕获异常 try { /* 调用int read() throws Exception方法时,返回的是一个int类型的整数 循环结束的条件就是返回一个值-1,表示此时已经读取到文件的末尾了。 */ while ((b = inputStream.read()) != -1) { // “char(b)”把使用数字(ASCII码)英文字母转换成字符输入 System.out.print((char) b); num++; } inputStream.close();// 关闭输入流 System.out.println("总共读取了" + num + "个字节的文件"); } catch (IOException e) { System.out.println("文件读取错误"); System.exit(-1);// 系统非正常退出 } } }
2. OutputStream(输出流)
继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(Byte)=> (8bit);下图中深色的为节点流,浅色为处理流。
OutputStream的基本方法:
案例: 【使用FileOutputStream流往一个文件里面写入数据】
Test.java
package character1; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { // 使用变量b来装调用read()方法时返回的整数 int b = 0; try (FileInputStream inputStream = new FileInputStream("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt"); FileOutputStream outputStream = new FileOutputStream("\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\write.txt")) { while ((b = inputStream.read()) != -1) { outputStream.write(b); } } catch (IOException e) { System.out.println("读取文件异常"); System.exit(-1);// 系统非正常退出 } System.out.println("文件写入成功"); } }
write.txt
3. 小结
FileInputStream和FileOutputStream这两个流都是字节流,都是以一个字节为单位进行输入和输出的。
所以对于占用2个字节存储空间的字符来说读取出来时就会显示成乱码。
到此这篇关于Java中的字节流InputStream和OutputStream详解的文章就介绍到这了,更多相关Java的InputStream和OutputStream内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!