字节流InputStream和OutputStream(二)中

简介: 字节流InputStream和OutputStream(二)

二. InputStream


InputStream 是字节输入流, 用于读取文件中的内容。常常使用其子类 FileInputStream.


二.一 InputStream 接口方法


image.png


二.二 FileInputStream


二.二.一 构造方法


二.二.一.一 方法


image.png


可以传入文件,也可以传入文件的路径, 注意,文件必须要存在,否则会抛出 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();
    }


运行程序,控制台打印输出:


20200617105300109.png


发现,中文目前可以正常的打印出来。


注意: 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();
    }


控制台打印输出:


20200617105307267.png


中文也可以正常的显示出来,换行也能显示。


但发现有一个问题,创建字节数组时,用的是 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();
    }


运行程序:


20200617105312824.png


会发现,后面有很多很多的空格, 浪费了 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();
    }


运行程序,控制台打印输出:


20200617105319992.png


你以为这样就成功了吗? 不,还没有。 现在我们固定长度为 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();
    }


这个时候,运行程序:


20200617105326897.png


会发现,文件内容没有读全,只读取了前10个字节。


要想全部读完,我们可以设置循环读取。



相关文章
|
5月前
|
存储 Java
使用OutputStreamWriter写入数据
使用OutputStreamWriter写入数据
|
Java
Java IO流之访问文件的字节输入流FileInputStream和字节输入流FileOutputStream的详解
Java IO流之访问文件的字节输入流FileInputStream和字节输入流FileOutputStream的详解
103 0
|
存储 缓存 Java
【Java I/O 流】字节输入输出流:InputStream & OutputStream
本篇介绍字节输入输出流,它们是所有字节流的超类,提供了一些常用方法,我们一起看一下。
89 0
|
缓存 Java
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
158 0
|
文件存储
IO流的字节输入输出流(InputStream,OutputStream)及文件复制
字节输出流与文件字节输出流 文件存储原理和记事本打开文件原理 OutputStream及FileOutputStream import java.io.FileOutputStream; import java.io.IOException; /* java.io.OutputStream:字节输出
|
存储 缓存 Java
输入流--outputStream
输入流--outputStream
|
存储 Java API
输入流--InputStream
输入流--InputStream
|
消息中间件 前端开发 JavaScript
InputStream 和 OutputStream 基础
大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
InputStream 和 OutputStream 基础
|
移动开发
字节流InputStream和OutputStream(二)上
字节流InputStream和OutputStream(二)
187 0
字节流InputStream和OutputStream(二)上