Java IO流--InputStream(字节输入流) & OutputStream(字节输出流)
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO流--InputStream(字节输入流) & OutputStream(字节输出流)相关的知识,希望对你有一定的参考价值。
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 IO流--InputStream(字节输入流) & OutputStream(字节输出流)的主要内容,如果未能解决你的问题,请参考以下文章
javaio流之字节输入流:java.io.InputStream类及子类java.io.FileInputStream