I/O 流在 Java 中分为两种主要类型:字节流和字符流。每种类型又分为输入流和输出流。这些流的组合提供了处理不同类型数据的灵活性。
字节流(Byte Streams):
-
输入字节流:
InputStream
:抽象类,为所有输入字节流的父类。FileInputStream
:从文件读取字节。ByteArrayInputStream
:从字节数组读取字节。DataInputStream
:处理基本数据类型的输入。
-
输出字节流:
OutputStream
:抽象类,为所有输出字节流的父类。FileOutputStream
:向文件写入字节。ByteArrayOutputStream
:向字节数组写入字节。DataOutputStream
:处理基本数据类型的输出。
字符流(Character Streams):
-
输入字符流:
Reader
:抽象类,为所有输入字符流的父类。FileReader
:从文件读取字符。CharArrayReader
:从字符数组读取字符。StringReader
:从字符串读取字符。
-
输出字符流:
Writer
:抽象类,为所有输出字符流的父类。FileWriter
:向文件写入字符。CharArrayWriter
:向字符数组写入字符。StringWriter
:向字符串写入字符。- FileOutputStream
try catch 和throws都可处理ioexception异常 package io; import java.io.FileOutputStream; import java.io.IOException; public class IoDay1 { public static void main(String[] args) throws IOException{ /* // 使用 try-with-resources 语句,确保文件流在结束时自动关闭 try (FileOutputStream fos = new FileOutputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\a.txt")) { // 将字节 94 写入文件 fos.write(97); fos.close(); } catch (IOException e) { // 处理可能出现的 IOException 异常 e.printStackTrace(); } */ FileOutputStream fos = new FileOutputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\a.txt"); fos.write(99); fos.close(); } }
字节输出流写出数据三种方式以及换行和续写
package io; import java.io.FileOutputStream; import java.io.IOException; //字节输出流写出数据三种方式 public class IoDay2 { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\d"); fos.write(95);//第一种 byte[] bytes = {97,98,99}; fos.write(bytes);//第二种 byte[] data = "Hello, World!".getBytes(); fos.write(data, 0, 5);//第三种 } } //续写 FileOutputStream fos = new FileOutputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\d",true);//默认不续写,+true可续写 //换行 String wrap = "\r\n"; byte[] data = wrap.getBytes(); fos.write(data);
字节输入流读取字节和循环读取
package io; import java.io.FileInputStream; import java.io.IOException; public class IoDay3fileinput { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub FileInputStream fos = new FileInputStream("F:\\\\eclipse-java-2020-06-R-win32-x86_64\\\\demo\\\\io\\\\d"); int b = fos.read(); System.out.println(b);//一次读一个字节,读出来为ASCLL上对应数字,可强转,读到末尾返回-1 System.out.println((char)b);//强转 //循环读取 int c; while((c = fos.read())!=-1) { System.out.println((char)c); } fos.close(); } }
文件拷贝:(单字节边读边写,慢)
-
package io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class IoCopy { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //创建对象 FileInputStream fos = new FileInputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\d"); FileOutputStream fis = new FileOutputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\java"); //拷贝 int b; while((b=fos.read())!=-1) { fis.write(b); } fos.close(); fis.close(); } }
文件拷贝优化,利用数组
-
package io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class IoCopy2 { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //利用数组进行读取,读取长度和数组长度有关 FileInputStream fis = new FileInputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\d"); byte[] b = new byte[2]; fis.read(b);//将数据存储入数组中 System.out.println(fis.read(b)); String str = new String(b); System.out.println(str); fis.close(); } } //练习 FileInputStream fis = new FileInputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\d"); FileOutputStream fos = new FileOutputStream("F:\\eclipse-java-2020-06-R-win32-x86_64\\demo\\io\\java"); byte[] b = new byte[1024*1024*5];//利用数组存入5m fis.read(b);//将数据存储入数组中 int len; while((len=fis.read(b))!=-1) { fos.write(b, 0, len); } System.out.println(fis.read(b)); String str = new String(b); System.out.println(str); fis.close(); } }