Java输入输出流(1)
1.什么是IO
Java中I/O操作主要是指使用Java进行输入,输出操作. Java全部的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。不论什么Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。
Java.io是大多数面向数据流的输入/输出类的主要软件包。此外,Java也对块传输提供支持。在核心库 java.nio中採用的便是块IO。
流IO的优点是简单易用。缺点是效率较低。块IO效率非常高,但编程比較复杂。
Java IO模型 :
Java的IO模型设计很优秀,它使用Decorator模式,按功能划分Stream,您能够动态装配这些Stream。以便获得您须要的功能。比如。您须要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。
数据流是一串连续不断的数据的集合。就象水管里的水流。在水管的一端一点一点地供水。而在水管的还有一端看到的是一股连续不断的水流。
数据写入程序能够是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说。看不到数据流在写入时的分段情况。每次能够读取当中的随意长度的数据,但仅仅能先读取前面的数据后,再读取后面的数据。无论写入时是将数据分多次写入,还是作为一个总体一次写入。读取时的效果都是全然一样的。
“流是磁盘或其他外围设备中存储的数据的源点或终点。
”
在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比方电脑上的硬盘。磁盘,U盘等都是外存,在电脑上有内存条。缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,可是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们能够简单的理解为容器。即外存是一个容器,内存又是另外一个容器。
那又如何把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?
在Java类库中,IO部分的内容是非常庞大的。由于它涉及的领域非常广泛:
标准输入输出,文件的操作,网络上的数据流。字符串流,对象流,zip文件流等等。java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。
流是一个非常形象的概念,当程序须要读取数据的时候,就会开启一个通向数据源的流,这个数据源能够是文件。内存,或是网络连接。
类似的,当程序须要写入数据的时候。就会开启一个通向目的地的流。
总结的基本概念例如以下:
1) 数据流:
一组有序。有起点和终点的字节的数据序列。包含输入流和输出流。
2) 输入流(Input Stream):
程序从输入流读取数据源。数据源包含外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道
3) 输出流:
採用数据流的目的就是使得输出输入独立于设备。
Input Stream不关心数据源来自何种设备(键盘,文件,网络)
Output Stream不关心数据的目的是何种设备(键盘,文件,网络)
4 数据流分类:
1) 字节流:数据流中最小的数据单元是字节
2) 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。
Java程序可通过命令行參数与外界进行简短的信息交换。同一时候,也规定了与标准输入、输出设备,如键盘、显示器进行信息交换的方式。而通过文件能够与外界进行随意数据形式的信息交换。
1. 命令行參数
- public class TestArgs {
- public static void main(String[] args) {
- for (int i = 0; i < args.length; i++) {
- System.out.println("args[" + i + "] is <" + args[i] + ">");
- }
- }
- }
执行命令:java Java C VB
执行结果:
args[0] is <Java>
args[1] is <C>
args[2] is <VB>
2. 标准输入。输出数据流
java系统自带的标准数据流:java.lang.System:
- java.lang.System
- public final class System extends Object{
- static PrintStream err;//标准错误流(输出)
- static InputStream in;//标准输入(键盘输入流)
- static PrintStream out;//标准输出流(显示器输出流)
- }
注意:
(1)System类不能创建对象,仅仅能直接使用它的三个静态成员。
(2)每当main方法被运行时,就自己主动生成上述三个对象。
1) 标准输出流 System.out
System.out向标准输出设备输出数据,其数据类型为PrintStream。方法:
2)标准输入流 System.in
System.in读取标准输入设备数据(从标准输入获取数据,通常是键盘),其数 据类型为InputStream。方法:
- import java.io.*;
- public class StandardInputOutput {
- public static void main(String args[]) {
- int b;
- try {
- System.out.println("please Input:");
- while ((b = System.in.read()) != -1) {
- System.out.print((char) b);
- }
- } catch (IOException e) {
- System.out.println(e.toString());
- }
- }
- }
3)标准错误流
System.err输出标准错误。其数据类型为PrintStream。
可查阅API获得具体说明。
标准输出通过System.out调用println方法输出參数并换行。而print方法输出參数但不换行。println或print方法都通 过重载实现了输出基本数据类型的多个方法,包含输出參数类型为boolean、char、int、long、float和double。同一时候。也重载实现 了输出參数类型为char[]、String和Object的方法。
当中。print(Object)和println(Object)方法在执行时将调 用參数Object的toString方法。
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class StandardInputOutput {
- public static void main(String args[]) {
- String s;
- // 创建缓冲区阅读器从键盘逐行读入数据
- InputStreamReader ir = new InputStreamReader(System.in);
- BufferedReader in = new BufferedReader(ir);
- System.out.println("Unix系统: ctrl-d 或 ctrl-c 退出"
- + "\nWindows系统: ctrl-z 退出");
- try {
- // 读一行数据。并标准输出至显示器
- s = in.readLine();
- // readLine()方法执行时若发生I/O错误,将抛出IOException异常
- while (s != null) {
- System.out.println("Read: " + s);
- s = in.readLine();
- }
- // 关闭缓冲阅读器
- in.close();
- } catch (IOException e) { // Catch any IO exceptions.
- e.printStackTrace();
- }
- }
- }
在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了
Java I/O主要包括例如以下几个层次,包括三个部分:
1.流式部分――IO的主体部分;
2.非流式部分――主要包括一些辅助流式部分的类。如:File类、RandomAccessFile类和FileDescriptor等类;
3.其它类--文件读取部分的与安全相关的类。如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。
基本的类例如以下:
1. File(文件特征与管理):用于文件或者文件夹的描写叙述信息,比如生成新文件夹,改动文件名称,删除文件,推断文件所在路径等。
2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是全部输入流的父类。
定义了全部输入流都具有的共同特征。
3. OutputStream(二进制格式操作):抽象类。
基于字节的输出操作。是全部输出流的父类。定义了全部输出流都具有的共同特征。
Java中字符是採用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。
为此。JAVA中引入了处理字符的流。
4. Reader(文件格式操作):抽象类,基于字符的输入操作。
5. Writer(文件格式操作):抽象类。基于字符的输出操作。
6. RandomAccessFile(随机文件操作):它的功能丰富,能够从文件的任何位置进行存取(输入输出)操作。
Java中IO流的体系结构如图:
- public class File extends Object
- implements Serializable,Comparable
- {}
1)File (String pathname)
2)File (String parent , String child)
3)File (File parent , String child)
例:File f4=new File("\\dir3");
File f5=new File(f4,"FileTest5.txt"); //在假设 \\dir3文件夹不存在使用f4.mkdir()先创建
2)public boolean isFile( ) 推断是文件还是文件夹
3)public boolean isDirectory( ) 推断是文件还是文件夹
4)public String getName( ) 返回文件名称或文件夹名
5)public String getPath( ) 返回文件或文件夹的路径。
6)public long length( ) 获取文件的长度
7)public String[ ] list ( ) 将文件夹中全部文件名称保存在字符串数组中返回。
1) public boolean renameTo( File newFile ); 重命名文件
2) public void delete( ); 删除文件
3) public boolean mkdir( ); 创建文件夹
- import java.io.File;
- import java.io.IOException;
- public class TestFile {
- public static void main(String args[]) throws IOException {
- File dir = new File("\\root");
- File f1 = new File(dir, "fileOne.txt");
- File f2 = new File(dir, "fileTwo.java");
- // 文件对象创建后,指定的文件或文件夹不一定物理上存在
- if (!dir.exists())
- dir.mkdir();
- if (!f1.exists())
- f1.createNewFile();
- if (!f2.exists())
- f2.createNewFile();
- System.out.println("f1's AbsolutePath= " + f1.getAbsolutePath());
- System.out.println("f1 Canread=" + f1.canRead());
- System.out.println("f1's len= " + f1.length());
- String[] FL;
- int count = 0;
- FL = dir.list();
- for (int i = 0; i < FL.length; i++) {
- count++;
- System.out.println(FL[i] + "is in \\root");
- }
- System.out.println("there are" + count + "file in //root");
- }
- }
说明:File类的方法:
(1) exists()測试磁盘中指定的文件或文件夹是否存在
(2) mkdir()创建文件对象指定的文件夹(单层文件夹)
(3) createNewFile()创建文件对象指定的文件
(4) list()返回文件夹中全部文件名称字符串