IO流的简单理解

一、File

1.1 IO的概述

  回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。

  当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。因此我们把这种输入和输出动作称为IO操作。

1.2 File

  APIFile类的描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。

1.2.1 File属性

static String

pathSeparator 
          与系统有关的路径分隔符,为了方便,它被表示为一个字符串。

扫描二维码关注公众号,回复: 2981777 查看本文章

static char

pathSeparatorChar 
          与系统有关的路径分隔符。

static String

separator 
          与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。

static char

separatorChar 
          与系统有关的默认名称分隔符。

  不同的操作系统,路径的分隔符也会不一样。Windows的为“\”,Linux 的为“/”。

1.2.2 File 的构造器:

  File(String pathname) :通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

  File(File parent, String child) :根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

  File(String parent, String child) :根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

  File(URI uri) : 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

1.3.3 File的常用方法

  1.获取该类的相关信息:

    A)getAbsoluteFile() :返回此抽象路径名的绝对路径名形式。

    B)getAbsolutePath() :返回此抽象路径名的绝对路径名字符串。

    C)getCanonicalFile():返回此抽象路径名的规范形式。

    D)getCanonicalPath():返回此抽象路径名的规范路径名字符串

    E)getName():返回由此抽象路径名表示的文件或目录的名称。

    F)getPath():将此抽象路径名转换为一个路径名字符串。

    G)getParent() :返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。

    H)getParentFile():返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。

    I)length():返回由此抽象路径名表示的文件的长度。

import java.io.File;

import java.io.IOException;

public class Test2 {

 

public static void main(String[] args) throws IOException {

File file =new File("F\\IOTest\\a.txt");//第一个\为转移字符

System.out.println(file.getName());

System.out.println(file.getPath());

System.out.println(file.getAbsolutePath());

System.out.println(file.getCanonicalPath());  //此处需要抛异常

System.out.println(file.getParent());

System.out.println(file.length());  //该文件对象实际并不存在 

} 

}

运行结果:

a.txt

F\IOTest\a.txt

F:\eclipse-workspace\IOStream\F\IOTest\a.txt

F:\eclipse-workspace\IOStream\F\IOTest\a.txt

F\IOTest

0

2.新建和删除

  a) (boolean) createNewFile当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。

  b) (boolean)delete():删除此抽象路径名表示的文件或目录。

  c) (booleanexists():测试此抽象路径名表示的文件或目录是否存在。

  d) (booleanisDirectory():测试此抽象路径名表示的文件是否是一个目录。

  e) (boolean) isFile(): 测试此抽象路径名表示的文件是否是一个标准文件。

  f) (boolean)mkdir():创建此抽象路径名指定的目录。

  g) (boolean)mkdirs(): 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

3.文件的获取:

  a)(String[])list():返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

  b)(File[])listFile():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

File file1=new File("F:\\");

for(String str:file1.list()) {

System.out.println(str);

}

 

4.文件过滤器:

  通过listFiles()方法,我们可以获取到一个目录下的所有文件和文件夹,但能不能对其进行过滤呢?比如我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹呢?

  我们是可以先把一个目录下的所有文件和文件夹获取到,并遍历当前获取到所有内容,遍历过程中在进行筛选,但是这个动作有点麻烦,Java给我们提供相应的功能来解决这个问题。

  查阅File类的API,在查阅时发现File类中重载的listFiles方法,并且接受指定的过滤器。

     (File[ ])listFiles(FilenameFilter filter):返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

  public interface FilenameFilter:实现此接口的类实例可用于过滤器文件名。Abstract Window Toolkit 的文件对话框组件使用这些实例过滤 File 类的 list 方法中的目录清单,该接口只有一个抽象方法。

public interface FilenameFilter {

      boolean accept(File dir, String name);

 

      dir:the directory in which the file was found.

      name :the name of the file.

  (File[ ])listFiles(FileFilter filter) :返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

public abstract class FileFilter {

    public abstract boolean accept(File f);

    public abstract String getDescription();

}

二、字节流

2.1字节输出流OutputStream

  OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。由于是字节byte型,输出范围为[-128127)。OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。

FileOutputStream,即文件输出流,是用于将数据写入 File的输出流。

以下为OutputStream的方法:

  (abstract  void)write(int b):将指定的字节写入此输出流。向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 

  write(byte[] b, int off, int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

  write(byte[] b):将 b.length 个字节从指定的 byte 数组写入此输出流。

  flush():刷新此输出流并强制写出所有缓冲的输出字节。

  close():关闭此输出流并释放与此流有关的所有系统资源。

2.2字节输入流InputStream

  (abstract  void)read(int b):从输入流中读取数据的下一个字节,如果下一个为空,则输出-1。

  read(byte[ ] b):从输入流中读取一定的字节数,并储存在缓冲区byte[ ] b 中。

public static void main(String[] args) throws IOException {
  File file =new File("F:\\IOTest\\a.txt");//第一个\为转移字符
  FileOutputStream fos=new FileOutputStream(file);
  fos.write("Hello,World".getBytes());
  fos.flush();
  fos.close();
  FileInputStream fis =new FileInputStream(file);
  byte[] b=new byte[5];
  System.out.println(fis.read(b));
  System.out.println((char)fis.read());
  System.out.println(Arrays.toString(b));
  System.out.println(Arrays.toString(getChar(b)));
  fis.close();
}
public static char[] getChar(byte[] bs) {
  int len=bs.length;
  char[] as=new char[len];
  for(int i=0;i<len;i++) {
  as[i]=(char)bs[i];
 }
  return as;
}

输出结果:

5
,
[72, 101, 108, 108, 111]
[H, e, l, l, o]

三、字符流

  在字节流的操作过程中可以操作所有数据,可是当我们操作的文件中有中文字符时,就需要使用字符流进行操作。

3.1字符输入流Reader

  我们读取拥有中文的文件时,使用的字节流在读取,那么我们读取到的都是一个一个字节。只要把这些字节去查阅对应的编码表,就能够得到与之对应的字符。API中是否给我们已经提供了读取相应字符的功能流对象,Reader,读取字符流的抽象超类。

  (int ) read():读取单个字符

  (int) read(char[] cbuf): 将字符读入数字中。

3.1.1 FileReader

  查阅FileInputStreamAPI,发现FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader

打开FileReaderAPI介绍。用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的

  构造方法:

  FileReaderFile files):在给定从中读取数据的 File 的情况下创建一个新 FileReader。

  FileReaderString filesName):在给定从中读取数据的文件名的情况下创建一个新 FileReader

3.2字符输出流Writer

  既然有专门用于读取字符的流对象,那么肯定也有写的字符流对象,查阅API,发现有一个Writer类,Writer是写入字符流的抽象类。其中描述了相应的写的动作。

                                             

3.2.1 FileWriter

  查阅FileOutputStream的API,发现FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。

打开FileWriter的API介绍。用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。

构造方法

         

public static void main(String[] args) throws IOException{
  FileWriter fw=new FileWriter("F:\\IOTest\\a.txt");
  fw.write("Hello World,好好学习,天天向上");
  fw.flush();
  fw.close();
  FileReader fr=new FileReader("F:\\IOTest\\a.txt");
  int a=0;
  while((a=fr.read())!=-1) {
  System.out.print((char)a);
  }
  fr.close();
}

flushclose的作用:

     close():关闭此流,但要先刷新它。

  flush():刷新该流的缓冲。

flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。

close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。

猜你喜欢

转载自www.cnblogs.com/luyilan/p/9566067.html