解析java中的文件字节输入流
1 含义
字节输入流的后缀为InputStream,文件字节输入流的全名为FileInputStream
2 作用
以字节的形式对外部文件(磁盘上的文件,网络文件)进行读取操作,把内容读取到程序中,并在程序中进行相应的操作。
3 如何用
3.1 使用方法
3.1 每次只读取一个字节文件
3.1.1 核心思路
a 声明一个文件字节输入流FileInputStream对象,并赋值为null
b 实例化FileInputStream对象并通过try…catch去处理异常
c 通过实例对象.read()方法去循环读取(返回值不为-1时就继续读取),读取的时候也需要处理异常
d 通过强转把ascil的数字转换成对应的字符
e 最后在finally语句中对实例对象进行非空判断,若不为null则需要通过对象名.close()方法去关闭这个文件字节输入流(不关闭会造成资源的浪费),在关闭的时候也要去try…catch去捕获异常
3.1.2 示例代码
temp.txt文件内容
Hello,Java!!!!
FileInputStreamTest类
package Work03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("src/Work03/temp.txt");
int readData=0;
while ((readData=fis.read())!=-1){
System.out.print((char)readData);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//需要进行非空判断,才能进行文件字节输入流的关闭
// 若是空的话,无需去理会她,因为过段时间会被gc垃圾回收器去进行回收的
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.1.3 示例代码运行截图
3.2 每次以byte数组为长度去进行读取(与byte数组等比例的内容)
3.2.1 核心思路
a 声明一个FileInputStream对象并赋值为null;
b 实例化FileInputStream对象,并需要通过try…catch去捕获异常
c 创建一个byte数组,用于存放每次去拿数据的最大长度
d 通过readData=对象名.read(bytes)去进行循环读取(若read方法返回值不为-1,就就可以继续往下读取),这里也要对read方法进行捕获异常
e 每次打印byte数组里面的值(这里没有剔除之前存放在里面的数据)
f 判断对象是否为null,若为null,则对象名.close去关闭文件字节输入流;使用close方法我们还是需要去捕获异常
3.2.2 正确示例代码(内容是byte数组长度倍数)
temp.txt文件
Hello,Java!!!!
//这个文本的字节个数恰好是byte数组长度的整数倍
FileInputStreamTest文件
package Work03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("src/Work03/temp.txt");
byte[] bytes=new byte[2];
while ((fis.read(bytes))!=-1){
System.out.print(new String(bytes));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//需要进行非空判断,才能进行文件字节输入流的关闭
// 若是空的话,无需去理会她,因为过段时间会被gc垃圾回收器去进行回收的
//非空判断对象名.notnull就会自动生成非空判断语句
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.2.3 示例代码运行截图
3.2.4 错误示例代码(内容不是byte数组长度倍数)
temp.txt文件
Hello,Java1
//这个字节的数量不是byte数组长度的整数倍
FileInputStreamTest文件
package Work03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("src/Work03/temp.txt");
byte[] bytes=new byte[2];
while ((fis.read(bytes))!=-1){
System.out.print(new String(bytes));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//需要进行非空判断,才能进行文件字节输入流的关闭
// 若是空的话,无需去理会她,因为过段时间会被gc垃圾回收器去进行回收的
//非空判断对象名.notnull就会自动生成非空判断语句
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.2.5 错误示例代码运行截图
3.2.6 错误代码分析
因为你读取到va的时候,byte[0]=118(v对应的asci码值),byte[1]=97,
然后再往后读取时,发现只有一个新的数据1,此时byte[0]=49,byte[1]保持不变
你打印是将所有byte数组里面的内容打印了,所以最后两个字符会依次打印成1和a
因此会得到一些不太符合要求的结构
因此这种方法用的很少,采用3.3方式用的较多
3.3 以byte数组读取后,打印有效信息(筛选)
3.3.1 核心思路
a 声明一个文件字节输入流对象FileInputStream,并给其赋值为null
b 实例化文件字节输入流对象,需要try…catch捕获异常
c.建立一个较大的容量(长度)的byte数组,通过read(bytes)用于一次性获取byte数组长度的元素(数量足够的情况下),若数量不够,把剩下的元素放入byte数组,覆盖上一次的结果,使用read方法的时候需要去捕获异常
d 把read(bytes)的返回值用一个变量去readLen(新数据/有效数据个数)去接收
e 然后在通过new String(bytes,0,readLen)筛选得到有效数据(新数据),然后进行循环遍历打印即可
f.在finally语句中里面判断文件字节输入流对象,若不为空,就需要对象名.close()去进行关闭文件字节输入流这个操作,用close方法还需要去try…catch捕获异常
3.3.2 示例代码
temp.txt
Hello,Java1!Facts speak louder than words
FileInputStreamTest类
package Work03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("src/Work03/temp.txt");
byte[] bytes=new byte[1024];
//这个尽可能的大,是因为可以读取显示的时候尽量让中文不出现乱码问题,而且大的话也可以提高读取效率
int readLen=0;
//readLen为:每次read方法读取的有效数据(新数据)的个数
while ((readLen=fis.read(bytes))!=-1){
System.out.print(new String(bytes,0,readLen));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//需要进行非空判断,才能进行文件字节输入流的关闭
// 若是空的话,无需去理会她,因为过段时间会被gc垃圾回收器去进行回收的
//非空判断对象名.notnull就会自动生成非空判断语句
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}