io-FileInputStream字节输入流(硬盘到内存重要)

一、IO输入输出:

输入:硬盘到内存Read / Input / InputStream

输出:内存到硬盘(Write / Output / OutputStream)

 

 二、IO流分类四大家族:

  • 都是抽象类。(abstract  class)
  • 在java中只要“类名” 以Stream结尾的都是字节流。以“Reader / Writer”结尾的都是字符流
  • 所有的 都实现了:java.io.Closeable接口,都是可关闭的,都有close()方法。流是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费很多资源
  • 所有的输出流都实现了:java.io.Flushable接口,都是可刷新的,都有flush()方法。
  • 输出流在最后,一定要flush()刷新一下,将通道/管道当中剩余未输出的数据输出完(清空管道数据!) 注意:如果没有flush()可能会导致丢失数据。
  • 字节输入流: java.io.InputStream 
  • 字节输出流java.io.OutputStream
  • 字符输入流: java.io.Reader       
  • 字符输出流: java.io.Writer       

 三、FileInputStream 文件字节流

 1、文件字节输入流,万能的,任何类型的文件都可以采用这个流来读。字节的方式,完成输入read的操作,(硬盘---> 内存)

2、读到文件的末尾,再读的时候读取不到任何数据,会返回-1.

3、 文件路径:D:\course\JavaProjects\02-JavaSE\temp (IDEA会自动把\编程\\,因为java中\表示转义)

  • FileInputStream fis = new FileInputStream("D:\\course\\JavaProjects\\02-JavaSE\\temp");
  • 写成这个:反斜杠 /  这样的路径也可以。
import java.io.FileNotFoundException;
import java.io.IOException;

/*
读取文件:tempfile3 文件里面的内容
文件内容:abcdef
 */
public class FileInputStreamTest {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("chapter23/src/tempfile3");

            // 准备一个byte数组
            byte[] bytes = new byte[4];

            // while 循环读取数据,下标从零开始读取,读到-1,表示没有数据
            // 将字节数组全部转换成字符串
            //System.out.println(new String(bytes,0,readCount)); 
            // 读取了多少个字节,转换多少个字节
            int readCount = 0;
            while((readCount = fis.read(bytes)) != -1) {
                System.out.print(new String(bytes, 0, readCount));
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 FileInputStream类的其它常用方法:

1、int available():返回流当中剩余的没有读到的字节数量

2、long skip(long n):跳过几个字节不读。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/*
FileInputStream类的其它常用方法:
    int available():返回流当中剩余的没有读到的字节数量
    long skip(long n):跳过几个字节不读。
 */
public class FileInputStreamTest {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("tempfile");
            System.out.println("总字节数量:" + fis.available());

            // 读1个字节
            int readByte = fis.read();
            // 还剩下可以读的字节数量是:5
            System.out.println("剩下多少个字节没有读:" + fis.available());

            // 这个方法使用:
            byte[] bytes = new byte[fis.available()]; 
            // 这种方式不太适合太大的文件,因为byte[]数组不能太大。
            // 不需要循环了。
            // 直接读一次就行了。
            int readCount = fis.read(bytes); // 6
            System.out.println(new String(bytes)); // abcdef

            // skip跳过几个字节不读取,这个方法也可能以后会用!
            fis.skip(3);
            System.out.println(fis.read()); //100

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

posted @ 2022-04-23 17:47  280887072  阅读(262)  评论(0编辑  收藏  举报