java基础

JAVA之IO

2021-08-13  本文已影响0人  isLJli

IO的分类

IO是一种以内存为视角,对文件的读取和写入。OutputWrite是内存对文件的写入,InputReader是内存对文件的读取。
根据对文件写入读取的最小执行单位,把IO分为两类:字节流、字符流
字节流IO:表示内存对文件的写入和读取的最小的执行单位为字节Byte,以OutputStream、InputStream为基类。
字符流IO:表示内存对文件的写入和读取最小的执行单雯为字符Char,以Writer、Reader为基类
File类通过文件所在的路径或uri表示要操作的文件。看看File常用的构造函数

// 文件路径
public File(String pathname)
// 路径和文件名
public File(String parent, String child)
// 文件所在uri
public File(URI uri)

字节流

字节流以Byte来进行文件的写入和读取。以InputStream和OutputStream为基类,其中以FileInputStreamFileOutputStream为字节流IO的代表。

FileOutputStream

以byte为最小单位对文件进行写入。以下是FileOutputStream常用的write()写入方法和构造函数:

  // 以byte数组进行文件写入
  public void write(byte b[]) throws IOException {
      // Android-changed: Write methods delegate to write(byte[],int,int) to share Android logic.
      write(b, 0, b.length);
  }

 // 只写入一个字节
  public void write(int b) throws IOException {
      // Android-changed: Write methods delegate to write(byte[],int,int) to share Android logic.
      write(new byte[] { (byte) b }, 0, 1);
  }

  // 写入len长度的字节数组
  public void write(byte b[], int off, int len) throws IOException {

  // 文件路径
  public FileOutputStream(String name) throws FileNotFoundException {

  // 文件
  public FileOutputStream(File file) throws FileNotFoundException {

FileInputStream

byte为最小单位,对文件进行读取。一下是读取方法read()和构造方法。

  // 从文件读入一个字节,如果没有内容返回-1
  public int read() throws IOException {
      // Android-changed: Read methods delegate to read(byte[], int, int) to share Android logic.
      byte[] b = new byte[1];
      return (read(b, 0, 1) != -1) ? b[0] & 0xff : -1;
  }

  // 从文件读入字节数组为单位,如果没有内容返回-1
  public int read(byte b[]) throws IOException {
      // Android-changed: Read methods delegate to read(byte[], int, int) to share Android logic.
      return read(b, 0, b.length);
  }

  // 从文件读取len长度的字节到数组
  public int read(byte b[], int off, int len) throws IOException {

  // 文件路径
  public FileInputStream(String name) throws FileNotFoundException {

  //文件
  public FileInputStream(File file) throws FileNotFoundException {


字节流案例

案例:跟图片的路径,用字节流复制一张相同的图片,并展示出来。

  /**
   * 复制图片(到外部私有存储)
   * path: 图片的真实路径
   */
  private fun copyImage(imgPath: String?) {
      try {
          // FileInputStream
          val file = File(imgPath)
          val inputStream = FileInputStream(file)
          // FileOutputStream
          val outputFile = File(getExternalFilesDir("hello"), "li.jpg")
          val outputStream = FileOutputStream(outputFile)
          // 复制
          val byteArray = ByteArray(8 * 1024)
          while ((inputStream.read(byteArray)) != -1) {
              outputStream.write(byteArray)
          }
          inputStream.close()
          outputStream.close()

          val file2 = File(getExternalFilesDir("hello"), "li.jpg")
          val fileInputStream = FileInputStream(file2)
          val bitmap = BitmapFactory.decodeStream(fileInputStream)
          imgView?.setImageBitmap(bitmap)
     
      } catch (e: IOException) {
          e.printStackTrace()
      }
  }

字节流全部类

字节流

ObjectOutpueStream、ObjectInputStream:序列化和反序列化的类
BufferedOutputStream、BufferedInputStream:内存缓存一定数据后才写入文件,减少对硬盘的读写操作次数。

字符流

字符流以Char来进行文件的写入的读取。以Writer和Reader为基础,其中以FileWriterFileReader为字符流IO的代表。

FileWriter

以char为最小单位对文件进行写入。这样就可以适配英语以外的如中文的适配。以下是FileWriter常用的write()写入方法和构造函数。

// 以字符数组写入
public void write(char cbuf[])

abstract public void write(char cbuf[], int off, int len)
// 以字符串写入
public void write(String str)

public void write(String str, int off, int len)

public void write(int c)

public FileWriter(String fileName) 

public FileWriter(File file) 

FileReader

以char为最小单位对文件进行读取,以下是FileReader常用的read()方法和构造函数。

       // 读取一个字符,没有内容返回-1
      public int read() throws IOException {
      char cb[] = new char[1];
      if (read(cb, 0, 1) == -1)
          return -1;
      else
          return cb[0];
  }

  // 读取一个字符数组,没有内容返回-1
  public int read(char cbuf[]) throws IOException {
      return read(cbuf, 0, cbuf.length);
  }

   // 读取len长度到字符数组,没有内容返回-1
  abstract public int read(char cbuf[], int off, int len) throws IOException;

  public FileReader(String fileName) throws FileNotFoundException {

  public FileReader(File file) throws FileNotFoundException {


字符流案例

案例: 用字符流复制一个图片的文件

  private fun copyImageByChar(imgPath: String?) {
      try {
          val fileReader = FileReader(imgPath)
          // FileWriter
          val file = File(cacheDir, "char.txt")
          val fileWriter = FileWriter(file)
          // 复制
          val charArray = CharArray(8 * 1024)
          var size = fileReader.read(charArray)
          while (size >= 0) {
              fileWriter.write(charArray)
              size = fileReader.read(charArray)
          }
          fileReader.close()
          fileWriter.close()
          
      } catch (e: IOException) {
          e.printStackTrace()
      }
  }

字符流全部类

字符流
上一篇下一篇

猜你喜欢

热点阅读