java基础——IO
IO流
在 Java IO 中,流是一个核心的概念。流表示的是连续的数据,称之为数据流。我们既可以读取流中的数据,也可向流中写入数据。在 Java IO 中,根据读写数据的类型不同,可以将流分为两种类型:字节流(按字节读取数据),字符流(按字符读取数据)。
java.io 包提供了操作流的类,而这些类的顶层父类如下(输入和输出是相对于 JVM 来说的):
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
字节流
计算机中的文件都是以字节的形式进行存储。
字节输出流——OutputStream
以上就是 OutputStream 类的所有方法。OutputStream 只是提供了一些共用的方法,其直接子类共有六个。
FileOutputStream
该类是向磁盘文件中写入数据。以下是其构造方法和一般方法。
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { File file = new File("D:\\javaTest\\IO\\a.txt"); //创建一个输出流对象, 参数是一个File对象, 路径必须是实际存在的, 否则会报FileNotFoundException //如果路径下的文件不存在, 则会创建该文件 FileOutputStream out = new FileOutputStream(file); //调用write()方法, 向文件中写入数据, 只能以字节的方式写入 out.write(97); //写入文件的是字母 a //关闭数据流, 释放资源 out.close(); } }
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { File file = new File("D:\\javaTest\\IO\\a.txt"); //创建一个输出流对象, 参数是一个File对象, 路径必须是实际存在的, 否则会报FileNotFoundException //如果路径下的文件不存在, 则会创建该文件 FileOutputStream out = new FileOutputStream(file); //写入数据会先转换为ASII码, 然后在根据ASII码写入数据 //调用write(Byte byte)方法, 向文件中写入数据, 以单个字节的方式写入 out.write(97); //写入文件的是字母 a //调用write(Byte []byte)方法, 向文件中写入数据, 以字节数组的方式写入 //如果某个字节是负数,那该字节就会与后一个字节一起以GBK编码格式显示字符 byte[] bytes = {-47, 64, -65, -66}; out.write(bytes); //写入的是 袬烤 //如果想写入一个字符串, 可以使用String类中的getBytes(); String str = "向文件中写入字符串"; out.write(str.getBytes()); //关闭数据流, 释放资源 out.close(); } }
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { File file = new File("D:\\javaTest\\IO\\a.txt"); //通过构造函数 FileOutputStream(File file, boolean append)向文件中续写数据,不会覆盖 //append为true表示续写, 为false会创建一个新文件覆盖原文件 FileOutputStream out = new FileOutputStream(file, true); out.write("可以".getBytes()); out.write("向文件".getBytes()); out.write("中".getBytes()); out.write("\r".getBytes()); //换行 out.write("续写数据".getBytes()); //关闭数据流, 释放资源 out.close(); } }
字节输入流——InputStream
FileInputStream
import java.io.FileInputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { FileInputStream in = new FileInputStream("D:\\javaTest\\IO\\a.txt"); int len1 = 0; while((len1 = in.read()) != -1) { //read()每次只能读入一个字节, 方法调用一次指针就后移一位 System.out.println(len1); } byte[] bytes = new byte[2]; int len2 = 0; while((len2 = in.read(bytes)) != -1) { //read(byte []bytes), 每次最多读取byte数组的长度个字节 System.out.println(new String(bytes, 0, len2)); //读取byte数组中有效的字节个数,以免出现空格或数组之前的内容 } //关闭数据流, 释放资源 in.close(); } }
字符流
字符流与包括读(Reader)和写(Writer),每次读或写一个字符。使用方式和字节流一样,只需要把 InputStream 和 OutputStream 替换成 Reader 和 Writer。
字符输入流——Reader
import java.io.FileReader; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { FileReader reader = new FileReader("D:\\javaTest\\IO\\a.txt"); int len1 = 0; while((len1 = reader.read()) != -1) { //read()每次只能读入一个字节, 方法调用一次指针就后移一位 System.out.print((char)len1); } char[] c = new char[2]; int len2 = 0; while((len2 = reader.read(c)) != -1) { //read(byte []bytes), 每次最多读取byte数组的长度个字节 System.out.print(new String(c, 0, len2)); //读取byte数组中有效的字节个数,以免出现空格或数组之前的内容 } //关闭数据流, 释放资源 reader.close(); } }
字符输出流
import java.io.FileWriter; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { FileWriter writer = new FileWriter("D:\\javaTest\\IO\\a.txt", true); writer.write("字符写入文件"); writer.flush(); //写完数据必须刷新回硬盘 char[] c = {'可', '以', '通', '过', '数', '组' }; writer.write(c); writer.flush(); //关闭数据流, 释放资源 writer.close(); //flush()和close()都可以把缓冲刷新回内存, 但是flush()使用后还可以继续使用流, 而close则已经关闭了流 } }