Java基础知识IO流(字节流File读取操作)

  • 字节流
  • 操作文件的字节流
  • 主要的操作方法
  • 字节流不需要flush,为什么?
  • 字节流的available()方法
  • 例子
  • 练习

字节流

操作字节数据时,使用字节流。
InputStream(读)此抽象类是表示字节输入流的所有类的超类。
方法摘要
int available()
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
void close()
关闭此输入流并释放与该流关联的所有系统资源。
void mark(int readlimit)
在此输入流中标记当前的位置。
boolean markSupported()
测试此输入流是否支持 mark 和 reset 方法。
abstract int read()
从输入流中读取数据的下一个字节。
int read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
int read(byte[] b, int off, int len)
将输入流中最多 len 个数据字节读入 byte 数组。
void reset()
将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
long skip(long n)
跳过和丢弃此输入流中数据的 n 个字节

OutputStream(写)此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。
方法摘要
void close()
关闭此输出流并释放与此流有关的所有系统资源。
void flush()
刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
abstract void write(int b)
将指定的字节写入此输出流。

操作文件的字节流

FileInputStream 从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。
构造方法:FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

FileOutputStream文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流,用于写入诸如图像数据之类的原始字节的流。
构造方法:
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。

主要操作方法

字节流不需要flush,为什么?

字符流需要flush(),字符流本质也是使用字节流,但是当字符流读取了一个字节之后,不能立即操作,先临时存储起来,比如对于汉子,字符流读取了一个字节之后存起来,再读第二个字节,然后两个字节通过查表确定字符。字符流的底层用的也是字节流的缓存数组,所以字符流需要刷新。
但是字节流当没有指定缓冲区时不需要刷新,读一个字节操作一个字节。

字节流的available()方法

public int available() throws IOException
返回字节数。此方法应该由子类重写。

用法:在使用read(byte[] b)读取字节数据,创建byte数组时,数组的长度可以使用available()方法获得,这样创建的数组的长度时正好的,只需调用一次就好,不用进行while循环。
但是:当数据很大时,不建议使用available()方法确定数组的长度, 因为创建太大的数组会导致内存溢出。

例子

import java.io.*;

class TestBinaryStream 
{
    public static void main(String[] args) 
    {
          FileOutputStream fos=null;
          FileInputStream fis=null;
          try
          {
            fos=new FileOutputStream("TestDemo.txt");
            fis=new FileInputStream("TestDemo.txt");
            fos.write("haha".getBytes());
            byte[] arr=new byte[fis.available()];
            fis.read(arr);
            System.out.println(new String(arr));
          }
          catch (IOException e)
          {
              e.printStackTrace();
          }
          finally
          {
             try
             {
                if(fos!=null)
                    fos.close();
             }
             catch (IOException e)
             {
              e.printStackTrace();
             }

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

练习:

练习:使用字节流复制图片

import java.io.*;

class Test1912 
{
    public static void main(String[] args) 
    {
          FileOutputStream fos=null;
          FileInputStream fis=null;
          try
          {
            fos=new FileOutputStream("testCopyJpg2.jpg");
            fis=new FileInputStream("testCopyJpg.jpg");
            byte[] arr=new byte[1024];
            int length=0;
            while((length=fis.read(arr))!=-1)
            {
                fos.write(arr,0,length);

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

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

Java基础知识IO流(字节流File读取操作)_第1张图片
Java基础知识IO流(字节流File读取操作)_第2张图片

你可能感兴趣的:(Java基础知识IO)