IO流概述(文件字节输入流)

I指Input,称为输入流:负责奥本数据读到内存中去

O指OutPut称为输出流,负责写数据出去

IO流应用场景:

Io流的分类,方向:

这些都是抽象类,不能直接创建对象,我们要找到他们的实现类

一·:FileInputStream (字节输入流)

作用:以内存为基准,可以把磁盘中的数据以字节的形式读到内存中去

package com.file.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStream {
    public static void main(String[] args) throws Exception {
        /**
         * 掌握文件字节输入流,每次读取一个字节
         */
        //得到这个字节输入流对象
        //InputStream is = new java.io.FileInputStream(new File("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt"));
        //方法二:直接用FileInputStream(String pathname),直接把文件路径写进去就可以
        java.io.FileInputStream is01 = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
        //2:读取文件的字节数据
        int read = is01.read();//读第一个字节a
        System.out.println((char) read);
        int read1 = is01.read();//读第一个字节b
        System.out.println((char) read1);
        //public int read() 每次读取一个字节,读完后就会返回-1
        
    }
}

使用FileInputStream(需要一个文件路径)来创建一个字节输入流对象,is01,然后通过调用对象的read方法进行读取字符

使用循环一次读取一个字节

package com.file.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStream {
    public static void main(String[] args) throws Exception {
        /**
         * 掌握文件字节输入流,每次读取一个字节
         */
        //得到这个字节输入流对象
        //InputStream is = new java.io.FileInputStream(new File("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt"));
        //方法二:直接用FileInputStream(String pathname),直接把文件路径写进去就可以
        java.io.FileInputStream is01 = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
//        //2:读取文件的字节数据
//        int read = is01.read();//读第一个字节a
//        System.out.println((char) read);
//        int read1 = is01.read();//读第一个字节b
//        System.out.println((char) read1);
//        //public int read() 每次读取一个字节,读完后就会返回-1
        //使用循环改造上述代码
        int b;//用于记住读取的字节
        while ((b =is01.read()) != -1) {
            System.out.println("读取的字节为:");
            System.out.print((char) b);//每次读取一个字节,如果是汉字就会乱码
            //读取性能差,尽量减少我们的系统去调用硬盘数据的次数
        }
        //每次使用完以后记得释放资源
        is01.close();

    }
}

使用FileInputStream字节输入流每次读读取一个字节,读取性能较差,并且读取的汉字是乱码(因为utf-8)编码中,汉字是三个字节;

文件字节输入流一次读取多个字节(read(byte[] buffer))

:每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1

读取字节要用new String(buffer);

package com.file.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStream {
    public static void main(String[] args) throws Exception {
        /**
         * 掌握文件字节输入流,每次读取一个字节
         */
        /**
         * 每次读取多个字节
         */

        //首先创建一个文件字节输入流对象与源文件接通

       InputStream is = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
       //读取文件中的字节数据,每次读取多个字节
         byte[] buffer =new byte[3];//一次读取是三个字节
        int read = is.read(buffer);
        String s = new String(buffer);//从第一个字节开始倒出,倒出read这么长的字节数
        System.out.println(s);
        System.out.println("当次读取的字节数量为"+read);
        //可以还使用这个桶来读取字节
        int read1 = is.read(buffer);
        //为了避免读取错误,我们要读取多少,倒出多少

        String s1 = new String(buffer);
        System.out.println(s1);//一共5个字节abA66,第一次读取abA,再次读取的时候会是66A。因为会拿后面两个字节去覆盖前面的,因为没有覆盖A的字节,所以会留在那里
        is.close();

    }
}
package com.file.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStream {
    public static void main(String[] args) throws Exception {
        /**
         * 掌握文件字节输入流,每次读取一个字节
         */
        /**
         * 每次读取多个字节
         */

        //首先创建一个文件字节输入流对象与源文件接通

       InputStream is = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
       //读取文件中的字节数据,每次读取多个字节
         byte[] buffer =new byte[3];//一次读取是三个字节
        int read = is.read(buffer);
        String s = new String(buffer,0,read);//从第一个字节开始倒出,倒出read这么长的字节数
        System.out.println(s);
        System.out.println("当次读取的字节数量为"+read);
        //可以还使用这个桶来读取字节
        int read1 = is.read(buffer);
        //为了避免读取错误,我们要读取多少,倒出多少

        String s1 = new String(buffer,0,read1);
        System.out.println(s1);//一共5个字节abA66,第一次读取abA,再次读取的时候会是66A。因为会拿后面两个字节去覆盖前面的,因为没有覆盖A的字节,所以会留在那里
        is.close();

    }
}

读多少,倒出多少

这样读取太麻烦,而且读取的效率不高,耗用性能太大,使用循环来进行读写,我们对代码进行改造

InputStream is = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
           byte[] buffer= new byte[3];//一次读取三个字节
        int len;
        System.out.println("读取的字符为");

        while((len=is.read(buffer))!=-1){
            //is.read()会返回一个int类型的数组,代表每次读取多少个字节
            String s = new String(buffer, 0, len);
            System.out.print(s);
        }
        is.close();
        //性能得到提示,但是也可避免出现汉字乱码的问题

一次读取全部字节(First way):

  InputStream is = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
        File file = new File("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
        long length = file.length();
        byte[] bytes = new byte[(int) length];
        while (is.read(bytes) != -1) {
            System.out.println(new String(bytes));
        }
        System.out.println(length);
        System.out.println(bytes.length);
        is.close();

我们通过一个File类对象指定一个文件。通过length()来获取这个文件的大小,由于电脑运行内心有线,所以在数组中数组中的支持数据类型为int, 而我们file文件的长度为long,所以需要强转一下

一次读取全部字节(Second way):

代码:

        InputStream is = new java.io.FileInputStream("FileStudy\\\\src\\\\main\\\\java\\\\com\\\\file\\\\test\\\\it.txt");
        byte[] bytes = is.readAllBytes();
        System.out.println(new String(bytes));
        

注意:如果文件太大,那么就会抛出异常,内存溢出

博客内容均系原创,未经允许严禁转载!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇