在 Java 中,IO(输入输出)操作是程序与外界交互的主要手段。无论是从文件中读取数据,还是将数据写入文件,或者是通过网络进行通信,IO 都在其中扮演着至关重要的角色。
一、Java IO 基础概念
在 Java 中,IO 操作主要分为两大类:
字节流(Byte Stream):以字节为单位处理数据,适合处理所有类型的I/O,如图片、视频等。
字符流(Character Stream):以字符为单位处理数据,适合处理文本数据。
类别 | 字节流 | 字符流 |
处理单位 | 字节(byte) | 字符(char) |
适用场景 | 任何类型的数据(包括文本、图片等) | 仅适用于文本数据 |
基类 | InputStream / OutputStream | Reader / Writer |
性能差异 | 处理速度较快,支持所有文件类型 | 对文本文件处理更高效 |
示例类 | FileInputStream, FileOutputStream | FileReader, FileWriter |
二、字节流操作详解
1、字节输入流:读取文件的原始字节
字节输入流的核心类是 InputStream,它的子类 FileInputStream 可以用来读取文件中的字节数据。下面是一个简单的字节输入流示例:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
public class ByteInputStreamExample {
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
FileInputStream fis = new FileInputStream("文件路径");
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
// 读取单个字节
int data;
try {
while((data= isr.read())!=-1) {
System.out.print((char) data);
}
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead= fis.read(buffer))!=-1) {
for(int i =0;i<bytesRead;i++) {
System.out.println((char) buffer[i]);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、字节输出流:将数据写入文件
字节输出流的核心类是 OutputStream,它的子类 FileOutputStream 用于将数据以字节的形式写入文件。下面是一个字节输出流的示例:
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteOutputStreamExample {
public static void main(String[] args) {
try(FileOutputStream fos = new FileOutputStream("文件路径")){
String data = "喝中国劲酒,揍亲朋好友";
byte[] bytes = data.getBytes();
fos.write(bytes);
System.out.println("成功写入");
}catch(IOException e) {
e.printStackTrace();
}
}
}
三、字符流操作详解
1、字符输入流:读取文本文件的字符
字符输入流的核心类是 Reader,它的子类 FileReader 用来读取文本文件的字符。与字节流不同,字符流会自动根据平台的默认编码格式转换字符。
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class CharacterInputExample {
public static void main(String[] arg) throws FileNotFoundException {
FileReader reader = new FileReader("文件路径");
int data ;
try {
while((data=reader.read())!=-1) {
System.out.println((char) data);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、字符输出流:将字符写入文本文件
字符输出流的核心类是 Writer,它的子类 FileWriter 用于将字符写入文件。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class CharactorOutputExample {
public static void main(String[] args) {
try(FileWriter writer = new FileWriter("文件路径")) {
writer.write("喝中国劲酒\n");
writer.write("揍亲朋好友\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try(BufferedWriter bw = new BufferedWriter(new FileWriter("文件路径"))){
bw.append("喝泸州老窖");
bw.newLine();
bw.append("当北京老炮");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
FileWriter writer = new FileWriter("文件路径");
writer.write("喝泸州老窖");
writer.write("当北京老炮");
// 没有关闭输出流会导致数据写不进去
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、Writer的五种写入的方法
1.write(int c)
功能:写入单个字符。
参数:c 是要写入的字符(以 int 形式表示,低 16 位有效)。
2.write(char[] cbuf)
功能:写入字符数组中的所有字符
参数:cbuf 是要写入的字符数组。
3.write(char[] cbuf, int off, int len)
功能:写入字符数组的一部分。
参数:
- cbuf:字符数组。
- off:起始偏移量(从数组的哪个位置开始写入)。
- len:要写入的字符数。
4.write(String str)
功能:写入字符串。
参数:str 是要写入的字符串。
5.write(String str, int off, int len)
功能:写入字符串的一部分。
参数:
- str:字符串。
- off:起始偏移量(从字符串的哪个位置开始写入)。
- len:要写入的字符数
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterExample {
public static void main(String[] args) {
try {
Writer writer = new FileWriter("文件路径");
//1、写入单个字符
writer.write('H');
// 2、写入字符数组
char[] array= {'e','l','l','o'};
writer.write(array);
// 3、写入字符数组的一部分
writer.write(array,1,2);
// 4、写入字符串
writer.write(",李焕英");
// 5、写入字符串的一部分
String str = "\n新的一行";
writer.write(str,0,str.length());
System.out.println("数据已写入文件");
writer.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}
四、文件复制
文件复制是 Java IO 中常见的操作
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) throws IOException {
try(FileInputStream fis = new FileInputStream("复制的文件路径");
FileOutputStream fos = new FileOutputStream("写入的文件路径")
){
byte[] bytes = new byte[1024];
int byteRead;
while((byteRead = fis.read(bytes))!=-1) {
fos.write(bytes,0,byteRead);
}
}catch (IOException e) {
e.printStackTrace();
}
}
}