二. InputStream
InputStream 是字节输入流, 用于读取文件中的内容。常常使用其子类 FileInputStream.
二.一 InputStream 接口方法
二.二 FileInputStream
二.二.一 构造方法
二.二.一.一 方法
可以传入文件,也可以传入文件的路径, 注意,文件必须要存在,否则会抛出 FileNotFoundException 异常。
老蝴蝶建议,传入文件的形式。
二.二.一.二 演示
@Test public void conTest() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello.txt"); //传入文件 InputStream inputStream=new FileInputStream(file); String path="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello.txt"; //传入文件的路径 InputStream inputStream1=new FileInputStream(path); }
二.三 InputStream 读取文件
二.三.一 read() 一个一个读取
@Test public void read1Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); InputStream inputStream=new FileInputStream(file); //读一个,需要转换成 char 字符进行展示 System.out.println("第一个:"+(char)inputStream.read()); System.out.println("第二个:"+(char)inputStream.read()); System.out.println("第三个:"+(char)inputStream.read()); int r=-1; byte[] b=new byte[(int)file.length()]; int i=0; //需要一个个放置到字节数组里面 while((r=inputStream.read())!=-1){ b[i]=(byte)r; i++; } System.out.println("读出文件内容:"+new String(b,0,i)); inputStream.close(); }
运行程序,控制台打印输出:
发现,中文目前可以正常的打印出来。
注意: read() 读取之后,无法再重新返回去读。
读内容是一个一个的读,那么能不能读完之后,封装到一个数组里面呢, 这样便于获取?
二.三.二 read(byte[] b ) 读取内容后封装到数组里面
@Test public void read2Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); InputStream inputStream=new FileInputStream(file); //根据文件大小,设置字节数组的大小 byte[] bytes=new byte[(int)file.length()]; //读取之后,封装到数组里面 inputStream.read(bytes); System.out.println("读出内容:"+new String(bytes)); inputStream.close(); }
控制台打印输出:
中文也可以正常的显示出来,换行也能显示。
但发现有一个问题,创建字节数组时,用的是 new byte[(int)file.length()]; 也就是先统计一下文件的大小,然后根据文件大小,去构建数组,需要先查询一下。 这样效率会低一些。
二.三.三 read(byte[] b) 数组长度设置为 1024
@Test public void read3Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); InputStream inputStream=new FileInputStream(file); //设置长度 为1024 byte[] bytes=new byte[1024]; inputStream.read(bytes); System.out.println("读出内容:"+new String(bytes)); inputStream.close(); }
运行程序:
会发现,后面有很多很多的空格, 浪费了 bytes 数组的空间。 可以利用 read(bytes) 方法的返回值进行控制。
二.三.四 read(byte[] b) 返回值
@Test public void read4Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); InputStream inputStream=new FileInputStream(file); //设置长度 为1024 byte[] bytes=new byte[1024]; //返回的内容,就是读取的长度 int len=inputStream.read(bytes); System.out.println("读出内容:"+new String(bytes,0,len)); inputStream.close(); }
运行程序,控制台打印输出:
你以为这样就成功了吗? 不,还没有。 现在我们固定长度为 1024, 也就是可以读取 1KB的内容, 但是如果长度超过了 1KB, bytes字节数组是放不下的,会造成文件的内容读取不全的, 那该怎么办呢?
老蝴蝶可以演示一下,这种效果。 我们可以设置长度为 10, 这个长度肯定小于文件的大小
@Test public void read5Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); InputStream inputStream=new FileInputStream(file); //设置长度 为10 byte[] bytes=new byte[10]; //返回的内容,就是读取的长度 int len=inputStream.read(bytes); System.out.println("读出内容:"+new String(bytes,0,len)); inputStream.close(); }
这个时候,运行程序:
会发现,文件内容没有读全,只读取了前10个字节。
要想全部读完,我们可以设置循环读取。