您当前的位置:首页 > 计算机 > 编程开发 > Java

Java IO 类

时间:12-14来源:作者:点击数:

IO 基础

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

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

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

字节流

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

功能
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();
            }
        }
    }
}

文件的输入输出

文件处理最常用的两个流是 FileInputStream 和 FileOutputStream

// 对于 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");
    }
}
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐