JAVA io - zhongjiajie/zhongjiajie.github.com GitHub Wiki

Java-IO

io基础

Java IO 是一套Java用来读写数据(输入和输出)的API.主要涉及文件,网络数据流,内存缓冲等的输入输出.Java IO中的一个核心概念是(Stream),从外部(包括磁盘文件、键盘、网络套接字)读入到内存中的数据序列称为输入流,从内存写入到外部设备的数据序列称为输出流.在最底层,所有的输入/输出都是字节形式的.基于字符的流只为处理字符提供方便有效的方法

流中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据.因此Java中的流分为两种:

  • 字节流:数据流中最小的数据单元是字节,多用于读取或书写二进制数据
  • 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节

字节流

字节流的最顶层是两个抽象类:InputStreamOutputStream其他关于处理字节的类都是它们的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区.

功能
BufferedInputStream 缓冲输入流
BufferedOutputStream 缓冲输出流
ByteArrayInputStream 从字节数组读取的输入流
ByteArrayOutputStream 向字节数组写入的输出流
FileInputStream 读取文件的输入流
FileOutputStream 写文件的输出流
PrintStream 包含print() 和 println()方法的输出流
InputStream 描述输入流的抽象类
OutputStream 描述输出流的抽象类

抽象类InputStream 和 OutputStream中定义两个关键的抽象方法read()write()

import java.io.*;

public class CopyFileByte {
   public static void main(String args[]) throws IOException
   {
      FileInputStream in = null;
      FileOutputStream out = null;
      try {
         in = new FileInputStream("input.txt");
         out = new FileOutputStream("output.txt");
         int c;
         while ((c = in.read()) != -1) { // 返回-1 表示达到文件结尾
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}
// 字节流的每次操作都是一个数据单位——字节.假如input.txt文件中包含“Hello world”,那么它将复制完'H'之后,再复制'e',接下来复制'l',直到其结束.in.read()每次从输入流中读取一个字节,如果达到文件末尾就返回-1.注意使用完输入输出流,一定调用close()方法将其关闭

字符流

Java 字符流用于处理16位 unicode 的输入和输出.字符流的两个顶层抽象类是Reader和Writer,分别定义了关键方法read()write(),表示对字符的读写.

功能
BufferedReader 缓冲输入字符流
BufferedWriter 缓冲输出字符流
CharArrayReader 从字节数组读取的字符输入流
CharArrayWriter 向字节数组写入的字符输出流
FileReader 读取文件的字符输入流
FileWriter 写文件的字符输出流
Reader 描述字符输入流的抽象类
Writer 描述字符输出流的抽象类
import java.io.*;

public class CopyFileCharacter {
   public static void main(String args[]) throws IOException
   {
      FileReader in = null;
      FileWriter out = null;
      try {
         in = new FileReader("input.txt");
         out = new FileWriter("output.txt");

         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      } finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

这里使用的FileReader和FileWriter,它们操作的最小单位是一个字符16 bits,而FileInputStream和FileOutputStream最小单位则是一个字节8 bits.

标准流

所有的编程语言都提供了对标准 I/O 流的支持,即用户可以从键盘上进行输入,并且从控制台屏幕上输出.Java提供了以下的三种标准流:

  • Standard Input: 用以将数据输入给用户的程序,通常键盘作为标准输入流,表示为System.in,其类型是InputStream
  • Standard Output:用以输出用户程序产生的数据,通常控制台屏幕作为标准输出流,表示为 System.out,其类型是PrintStream
  • Standard Error: 这是用来输出用户产生的错误数据,通常控制台屏幕作为标准错误流,表示为 System.err,类型和System.out相同是PrintStream
import java.io.*;

class ConsoleInOut {
    public static void main(String args[]) throws IOException {
        InputStreamReader isr = null;
        try {
            isr = new InputStreamReader(System.in);
            System.out.println("Enter characters, 'q' to quit.");
            char c;
            do {
                // read()方法从控制台读入单个字符 读入字符串readLine()
                c = (char) isr.read();
                System.out.println(c);
            } while (c != 'q');
        } finally {
            if (isr != null) {
                isr.close();
            }
        }
    }
}

文件的输入输出

文件处理最常用的两个流是FileInputStreamFileOutputStream

// 对于FileInputStream,可以以文件名的字符串为参数来创建一个输入流对象去读文件
InputStream f = new FileInputStream("D:/java");
// 也可以以一个文件对象作为参数来去创建一个输入流对象去读文件,首先我们需要创建一个File文件对象
File f = new File("D:/java");
InputStream f = new FileInputStream(f);

import java.io.*;

public class fileStreamTest {

    public static void main(String args[]) {
        try {
            byte bWrite[] = {10, 20, 30, 40, 50};
            OutputStream os = new FileOutputStream("test.txt");
            for (int x = 0; x < bWrite.length; x++) {
                os.write(bWrite[x]); // writes the bytes
            }
            os.close();

            InputStream is = new FileInputStream("test.txt");
            int size = is.available();

            for (int i = 0; i < size; i++) {
                System.out.print((char) is.read() + "  ");
            }
            is.close();
        } catch (IOException e) {
            System.out.print("IOException");
        }
    }
}

相关API

File

import java.io.File;

File file = new File("input.txt"); //文件位于当前目录下
File file = new File("/home/user", "input.txt"); //文件位于/home/user目录下

file的方法主要有

方法 功能
exists() 判断文件或目录是否存在
mkdir() 创建目录
mkdirs() 创建目录以及上级目录
isFile() 判断是否为文件
isDirectory() 判断是否为目录
delete() 删除文件
getPath() 获取文件或者目录的路径
list() 将目录中所有文件名保存在字符串数组中返回
canRead() 判断文件是否可读
create() 创建文件
createNewFile() 创建文件
getAbsolutePath() 获取文件绝对路径
length() 文件的长度
import java.io.*;

public class TestAbstract {
    public static void main(String args[]) throws IOException {
        File dir = new File("D:/java");
        File file1 = new File(dir, "fileTest001.txt");
        File file2 = new File(dir, "fileTest002.java");

        if (!dir.exists())
            dir.mkdir();
        if (!file1.exists())
            file1.createNewFile();
        if (!file2.exists())
            file2.createNewFile();

        System.out.println("file1's AbsolutePath=  " + file1.getAbsolutePath());
        System.out.println("file2's AbsolutePath=  " + file2.getAbsolutePath());

        System.out.println("file1 Canread=" + file1.canRead());
        System.out.println("file1's len= " + file1.length());

        String[] fileList = dir.list();
        System.out.println("there are " + fileList.length + " file(s) in D:/java");
    }

}
⚠️ **GitHub.com Fallback** ⚠️