Java 中的 I/O

 I/O 指的是 input 和 output ,也就是输入和输出,我们说的是 Java 中的 I/O,那我们就在站在虚拟机的角度去看看有哪些输入和输出。输入又可以称为数据源端,能想到的会有,文件,网络,控制台手动输入。而输出又可以称为数据接收端,能想到依旧还是那几个,输出到文件,网络,控制台。

 

那好,目前只是理清楚了数据从哪里来到哪里去,然而,我们的数据交互肯定不是这么的简单,我们还需要考虑数据传输的多种方式,我是以字符传输还是字节传输,或是二进制传输,要不要缓冲存取,等等问题。这样一来,想要表示出数据的传输可想而知肯定会需要很多对象。

 

为了解决上述存在的多种多样的数据端和数据交互方式,Java 设计者们以避免设计过多的类为初衷(其实类并不少...)设计了 I/O 体系。

 

先来放整体图,这个图简易却不简单,今天我也只是说其中的一小部分东西,好多的实现类都没有拿出来单独说。

 

复制代码

 public static void main(String args[]) {         String dirname = ".";         File f1 = new File(dirname); //当前项目工作目录        if (f1.isDirectory()) {             System.out.println("Directory of " + dirname);             String s[] = f1.list();             for (int i = 0; i < s.length; i++) {                 File f = new File(dirname + "/" + s[i]);                 if (f.isDirectory()) {                     System.out.println(s[i] + " is a directory");                 } else {                     System.out.println(s[i] + " is a file");                 }             }         } else {             System.out.println(dirname + " is not a directory");         }     }
复制代码

 

那我想要向文件中读取或是写入内容怎么办呢 ?那就需要借助输入输出流来完成了。

 

首先说一下流的概念,流代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。划重点,流代表的是对象。这个对象有发送或接收数据的能力。所以说流的本质也就是将数据源(数据源端,数据接受端)和数据的传输方式(字符,字节,二进制等)抽象成类的结果。作用就是为了传输数据。

 

在 I/O 体系中,因为需要的流有太多,Java 设计者又避免设计过多的类,所以最终采用装饰者模式来对整个流结构进行设计,按功能划分 Stream,还可以动态装配这些 Stream,以便获得需要的流。假如你想要获得一个具有缓冲的文件输入字节流,这样即可。

 

复制代码
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream;  public class IOTest3 {      public static void main(String[] args) throws Exception {         InputStream fis = new FileInputStream("test.txt");         BufferedInputStream bis = new BufferedInputStream(fis);     } }
复制代码

 

流分类:

  1. 字节流。InputStream 是所有字节输入流的基类,而 OutputStream 是所有字节输出流的基类。

  2. 字符流。Reader 是所有读取字符串输入流的基类,而 Writer 是所有输出字符串的基类。

另外 InputStream,OutputStream,Reader,Writer 都是抽象类。

 

字节流是最基本的,所有的 InputStream 和 OutputStream 的子类都是字节流,主要用来处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,所以又提出了字符流的概念,它是按虚拟机的 Encode 来处理,也就是要按照字符集将字节转化为字符。Java 中默认的编码是 Unicode 编码。

 

字节流和字符流通过 InputStreamReader,OutputStreamWriter 来关联,实际上是通过 byte[ ] 和 String 来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。在从字节流转化为字符流时,实际上就是 byte[ ] 转化为 String

 

复制代码
byte[] bytes = new byte[10]; String charsetName = "UTF-8" String s1 = new String(bytes, charsetName);
复制代码

 

有一个关键的参数字符集编码,通常我们都省略了,而在字符流转化为字节流时,实际上是 String 转化为 byte[ ]

 

复制代码
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信