Java提供了多种用于输入输出的类和方法,主要包括字节流(InputStream 和 OutputStream)和字符流(Reader 和 Writer)。这些流类可以用于处理文件、网络、控制台等I/O操作。
字节流
字节流用于处理原始数据,例如图片、音频、视频等。Java中基本的字节流类是 InputStream 和 OutputStream。
示例:读取文件内容到字节数组
java复制代码
|
import java.io.*; |
|
|
|
public class ByteStreamExample { |
|
public static void main(String[] args) { |
|
File file = new File("example.txt"); |
|
try (InputStream is = new FileInputStream(file)) { |
|
// 创建一个足够大的字节数组来存储文件内容 |
|
byte[] buffer = new byte[(int) file.length()]; |
|
// 读取文件内容到字节数组 |
|
int bytesRead = is.read(buffer); |
|
if (bytesRead == -1) { |
|
System.out.println("文件为空或读取失败"); |
|
} else { |
|
// 处理字节数组,例如将其转换为字符串 |
|
String content = new String(buffer, 0, bytesRead); |
|
System.out.println(content); |
|
} |
|
} catch (IOException e) { |
|
e.printStackTrace(); |
|
} |
|
} |
|
} |
字符流
字符流用于处理文本数据,它们使用字符而不是字节。Java中基本的字符流类是 Reader 和 Writer。
示例:读取文件内容到字符串
java复制代码
|
import java.io.*; |
|
|
|
public class CharacterStreamExample { |
|
public static void main(String[] args) { |
|
File file = new File("example.txt"); |
|
try (Reader reader = new FileReader(file)) { |
|
// 使用BufferedReader提高读取效率 |
|
try (BufferedReader br = new BufferedReader(reader)) { |
|
String line; |
|
StringBuilder contentBuilder = new StringBuilder(); |
|
// 按行读取文件内容 |
|
while ((line = br.readLine()) != null) { |
|
contentBuilder.append(line).append(System.lineSeparator()); |
|
} |
|
// 获取文件内容字符串 |
|
String content = contentBuilder.toString(); |
|
System.out.println(content); |
|
} |
|
} catch (IOException e) { |
|
e.printStackTrace(); |
|
} |
|
} |
|
} |
控制台输入输出
Java还提供了用于控制台输入输出的类:Scanner 用于读取用户输入,System.out.print、System.out.println 和 System.err.print、System.err.println 用于输出到控制台。
示例:从控制台读取输入
java复制代码
|
import java.util.Scanner; |
|
|
|
public class ConsoleIOExample { |
|
public static void main(String[] args) { |
|
Scanner scanner = new Scanner(System.in); |
|
System.out.print("请输入一个数字: "); |
|
int number = scanner.nextInt(); |
|
System.out.println("你输入的数字是: " + number); |
|
scanner.close(); |
|
} |
|
} |
缓冲流
为了提高I/O操作的效率,Java还提供了缓冲流类,如 BufferedInputStream、BufferedOutputStream、BufferedReader 和 BufferedWriter。这些缓冲流在内部维护了一个缓冲区,可以一次性读取或写入多个字节或字符,减少了与底层I/O设备的交互次数。
对象序列化
Java还提供了对象序列化和反序列化的机制,通过 ObjectOutputStream 和 ObjectInputStream 类,可以将对象的状态写入字节流或从字节流中恢复对象的状态。这通常用于将对象的状态持久化到文件中,或者在网络传输中发送和接收对象。
在使用Java进行输入输出操作时,需要注意异常处理,因为I/O操作可能会因为各种原因(如文件不存在、网络中断等)而失败,抛出 IOException 或其子类异常。通常使用try-catch块来捕获和处理这些异常。