Java IO流是一种重要的技术,用于处理与输入和输出相关的数据。通过使用Java IO流,开发人员可以方便地读取和写入各种类型的数据,包括文本、图像、音频等等。
本文将介绍Java IO流的基本概念、主要类和常用方法,以及如何使用Java IO流处理数据。
Java IO流的基本概念
Java IO流是一种处理数据的机制,它允许开发人员读取和写入数据。Java IO流分为输入流和输出流,分别用于从数据源读取数据和将数据写入到目标位置。
Java IO流分类:
根据流的方向,我们可以将其分为以下两类:
- 输入流(InputStream)和读取操作(Read):这些流负责将数据从数据源传输到内存中,也就是读取或输入数据。这些输入流可以读取各种类型的数据,包括文本文件、图片、声音文件和视频文件等。
- 输出流(OutputStream)和写入操作(Write):这些流负责将数据从内存传输到目标位置,也就是写入或输出数据。这些输出流可以写入各种类型的数据,包括文本文件、图片、声音文件和视频文件等。
另外,按照读取数据的方式,我们可以将其分为以下两类:
- 字节流(Byte Stream):这种流一次读取一个字节,也就是8个二进制位的数据。字节流是万能的,可以读取任何类型的文件,包括文本文件、图片、声音文件和视频文件等。常见的字节流类有InputStream和OutputStream。
- 字符流(Character Stream):这种流一次读取一个字符的数据,通常用于处理文本数据。字符流与字节流相比,更高效地处理文本数据,因为不需要将每个字符都转换为字节。常见的字符流类有Reader和Writer。
Java IO流的主要类和常用方法包括:
InputStream类:用于读取字节数据,常用的方法有read()和skip()。
OutputStream类:用于写入字节数据,常用的方法有write()和flush()。
Reader类:用于读取字符数据,常用的方法有read()和skip()。
Writer类:用于写入字符数据,常用的方法有write()和flush()。
使用Java IO流读取数据
使用Java IO流读取数据的步骤如下:
- 创建输入流对象:使用InputStream类或其子类来创建输入流对象,例如FileInputStream、BufferedInputStream等。
- 读取数据:使用输入流对象的方法来读取数据。例如,使用read()方法来读取一个字节的数据,或使用read(byte[] b)方法来读取一定数量的字节数据。
- 关闭输入流:读取完数据后,应及时关闭输入流对象以释放系统资源。
以下是一个使用Java IO流读取数据的示例代码:
import java.io.*;
public class ReadDataExample {
public static void main(String[] args) {
try {
File file = new File("data.txt");
FileInputStream fis = new FileInputStream(file);
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用Java IO流写入数据
使用Java IO流写入数据的步骤如下:
- 创建输出流对象:使用OutputStream类或其子类来创建输出流对象,例如FileOutputStream、BufferedOutputStream等。
- 写入数据:使用输出流对象的方法来写入数据。例如,使用write()方法来写入一个字节的数据,或使用write(byte[] b)方法来写入一定数量的字节数据。
- 关闭输出流:写入完数据后,应及时关闭输出流对象以释放系统资源。
以下是一个使用Java IO流写入数据的示例代码:
import java.io.*;
public class WriteDataExample {
public static void main(String[] args) {
try {
File file = new File("output.txt");
FileOutputStream fos = new FileOutputStream(file);
String data = "Hello, world!";
fos.write(data.getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java IO流之各种流:
1. 字符流
Java字符流是处理文本数据的流。与字节流一次处理一个字节不同,字符流一次处理一个字符,通常用于读写文本数据。在Java中,字符流是继承自Reader和Writer类。
字符流常用方法:
- read():从输入流中读取一个字符,返回一个int值,其中包含该字符的Unicode编码。该方法返回-1表示已经到达文件末尾。
- read(char[] b):从输入流中读取指定数量的字符,将其存储到缓冲区数组b中。该方法返回实际读取的字符数。
- read(char[] b, int off, int len):从输入流中读取指定数量的字符,将其存储到缓冲区数组b中,从off位置开始存储,最多读取len个字符。该方法返回实际读取的字符数。
- skip(long n):从输入流中跳过指定数量的字符。该方法返回实际跳过的字符数。
- available():返回输入流中可以读取的字符数量。
- close():关闭输入流,释放与之关联的资源。
- mark(int readAheadLimit):标记输入流中的当前位置,以便后续可以重新读取。该方法返回一个boolean值,表示是否支持mark()方法和读取指定数量的字符。
- reset():将输入流中的位置重置到之前使用mark()方法标记的位置。
- markSupported():返回一个boolean值,表示输入流是否支持mark()方法。
- write(int b):将一个字符写入输出流。
- write(String str):将一个字符串写入输出流。
- write(String str, int off, int len):将一个字符串中的指定部分写入输出流。
- flush():将输出流中的所有数据立即写入底层流中。
- close():关闭输出流,释放与之关联的资源。
使用字符流读取文本文件是一个常见的应用。下面是一段使用FileReader和BufferedReader来读取文本文件的代码示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadTextFile {
public static void main(String[] args) {
String filePath = "path/to/file.txt";
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们使用BufferedReader和FileReader来读取文本文件。BufferedReader提供了逐行读取文本数据的高效方法。通过调用readLine()方法,我们可以逐行读取文本数据直到文件结束。读取的数据输出到控制台上。
另外,使用字符流写入文本文件也是一个常见的应用。下面是一段使用FileWriter和BufferedWriter来写入文本文件的代码示例:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class WriteTextFile {
public static void main(String[] args) {
String filePath = "path/to/file.txt";
String content = "Hello, world!";
try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
bw.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们使用BufferedWriter和FileWriter来写入文本文件。BufferedWriter提供了逐行写入文本数据的高效方法。通过调用write()方法,我们可以将文本数据写入文件中。在这个例子中,我们将一个字符串写入到文本文件中。
2. 缓冲流
Java缓冲流是一种高效的数据读取和写入方式,它使用缓冲区(buffer)来存储数据,减少了对底层输入/输出设备的直接访问,从而提高了数据处理的性能和效率。
缓存流常用方法:
BufferedReader:
readLine():读取一行字符串数据。
read():读取单个字符数据。 mark(int
readAheadLimit)和reset():标记当前位置,以便后续可以重新读取。
BufferedWriter:
write(String str)和write(int c):写入字符串或字符数据。
newLine():写入行分隔符。
flush():刷新缓冲区,将数据写入到目标位置。
BufferedInputStream 和 BufferedOutputStream:
read()和write():分别读取和写入字节数据。
mark(intreadAheadLimit)和reset():标记当前位置,以便后续可以重新读取。
available():获取缓冲区中剩余的可读取字节数。
close():关闭流,释放相关资源。
在Java中,缓冲流主要使用BufferedReader和BufferedWriter类来实现数据的读取和写入。以下是使用Java缓冲流进行数据读取和写入的代码示例:
使用BufferedReader读取文本文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadTextFile {
public static void main(String[] args) {
String filePath = "path/to/file.txt";
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们使用BufferedReader和FileReader来读取文本文件。BufferedReader提供了逐行读取文本数据的高效方法。通过调用readLine()方法,我们可以逐行读取文本数据直到文件结束。读取的数据输出到控制台上。
使用BufferedWriter写入文本文件
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class WriteTextFile {
public static void main(String[] args) {
String filePath = "path/to/file.txt";
String content = "Hello, world!";
try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
bw.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们使用BufferedWriter和FileWriter来写入文本文件。BufferedWriter提供了逐行写入文本数据的高效方法。通过调用write()方法,我们可以将文本数据写入文件中。在这个例子中,我们将一个字符串写入到文本文件中。
使用avaBufferedInputStream 和 BufferedOutputStream读取文本和写入文本
import java.io.*;
public class BufferedInputOutputStreamExample {
public static void main(String[] args) {
try {
// 创建BufferedInputStream对象,读取文件input.txt的内容
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));
// 创建BufferedOutputStream对象,将数据写入文件output.txt中
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"));
// 读取文件中的数据并写入到输出文件中
int data;
while ((data = bis.read()) != -1) {
bos.write(data);
}
// 关闭流对象
bis.close();
bos.close();
System.out.println("Data has been transferred successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上列代码中,我们首先创建了一个BufferedInputStream对象bis,使用它来读取文件input.txt的内容。接着创建了一个BufferedOutputStream对象bos,使用它来将数据写入到文件output.txt中。在while循环中,我们不断从input.txt文件中读取数据,并通过bos写入到output.txt文件中。最后关闭流对象,释放相关资源。
3. 转换流
Java转换流是一种用于将字节流转换为字符流的技术,它可以将字节数据转换为字符数据,以便于对文本数据进行处理和操作。
转换流常用方法:
1.InputStreamReader和OutputStreamWriter:用于将字节流转换为字符流,或者将字符流转换为字节流。
2.FileInputStream和FileOutputStream:用于读写文件中的字节流数据,可以将文件内容转换为字符流或者将字符流写入到文件中。
3.DataInputStream和DataOutputStream:用于读写基本数据类型和字符串的字节流数据,可以将基本数据类型和字符串转换为字节流或者将字节流转换为基本数据类型和字符串。
在Java中,转换流主要使用InputStreamReader和OutputStreamWriter类来实现字节流和字符流之间的转换。以下是使用Java转换流进行数据读取和写入的代码示例:
使用InputStreamReader将字节流转换为字符流
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReadTextFile {
public static void main(String[] args) {
String filePath = "path/to/file.txt";
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们使用BufferedReader和FileReader来读取文本文件。通过将FileReader包装在InputStreamReader中,我们可以将字节流转换为字符流,以便于使用BufferedReader逐行读取文本数据。读取的数据输出到控制台上。
使用OutputStreamWriter将字符流转换为字节流
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class WriteTextFile {
public static void main(String[] args) {
String filePath = "path/to/file.txt";
String content = "Hello, world!";
try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
bw.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们使用BufferedWriter和FileWriter来写入文本文件。通过将FileWriter包装在OutputStreamWriter中,我们可以将字符流转换为字节流,以便于使用BufferedWriter逐行写入文本数据。在这个例子中,我们将一个字符串写入到文本文件中。需要注意的是,OutputStreamWriter默认使用平台默认字符集进行编码,如果需要使用指定的字符集编码,可以使用OutputStreamWriter的构造函数来指定字符集。例如,使用UTF-8编码可以将OutputStreamWriter的第二个参数设置为"UTF-8"。
4. 打印流
打印流,这里所说的打印其实就是写数据的意思,它和普通的write方法写数据还不太一样,一般会使用打印流特有的方法叫print(数据)或者println(数据),它打印啥就输出啥。
打印流有两个,一个是字节打印流PrintStream,一个是字符打印流PrintWriter
PrintStream和PrintWriter的用法是一样的,所以这里就一块演示了。
public static void main(String[] args) {
try (
// 1、创建一个打印流管道
PrintWriter ps =
new PrintWriter(new FileOutputStream("io-app2/src/itheima08.txt", true));
){
ps.print(97); //文件中显示的就是:97
ps.print('a'); //文件中显示的就是:a
ps.println("我爱你中国abc"); //文件中显示的就是:我爱你中国abc
ps.println(true);//文件中显示的就是:true
ps.println(99.5);//文件中显示的就是99.5
} catch (Exception e) {
e.printStackTrace();
}
}
5. 数据流
Java数据流是Java中用于处理数据的一种方式,它可以将数据从一种格式转换为另一种格式,以便在不同的应用程序之间进行通信或保存数据。Java数据流主要使用DataInputStream和DataOutputStream两个类来实现。
DataOutputStream是一个字节流类,它可以将基本数据类型(如int,double,char等)以及一些特殊类型(如String)以二进制形式写入到输出流中。它提供了write()方法来将各种类型的数据写入到输出流中。例如:
try (DataOutputStream out = new DataOutputStream(new FileOutputStream("data.txt"))) {
int i = 123;
double d = 3.1415926;
char c = 'c';
String str = "Hello World!";
out.writeInt(i);
out.writeDouble(d);
out.writeChar(c);
out.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
上面的代码创建了一个DataOutputStream对象,并通过它将一些基本数据类型和String写入到文件"data.txt"中。writeInt(),writeDouble(),writeChar()和writeUTF()方法分别将int,double,char和String类型的数据写入到输出流中。
DataInputStream是一个字节流类,它可以从输入流中读取二进制形式的数据,并将其转换为相应的Java数据类型。它提供了read()方法来从输入流中读取各种类型的数据。例如:
try (DataInputStream in = new DataInputStream(new FileInputStream("data.txt"))) {
int i = in.readInt();
double d = in.readDouble();
char c = in.readChar();
String str = in.readUTF();
System.out.println(i);
System.out.println(d);
System.out.println(c);
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
}
上面的代码创建了一个DataInputStream对象,并通过它将从文件"data.txt"中读取int,double,char和String类型的数据。然后将这些数据打印到控制台中。readInt(),readDouble(),readChar()和readUTF()方法分别从输入流中读取int,double,char和String类型的数据。
6. 序列化流
Java序列化流是一种强大的工具,它允许将对象的状态转换为字节流,以便将其存储到磁盘上或通过网络传输到另一个运行Java的进程中。通过序列化,我们可以在需要时将对象的状态恢复到原始对象。
【注意】在Java中,要使一个对象可序列化,需要实现Serializable接口。这个接口没有任何方法,只是一个标记接口,用于指示对象可以被序列化。
下面是一个简单的例子,演示了如何使用Java序列化流来序列化和反序列化一个对象:
import java.io.*;
class SerializationDemo {
public static void main(String[] args) {
// 创建要序列化的对象
Employee e = new Employee();
e.name = "Reyan Ali";
e.number = 101;
// 尝试序列化对象
try {
FileOutputStream fos = new FileOutputStream("employee.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(e);
oos.close();
fos.close();
System.out.printf("Serialized data is saved in employee.ser");
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
//这是用于序列化的Employee类,必须实现Serializable接口
class Employee implements Serializable {
public String name;
public int number;
}
在这个示例中,我们创建了一个Employee类,并将其实现了Serializable接口。这是Java序列化的关键,只有实现了Serializable接口的类才能被序列化。
在主函数中,我们创建了一个Employee对象,并将其序列化到名为"employee.ser"的文件中。这个文件现在包含了序列化的对象。我们可以将这个文件发送给其他需要此数据的系统,或者我们可以从该文件中读取并反序列化对象。
总之,Java IO流是一种强大的技术,用于处理各种类型的数据输入和输出。通过使用Java IO流,开发人员可以方便地读写数据,并对数据进行转换和处理。
9472





