Java-IO

    科技2022-07-10  104

    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,其类型是InputStreamStandard Output:用以输出用户程序产生的数据,通常控制台屏幕作为标准输出流,表示为 System.out,其类型是PrintStreamStandard 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"); } }
    Processed: 0.015, SQL: 8