Java IO 类

发布于 2024-08-01 23:02:00 字数 7733 浏览 9 评论 0

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");
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文