I/O流操作

什么是流

* 数据的流动,称为流,硬盘和内存之间的数据交互
* 流按照方向分,分为输入流和输出流,以内存作为参照物。将数据从数据源读取到内存,为输入流,也称为读取流。将数据从内存中写入数据源,为输出流,也称为写入流。
* 流放在I/O包里

流的分类
按照类型分类可以分为字节流,字符流和对象流。

1. 字节流:以字节方式传输,所有类型均能传输
2. 字符流:只能传输字符串
3. 对象流:传输对象

由于计算机采用二进制。数据的传输都是以字节为单位传输。所以,无论那种流,其本质都是字节流。不过,为了方便字符数据和对象数据的传输,可以在字节流基础上进行封装,形成字符流和对象流,所有的流都使用int类型去接收

InputStream和OutputStrem
InputStream和OutpuuStrem是字节流的两个父类,这个两个类是抽象类,提供了read()和write()两个抽象方法。由子类根据自己数据源的特点分别做实现
流操作的步骤

1. 建立流
2. 操作流
3. 关闭流

当做文件流操作时,读取流会抛出文件问找到FileNotFoundException异常。写入流会新建文件,但是前提是文件所在目录必须存在。否则也会抛出FileNotFoundException

创建读取流

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputText {

      public InputText() {
            //外面声明变量,内部实例化,方便在finlly中关闭
            InputStream in = null;
            try {
                  //创建文件读取字节流
                  in = new FileInputStream("D:\\文档\\图片\\素材\\1.jpg");
                  int data=0;
                  //一次只读一个字节,读取完毕返回-1
//                while((data=in.read())!=-1){
//                      System.out.println(data);
//                }
                  //使用byte数组接收
                  int len=0;
                  byte[]by=new byte[1024];
                  //一次读取1024个字节,放入byte数组,返回本次读取的字节数
                  while((len=in.read(by))!=-1){
                        System.out.println(len);
                  }

            } catch (Exception e) {
                  e.printStackTrace();
            }finally{
                  try {
                        //关闭流通道方法
                        in.close();
                  } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                  }
            }

      }

      public static void main(String[] args) {
            // 对象没有被变量指向会被垃圾回收,但是当对象正在运行则不会回收
            new InputText();

      }

}

创建写入流

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class OutputTest {
      public OutputTest(){

            OutputStream out=null;
            try {
                  //创建写入字节流
                  out =new FileOutputStream("1.txt");
                  //默认为覆盖写入,如果第二个参数为真,表示追加写入
                  out =new FileOutputStream("1.txt",true);

//                //写入数据,只能是byte类型
//                out.write(100);

                  //写入字节数组
                  out.write("努力一点,多挣点钱。".getBytes());

            } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }finally{
                  try {
                        out.close();
                  } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                  }
            }


      }


      public static void main(String[] args) {
            OutputTest o=new OutputTest();

      }

}

Reader和Write
Reader和Write是字符流的两个父类。可以直接对字符串进行操作

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class ReaderTest {

      public ReaderTest() {
            // 字符流只能读取文本文件
            Reader r = null;
            //Reader与BufferedReader配合使用
            BufferedReader br = null;

            try {
                  r = new FileReader("img/1.txt");
                  br = new BufferedReader(r);
                  String str = null;
                  while ((str = br.readLine()) != null) {
                        System.out.println(str);
                  }

            } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            } finally {
                  try {
                        br.close();
                        r.close();
                  } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                  }

            }
      }

      public static void main(String[] args) {
            ReaderTest r = new ReaderTest();
      }

}

Write代码

import java.io.FileWriter;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;

public class WriteTest {

      public WriteTest(){
            Writer w=null;
            try {
                  //第二个参数如果不写表示默认覆盖,写了真表示换行输入
                  w=new FileWriter("3.txt");
                  
                  w.write("你好,欢迎光临\n");
                  w.write("今天下雨");

            } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }finally{
                  try {
                        w.close();
                  } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                  }

            }

      }

      public static void main(String[] args) {
            WriteTest w=new WriteTest();

      }

}

File 文件类
写入流会新建文件,但是前提是文件所在目录必须存在。否则也会抛出FileNotFoundException

import java.io.File;

public class FileText {

      public static void main(String[] args) {
            // 创建一个文件对象
            File f = new File("D:/文档/JAVA/朗沃/作业");

            // 得到文件对象描述的绝对路径
            System.out.println(f.getAbsolutePath());

            // 判断文件是否存在,返回boolean值,存在返回真
            boolean isHas = f.exists();
            System.out.println(isHas);
            // 判断指定目录是否存在,如果不存在,系统自动创建一个对应目录
            if (f.exists() == false) {
                  f.mkdirs();
            }

            // 判断文件对象代表的是文件还是目录, 是文件返回真,目录返回假
            System.out.println(f.isFile());
            // 判断文件对象代表的是文件还是目录,是目录返回真,文件返回假
            System.out.println(f.isDirectory());

            //删除文件或目录,如果删除文件可以直接删除,删除目录必须保证目录为空目录
            File s=new File("D:/文档/JAVA/朗沃/作业/Test.txt");
            s.delete();

            File w=new File("C:/Recovery");
            //得到目录中的所有文件对象,不包括子目录中的文件或目录
            File[] farray=w.listFiles();
            for(File x:farray){
                  System.out.println(x.getAbsolutePath());
            }

//          list(new File("C:/Recovery"));

      }
      //递归循环,自己调用自己
      public static void list(File dirFile){
            File[] farray=dirFile.listFiles();
            for(File f: farray){
                  if(f.isFile()){
                        System.out.println(f.getAbsolutePath());

                  }else{
                        list(f);
                  }
            }
      }
      //递归循环,删除所有文件
      public static void delList(File dirFile){
            File[] farray=dirFile.listFiles();
            for(File f: farray){
                  if(f.isFile()){
                        f.delete();

                  }else{
                        delList(f);
                  }
            }
            dirFile.delete();
      }

}

你可能感兴趣的:(I/O流操作)