IO流入门

目录

一、I/O的基础知识

1.流

2.字节流和字符流

(1)字节类流

(2)字符类流

3.预定义流

二、读取控制台输入

1.读取字符

2.读取字符串

三、向控制台写输出

1.PrintWriter类

四、读/写文件

五、自动关闭流


一、I/O的基础知识

1.流

Java程序通过流执行I/O,流是一种抽象,要么产生信息,要么使用信息。流通过Java的I/O系统链接到物理设备。所有流的行为方式都是相同的,尽管与它们链段的物理设备是不同的。因此,可以为任意类型的设备应用相同的I/O流和方法。这意味着可以将许多不同类型的输入-磁盘文件、键盘或网络socket抽象为输入流。与之对应,输出流可以引用控制台、磁盘文件或网络连接。

2.字节流和字符流

字节流为处理字节的输入和输出提供了方法。

字符流为处理字符的输入和输出提供了方法。

在最底层,所有I/O仍然是面向字节的。在某些情况下,字符流比字节流更高效。


(1)字节类流

顶级是两个抽象类InputSream和OutputStream。

其中最重要的两个方法是read()和write()

(2)字符类流

顶级是两个抽象类Reader和Writer。

其中最重要的两个方法是read()和write()

3.预定义流

System.out引用标准的输出流,默认情况下是控制台。

System.in引用标准的输入流,默认情况下是键盘。

System.err引用标准的错误流,默认情况下也是控制台。

System.in是InputStream类型的对象;System.out和System.err是PrintStream类型的对象    

二、读取控制台输入

为了获得与控制台关联的基于字符的流,可以在BufferedReader对象中封装System.in。

BufferedReader(Reader inputReader)

Reader是抽象类,InputStreamReader是它的个具体子类,该类将字节转换为字符。

InputStreamReader(InputStream inputStream)

1.读取字符

read();

2.读取字符串

readLine();

代码演示:

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("please input...");
        //读取字符
  /*      char ch;
        do {
            ch = (char) br.read();
            System.out.println(ch);
        } while (ch != 'q');*/
        //读取字符串
        String s;
        do {
            s = br.readLine();
            System.out.println(s);
        } while (!s.equals("end"));
    }
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("please input...(Enter 'end' is to quit");
        String[] str=new String[100];
        for(int i=0;i<100;i++){
            str[i]=br.readLine();
            if(str[i].equals("end")){
                break;
            }
        }
        for(int i=0;i<100;i++){
            if(str[i].equals("end")){
                break;
            }
            System.out.println(str[i]);
        }
    }

三、向控制台写输出

1.PrintWriter类

对于实际的程序,使用Java向控制台输出的推荐方法是通过PrintWriter流。可以使程序国际化更容易。

构造方法:

PrintWriter(OutputStream ops,boolean flushingOn)

flushingOn控制Java是否在每次调用println()方法时刷新输出流。True为自动刷新。

printWriter支持print()和println()方法。

   public static void main(String[] args) {
        PrintStream ps=new PrintStream(System.out,true);
        ps.println("hello");
        int i=1;
        ps.println(i);
        ps.println(true);
    }

四、读/写文件

对于读/写文件,两个最常用的流是FileInputStream和FileOutputStream,这两个类创建与文件链接的字节流。

FileInputStream(String fileName)

当创建输入流时,如果文件不存在,就会抛出FileNotFoundException异常。对于输出流,如果不能打开文件或不能创建文件,也会抛出FileNotFoundException异常。

文件使用完之后必须关闭,使用close()方法完成的。

    public static void main(String[] args) {
        FileInputStream fis= null;
        try {
            fis = new FileInputStream(new File("F:/黑马程序员/资源/阅读记录.txt"));
            int len=0;
            byte[] bys=new byte[1024];
            while((len=fis.read(bys))!=-1){
                System.out.println(new String(bys,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(fis!=null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }

五、自动关闭流

JDK7增加了一个新特性,该特性提供了另外一种管理资源(例如文件流)的方式,这种方式能自动关闭文件。
一般形式为:
        try(resource-specification){
            //use the resource
        }
resource-specification是用来声明和初始化资源的文件。该语句包含一个变量声明,在该声明中使用将被
管理的对象引用初始化变量。当try代码块结束时,自动释放资源。
只有对于实现了AutoCloseable接口的资源,才能使用带资源的try语句。java.io包中的所有流都实现了此接口。
注意:
        1.try语句中声明的资源被隐式声明为final;
        2.如果要在try语句中管理多个资源,在每个资源之间使用分号分割即可。

    public static void main(String[] args) {
        try (FileInputStream fs = new FileInputStream("F:/黑马程序员/资源/阅读记录.txt");
             FileOutputStream fo = new FileOutputStream("F:/黑马程序员/资源/阅读记录copy版本.txt")) {
            byte[] bys = new byte[1024];
            int len = 0;
            while ((len = fs.read(bys)) != -1) {
                fo.write(bys, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


猜你喜欢

转载自blog.csdn.net/fy_java1995/article/details/81429801