Java——(九)IO流

一、流的分类

输入流和输出流

  按照流的流向来分,可以分为输入流和输出流

  • 输入流:只能从中读取数据,而不能向其写入数据。
  • 输出流:只能向其写入数据,而不能从中读取数据。

  此处的输入、输出涉及一个方向的问题,数据从内存到硬盘,通常称为输出流。(即这里的

输入、输出都是从程序运行所在内存的角度来划分的)。Java的输入流主要由InputStream和

Reader作为基类,而输出流则要由OutputStream和Writer作为基类。它们都是一些抽象基类

,无法直接创建实例。

字节流和字符流

  字节流和字符流的用法几乎一样,只是它们所操作的数据单元不同,字节流操作的数据单元

是8位,而字符流操作的数据单元是16位。字节流要由InputStream和OutputStream作为基类

,而字符流则要由Reader和Writer作为基类。

节点流和处理流

  按照流的角色来分,可以分为节点流和处理流。

  可以从向一个特定的IO设备读/写数据的流称为节点流,节点流也被称为低级流。当使用节点

流进行输入/输出时,程序直接连接到实际的数据源,和实际的输入/输出节点连接。

  处理流则用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。处

理流也被称为高级流和包装流。

  使用处理流的一个明显的好处是:只要使用相同的处理流,程序就可以采用完全相同的输入/

输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应

地发生变化。

二、流的概念模型

  • InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。

  下面程序示范了使用FileInputStream来读取自身的效果:

 1 package IO;
 2
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5
 6 public class FileInputStreamTest {
 7
 8     public static void main(String[] args) throws IOException {
 9
10         //创建字节输入流
11         FileInputStream fis = new FileInputStream("D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileInputStreamTest.java");
12
13         //创建一个长度为1024的字节数组
14         byte[] buf = new byte[1024];
15         int len = 0;
16
17         while ((len = fis.read(buf)) > 0 ) {
18             //取出buf中的字节,将字节数组转换成字符串输入
19             System.out.println(new String(buf, 0, len));
20         }
21         fis.close();
22     }
23
24 }

运行结果:

package IO;

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

public class FileInputStreamTest {

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

        //创建字节输入流
        FileInputStream fis = new FileInputStream("D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileInputStreamTest.java");

        //创建一个长度为1024的字节数组
        byte[] buf = new byte[1024];
        int len = 0;

        while ((len = fis.read(buf)) > 0 ) {
            //取出buf中的字节,将字节数组转换成字符串输入
            System.out.println(new String(buf, 0, len));
        }
        fis.close();
    }

}

  上面程序创建了一个长度为1024的字节数组来读取该文件,实际上该Java源文件的长度还不到1024

字节,也就是说,程序只需执行一次read()方法可读取全部内容。但如果创建较小长度的字节数组,程序

运行时在输出中文注释时就可能出现乱码,这是因为文件保存时采用GBK编码方式,在这种方式下,每个

中文字符占2个字节,如果read()方法读取时只读到了半个中文字符,这将导致乱码。

  Java7改写了所有的IO资源类,它们都实现了AutoCloseable接口,因此都可以通过自动关闭资源

的try语句来关闭这些IO流。下面程序使用了FileReader来读取文件本身。

 1 package IO;
 2
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5
 6 public class FileReaderTest {
 7
 8     public static void main(String[] args) {
 9
10         try (
11         // 创建字符输入流
12         FileReader fr = new FileReader(
13                 "D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileReaderTest.java")) {
14             // 创建一个长度为32的字符数组
15             char[] cbuf = new char[32];
16             int len = 0;
17
18             while ((len = fr.read(cbuf)) > 0) {
19                 System.out.println(new String(cbuf, 0, len));
20             }
21         } catch (IOException e) {
22             // TODO Auto-generated catch block
23             e.printStackTrace();
24         }
25     }
26
27 }

运行结果:

package IO;

import java.io.Fi
leReader;
import java.io.IOExce
ption;

public class FileReade
rTest {

    public static void m
ain(String[] args) {

        try (

        // 创建字符输入流
        FileReader fr =
 new FileReader(
                "D:\\Java\adt-bundle-windows-x86_64_20140
101\\project\\fsad\\src\\IO\\Fil
eReaderTest.java")) {
            // 创建一
个长度为32的字符数组
            char[] cbuf = ne
w char[32];
            int len = 0;

            while ((len = fr.read(cbuf))
> 0) {
                System.out.println(n
ew String(cbuf, 0, len));
            }

        } catch (IOException e) {

    // TODO Auto-generated catch bl
ock
            e.printStackTrace();

}
    }

}

  下面程序使用FileInputStream来执行输入,并使用FileOutputStream来执行输出。

 1 package IO;
 2
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6
 7 public class FileOutputStreamTest {
 8
 9     public static void main(String[] args) {
10
11         try {
12             // 创建字节输入流
13             FileInputStream fis = new FileInputStream(
14                     "D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileOutputStreamTest.java");
15             // 创建字节输出流
16             FileOutputStream fos = new FileOutputStream("newFile.txt");
17
18             byte[] buf = new byte[32];
19             int len = 0;
20
21             while ((len = fis.read(buf)) > 0) {
22                 fos.write(buf, 0, len);
23             }
24         } catch (IOException e) {
25
26             e.printStackTrace();
27         }
28         System.out.println("写入成功!");
29     }
30 }

运行结果:

写入成功!

  下面以获取键盘输入为例来介绍转换流。Java使用System.in代表标准输入,即键盘输入,但这个标准输

入流是InputStream类的实例,使用不太方便,而且键盘输入的内容都是文本,所以可以使用InputStreamReader

将其转换成字符输入流Reader,再将普通的Reader包装成BufferedReader,利用BufferedReader的readLine()方法

可以一次读取一行内容。程序如下:

 1 package IO;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6
 7 public class KeyinTest {
 8
 9     public static void main(String[] args) {
10
11         // 将System.in对象转换成Reader对象,再包装成BufferedReader
12         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13
14         String buffer = null;
15
16         try {
17             while ((buffer = br.readLine()) != null) {
18                 //如果读取到的字符串时“exit”,则程序退出
19                 if (buffer.equals("exit")) {
20                     System.exit(1);
21                 }
22                 System.out.println("输入的内容为:" + buffer);
23             }
24         } catch (IOException e) {
25             // TODO Auto-generated catch block
26             e.printStackTrace();
27         }
28     }
29
30 }

运行结果:

黑马程序员
输入的内容为:黑马程序员
exit

  BufferedReader流具有缓冲功能,它可以一次读取一行文本——以换行符为标志,如果没有读到

换行符则程序阻塞,等到读到换行符为止。

时间: 2024-10-29 05:04:50

Java——(九)IO流的相关文章

java的Io流学习

Java中io流的学习(一)File:https://blog.csdn.net/qq_41061437/article/details/81672859 Java中io流的学习(二)FileInputStream和FileOutputStream:https://blog.csdn.net/qq_41061437/article/details/81742175 Java中io流的学习(三)BuffereInputStream和BuffereOutputStream:https://blog.

java常用IO流数据流小结

  类名 常用方法 说明 输入流 InputStream int read(); 只能读字节流,虽然返回值是int,但只有低8位起作用. DataInputStream Type readType(); 可以读二进制流,可以读byte,short,int,long,double等二进制流. BufferedReader String readLine(); 可以读文本行. 输出流 OutputStream void write(int); 只能写字节流,虽然形参是int,但只有低8为起作用. D

【Java】IO流简单分辨

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用到的几个流类的简易区分以及体系层次整理出来,方便记忆与辨析.本人对IO了解尚浅,文章如有错漏,恳请前辈指正,感激不尽! 字节流体系: 基类:InputStream/outputStream(抽象类,不能new) 子类: 文件IO字节流:FileInputStream/FileoutputStream

JAVA中IO流总结

本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/42119261 我想你对JAVA的IO流有所了解,平时使用的也比较的多,但是对于其具体分类和继承体系可能知道的并不多,可能也很少去看相关的API文档,找出其中的关系和各自的应用情形.本文简单对常用的IO流进行分类整理,并简单举例说明其应用.希望本文对你有所帮助. (A)IO流大致分为两种: (1)字节流:对应抽象类为InputStream(输入流)和 OutputStream(输

【JAVA的 IO流之FileInputStream和FileOutputStream】

java的 IO流即输入输出流,流是一组有顺序的,有起点和终点的字节结合,是对数据传输的总称.即数据在两设备间的传输称为流,流的本质是数据传输. IO流可以分为字节流和字符流.给出相应的IO结构图: 在接下来的一段时间里,将会慢慢介绍各种流的使用,本篇博客先介绍字节流的FileOutputStream和相对应的FileInputStream. 一.FileOutputStream(文件输出流) OutputStream是一个抽象类,抽象类必须通过子类实现.现在要向文件里输出就要用FileOutp

java的IO流,字节流和字符流

java操作文件都是通过流来处理的,(其实其他很多语言也是这样) 第一:java的IO流,分为:输入流 和 输出流(这真是废话,这是从流向的角度来说的) 第二:java的所有IO流,只分为:字节流 和 字符流(其实就是传输的颗粒,传输的基本单位) 总结:凡是处理纯文本的优先考虑字符流:其他的才考虑使用字节流

Java之IO流---字节流

1.1 IO流的引入 IO流在很多语言已有体现,诸如C语言的stdio.h,C++中的iostream.Java中的IO流大抵是用于在控制台.磁盘.内存上进行数据的读写操作,完成数据的传递. 我们可以对它进行如下分类: 按处理的数据类型可分为字节流与字符流 按流的流向可分为输入流(in)与输出流(out) 按流的功能可分为节点流(Node)和过滤流(Filter) 本篇侧重于梳理字节流相关的知识,毕竟作为字符流的前辈,它还是非常重要的.下篇继续梳理字符流. 1.2 IO流的继承体系图 大概描述了

Java笔记-IO流的运用

1.InputStream和System.in(Scanner) InputStream 输出流以字节为单位来获取数据,且需要复杂的判断并创建字节数组作为缓冲 另外字节转换为字符时容易出现中文乱码的情况:Scanner Java扫描器类,可以从输入流中读取指定类型的数据或字符串. 对于字符数据的读取,应该使用Scanner扫描器进行封装,然后获取字符串类型的数据 2. out和err out和err是System类的两个static类成员变量: out:主要是输出调试信息的输出流,以黑色显示 e

Java之IO流用法总结

Java的IO流概述:1.I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等.2.Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行.3.java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据. IO流的分类:1.按操作数据单位不同分为:字节流(8 bit), 字符流(16 bit).2.按数据流的流向不同分为:输入流,输出流.3.按流的角色的不同分为:节点

Java 之IO流及应用

IO流 IO流概述及FileWriter类的使用 FileReader类使用 缓冲流介绍和使用 IO流相关案例 NO.one IO流概述及FileWriter类使用 1.1 IO流概述及分类 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流 1.2 FileWriter类使用 A:打开帮助文档 B:点击显示,找到索引,看到输入框 C:你要学习什么内容,你就在框框里面输入什么内容 举例:Random D:看包