在Java中,io流主要包括输入流和输出流两种类型。输入流用于从外部读取数据到程序中,输出流用于将程序中的数据写入到外部。
1.字节流
在Java中,字节流是以字节为单位进行数据读写的流。常见的字节流类主要包括InputStream和OutputStream及它们的子类,用于读取和写入字节数据。
1.InputStream类:InputStream是所有输入字节流的抽象父类。常用的子类包括FileInputStream用于从文件中读取字节数据,ByteArrayInputStream用于从内存中读取字节数组数据等。
// 读取文件内容并打印到控制台
try (InputStream input = new FileInputStream("input.txt")) {
int data;
while ((data = input.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
2.OutputStream类:OutputStream是所有输出字节流的抽象父类。常用的子类包括FileOutputStream用于向文件中写入字节数据,ByteArrayOutputStream用于在内存中写入字节数组数据等。
// 将字符串写入文件
String str = "Hello, Java Byte Stream!";
try (OutputStream output = new FileOutputStream("output.txt")) {
output.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
3.BufferedInputStream和BufferedOutputStream:这两个类提供了缓冲功能,可以提高读写数据的性能。在构造方法中传入一个输入流或输出流对象,可以自动创建一个缓冲区来提高读写速度。
// 使用BufferedInputStream读取文件内容
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"))) {
int data;
while ((data = bis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用BufferedOutputStream写入文件内容
String str = "Hello, Buffered OutputStream!";
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
bos.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
2.字符流
在Java中,字符流是以字符为单位进行数据读写的流。字符流主要用于文本数据的读写,以字符为单位操作比字节更方便,更适合处理文本数据。常见的字符流类包括Reader和Writer及它们的子类,用于读取和写入字符数据。
1.Reader类:Reader是所有字符输入流的抽象父类。常用的子类包括FileReader用于从文件中读取字符数据,StringReader用于从字符串中读取字符数据等。
// 读取文件内容并打印到控制台
try (Reader reader = new FileReader("input.txt")) {
int data;
while ((data = reader.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
2.Writer类:Writer是所有字符输出流的抽象父类。常用的子类包括FileWriter用于向文件中写入字符数据,StringWriter用于将字符数据写入字符串中等。
// 将字符串写入文件
String str = "Hello, Java Character Stream!";
try (Writer writer = new FileWriter("output.txt")) {
writer.write(str);
} catch (IOException e) {
e.printStackTrace();
}
3.BufferedReader和BufferedWriter:这两个类提供了缓冲功能,可以提高读写数据的性能。在构造方法中传入一个Reader或Writer对象,可以自动创建一个缓冲区来提高读写速度。
// 使用BufferedReader读取文件内容
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用BufferedWriter写入文件内容
String str = "Hello, Buffered Writer!";
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write(str);
} catch (IOException e) {
e.printStackTrace();
}
3.文件流
在Java中,文件流是指用于读写文件的流。文件流是字节流的一种,用于读取和写入文件中的字节数据。Java提供了FileInputStream和FileOutputStream类用于操作文件流,可以实现对文件的读写操作。
1.FileInputStream类:FileInputStream是用于从文件中读取字节数据的类。可以使用该类读取文件中的字节数据,并将数据写入到程序中。
// 使用FileInputStream读取文件内容并打印到控制台
try (FileInputStream fis = new FileInputStream("input.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
2.FileOutputStream类:FileOutputStream是用于向文件中写入字节数据的类。可以使用该类将程序中的字节数据写入到文件中。
// 使用FileOutputStream将字符串写入文件
String str = "Hello, Java File Stream!";
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
fos.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
4.缓冲流
在Java中,缓冲流用于提高IO性能,通过在内存中设立一个缓冲区,在读写数据时可以减少对磁盘的频繁访问,从而提高读写效率。Java提供了BufferedInputStream和BufferedOutputStream用于字节流的缓冲处理,同时也提供了BufferedReader和BufferedWriter用于字符流的缓冲处理。
1.BufferedInputStream和BufferedOutputStream:这两个类用于字节流的缓冲处理,可以提高读写文件的性能。
// 使用BufferedInputStream从文件中读取字节数据
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"))) {
int data;
while ((data = bis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用BufferedOutputStream将字节数据写入文件
String str = "Hello, Buffered Output Stream!";
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
bos.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
2.BufferedReader和BufferedWriter:这两个类用于字符流的缓冲处理,可以提高读写文本文件的性能。
// 使用BufferedReader从文件中读取文本数据
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用BufferedWriter将文本数据写入文件
String str = "Hello, Buffered Writer!";
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write(str);
} catch (IOException e) {
e.printStackTrace();
}
5.对象流
在Java中,对象流是一种高级流,可以将Java对象以二进制形式写入到文件或从文件中读取出来。Java提供了ObjectInputStream和ObjectOutputStream类用于对象流的读写操作,这使得可以直接保存和读取Java对象,而无需手动进行对象序列化和反序列化。
1.ObjectOutputStream类:ObjectOutputStream用于将Java对象写入到输出流中。
// 使用ObjectOutputStream将Java对象写入到文件
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"))) {
// 创建一个Person对象
Person person = new Person("Alice", 25);
// 写入对象到文件
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
2.ObjectInputStream类:ObjectInputStream用于从输入流中读取Java对象。
// 使用ObjectInputStream从文件中读取Java对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"))) {
// 读取对象并强制转换为Person对象
Person person = (Person) ois.readObject();
// 打印Person对象的信息
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
需要注意的是,要将一个对象写入文件或从文件读取对象,该对象必须是实现了Serializable接口的类,否则会抛出NotSerializableException异常。同时,序列化后的对象可以在网络中传输,也可以在不同操作系统之间传输。
6.转换流
在Java中,转换流用于在字节流与字符流之间进行转换,为了方便操作字符数据,Java提供了InputStreamReader和OutputStreamWriter类,这两个类可以将字节流转换为字符流,从而实现字节流与字符流之间的桥接。
1.InputStreamReader:InputStreamReader是用于将字节输入流转换为字符输入流的类,可以指定字符集进行转换。
// 使用InputStreamReader转换字节流为字符流并读取文件内容
try (FileInputStream fis = new FileInputStream("input.txt");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8)) {
int data;
while ((data = isr.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
2.OutputStreamWriter:OutputStreamWriter是用于将字符输出流转换为字节输出流的类,可以指定字符集进行转换。
// 使用OutputStreamWriter转换字符流为字节流并将字符串写入文件
String str = "Hello, OutputStreamWriter!";
try (FileOutputStream fos = new FileOutputStream("output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
osw.write(str);
} catch (IOException e) {
e.printStackTrace();
}