IO流(Input/Output Stream)是用于输入和输出数据的抽象概念。在Java中,IO流用于在程序和外部设备(如文件、网络等)之间进行数据的读写操作。根据数据的流向,IO流可以分为输入流和输出流。
中的IO流分为字节流和字符流,字节流以字节为单位进行读写操作,而字符流以字符为单位进行读写操作。
在字节流中,常用的类有InputStream、OutputStream、FileInputStream、FileOutputStream等。在字符流中,常用的类有Reader、Writer、FileReader、FileWriter等。
此外,还提供了一些高级的IO流,如缓冲流(BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter),用于提高读写操作的效率;对象流(ObjectInputStream、ObjectOutputStream),用于序列化和反序列化对象;打印流(PrintStream、PrintWriter),用于方便地打印数据。
字节流主要用于处理二进制数据,比如读取和写入文件或网络传输的字节数据。常用的字节流类有InputStream和OutputStream。
以下是常用的字节流方法及示例:
read(): 用于从输入流中读取一个字节,并返回读取的字节值。 示例:
InputStream inputStream = new FileInputStream("file.txt");
int data = inputStream.read();
System.out.println(data);
输出结果:读取的字节值(0-255之间)
write(int b): 用于将一个字节写入输出流。 示例:
OutputStream outputStream = new FileOutputStream("file.txt");
outputStream.write(65);
outputStream.close();
输出结果:将ASCII码为65的字节写入文件中,即写入字母"A"。
read(byte[] b): 用于从输入流中将指定长度的字节读入到字节数组b中,并返回实际读取的字节数。 示例:
InputStream inputStream = new FileInputStream("file.txt");
byte[] buffer = new byte[5];
int bytesRead = inputStream.read(buffer);
System.out.println(new String(buffer));
输出结果:读取文件中前5个字节并以String形式输出。
write(byte[] b): 用于将字节数组中的字节写入输出流。 示例:
OutputStream outputStream = new FileOutputStream("file.txt");
byte[] data = {65, 66, 67};
outputStream.write(data);
outputStream.close();
输出结果:将字节数组中的字节写入文件中,即写入字母"ABC"。
available(): 用于获取当前可从输入流中获取的字节数。 示例:
InputStream inputStream = new FileInputStream("file.txt");
int availableBytes = inputStream.available();
System.out.println(availableBytes);
输出结果:当前可读取的字节数。
skip(long n): 用于忽略从输入流中的前n个字节。 示例:
InputStream inputStream = new FileInputStream("file.txt");
inputStream.skip(3);
int data = inputStream.read();
System.out.println(data);
输出结果:跳过前3个字节,输出第4个字节。
close(): 用于关闭输入流或输出流。 示例:
InputStream inputStream = new FileInputStream("file.txt");
inputStream.close();
输出结果:无
flush(): 用于刷新输出流,将缓冲区中的数据强制写入目标设备。 示例:
OutputStream outputStream = new FileOutputStream("file.txt");
outputStream.write(65);
outputStream.flush();
outputStream.close();
输出结果:将数据写入文件并刷新缓冲区。
mark(int readLimit) 和 reset(): 用于在输入流中做标记和返回到该标记位置,以便后续读取操作。 示例:
InputStream inputStream = new FileInputStream("file.txt");
inputStream.mark(5);
int data1 = inputStream.read();
inputStream.reset();
int data2 = inputStream.read();
System.out.println(data1);
System.out.println(data2);
输出结果:先读取一个字节后又返回到标记位置再次读取。
FileInputStream(String name) 和 FileOutputStream(String name): 分别用于创建文件输入流和文件输出流,以便读取和写入文件。 示例:
InputStream inputStream = new FileInputStream("file.txt");
OutputStream outputStream = new FileOutputStream("file.txt");
read()
:从字符流中读取下一个字符,并返回它的ASCII值。示例:try {
FileReader reader = new FileReader("file.txt");
int asciiCode = reader.read();
System.out.println(asciiCode);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
输出结果:98(ASCII码中字母'b'的值为98)
read(char[] cbuf)
:从字符流中读取字符到字符数组中,并返回读取的字符数。示例:try {
FileReader reader = new FileReader("file.txt");
char[] buffer = new char[5];
int numChars = reader.read(buffer);
System.out.println(numChars);
System.out.println(Arrays.toString(buffer));
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
输出结果:
5
[h, e, l, l, o]
3. `read(char[] cbuf, int offset, int length)`:从字符流中读取字符到字符数组的指定位置,并返回读取的字符数。示例:
```java
try {
FileReader reader = new FileReader("file.txt");
char[] buffer = new char[5];
int numChars = reader.read(buffer, 1, 3);
System.out.println(numChars);
System.out.println(Arrays.toString(buffer));
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
输出结果:
3
[ , h, e, , o]
4. `readLine()`:从字符流中读取一行字符,并返回该行,如果到达文件末尾则返回null。示例:
```java
try {
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
输出结果:
Hello
World
5. `skip(long n)`:跳过指定数量的字符。示例:
```java
try {
FileReader reader = new FileReader("file.txt");
reader.skip(3);
int asciiCode = reader.read();
System.out.println((char)asciiCode);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
输出结果:l
mark(int readAheadLimit)
:在当前位置设置标记,以便后续调用reset()
方法可以返回到该位置。示例:try {
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
reader.mark(10);
System.out.println(reader.readLine());
reader.reset();
System.out.println(reader.readLine());
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
输出结果:
Hello
Hello
7. `ready()`:检查字符流是否准备好进行读取。示例:
```java
try {
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
System.out.println(reader.ready());
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
输出结果:true
close()
:关闭字符流。示例:try {
FileReader reader = new FileReader("file.txt");
int asciiCode = reader.read();
System.out.println(asciiCode);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
输出结果:98
write(char[] cbuf)
:将字符数组的内容写入字符流。示例: try {
FileWriter writer = new FileWriter("file.txt");
char[] chars = {'H', 'e', 'l', 'l', 'o'};
writer.write(chars);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
字节缓冲流(BufferedInputStream和BufferedOutputStream)是用于提高字节流读写效率的一种流。它们通过在内存中创建一个缓冲区来减少对磁盘的访问次数,从而提高读写的速度。
以下是10个常用的方法以及对应的功能、示例和输出结果:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("file.txt"));
int data = bis.read();
System.out.println(data);
输出结果:读取的下一个字节的数据。
byte[] buffer = new byte[1024];
int bytesRead = bis.read(buffer);
System.out.println(new String(buffer, 0, bytesRead));
输出结果:读取的一定数量的字节数据。
bos.write(65);
bos.flush();
输出结果:将字节'A'写入输出流。
byte[] buffer = "Hello".getBytes();
bos.write(buffer);
bos.flush();
输出结果:将字节数组中的数据写入输出流。
bos.write("Hello".getBytes());
bos.flush();
输出结果:将缓冲区中的数据写入磁盘。
bis.close();
输出结果:关闭输入流。
bis.reset();
long bytesSkipped = bis.skip(5);
System.out.println(bytesSkipped);
输出结果:跳过5个字节。
以上是字节缓冲流的一些常用方法及其功能、示例和输出结果。请注意,实际的输出结果可能因为具体的文件内容和操作而有所不同。
write(String str)
:将字符串写入字符流。示例:try {
FileWriter writer = new FileWriter("file.txt");
String str = "Hello";
writer.write(str);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
?
在Java中,字符缓冲流主要用于对字符数据进行高效的读取和写入操作。它是基于字符流的一种高级流,可以提高读取和写入字符数据的效率。
以下是字符缓冲流的常用方法,以及每个方法的作用和输出示例:
read()
- 从输入流中读取一个字符。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
int c = br.read();
System.out.println((char) c);
输出:第一个字符。
read(char[] cbuf)
- 将字符读入数组。char[] cbuf = new char[5];
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
br.read(cbuf);
System.out.println(cbuf);
输出:读取到的字符数组。
readLine()
- 读取一行字符。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
String line = br.readLine();
System.out.println(line);
输出:读取到的一行字符。
skip(long n)
- 跳过字符。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
br.skip(5);
int c = br.read();
System.out.println((char) c);
输出:跳过5个字符后的第一个字符。
ready()
- 判断流是否准备好被读取。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
System.out.println(br.ready());
输出:true 或 false。
mark(int readAheadLimit)
- 在当前位置做一个标记,以便后续可以回到此处。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
br.mark(5);
int c1 = br.read();
br.reset();
int c2 = br.read();
System.out.println((char) c1 + " " + (char) c2);
输出:第一个字符 第二个字符。
reset()
- 将流的读取位置重置为最近的标记位置。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
br.mark(5);
br.read();
br.reset();
int c = br.read();
System.out.println((char) c);
输出:第一个字符。
close()
- 关闭字符缓冲流。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
br.close();
lines()
- 返回流中的所有行。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
Stream<String> lines = br.lines();
lines.forEach(System.out::println);
lines().count()
- 返回流中行的数量。BufferedReader br = new BufferedReader(new FileReader("file.txt"));
long count = br.lines().count();
System.out.println(count);
在Java中,打印流(PrintStream和PrintWriter)用于将数据输出到控制台或文件。它提供了一系列的打印方法,可以方便地输出不同类型的数据(如字符串、整数等)。
以下是常用的打印流方法及其用途的示例:
PrintStream ps = System.out;
ps.print("Hello World");
输出结果:Hello World
PrintStream ps = System.out;
ps.println("Hello");
ps.println("World");
输出结果: Hello World
PrintStream ps = System.out;
int num = 100;
ps.print(num);
输出结果:100
PrintStream ps = System.out;
double num = 3.14;
ps.println(num);
输出结果:3.14
PrintStream ps = System.out;
String name = "John";
int age = 25;
ps.printf("My name is %s and I am %d years old.", name, age);
输出结果:My name is John and I am 25 years old.
随机访问流(RandomAccessFile)用于以读写方式处理文件。与其他流不同的是,随机访问流可以直接跳转到文件的任意位置读写数据。
以下是常用的方法及其作用,以及相应的示例和输出结果:
seek(long pos):将文件指针定位到指定位置。 示例:
RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
file.seek(10);
System.out.println(file.getFilePointer());
输出结果:10
read():读取一个字节的数据。 示例:
RandomAccessFile file = new RandomAccessFile("example.txt", "r");
int data = file.read();
System.out.println((char)data);
输出结果:读取的单个字符
write(byte[] buffer):将字节数组写入文件。 示例:
RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
byte[] data = "Hello".getBytes();
file.write(data);
输出结果:文件中写入"Hello"
length():返回文件的长度(以字节为单位)。 示例:
RandomAccessFile file = new RandomAccessFile("example.txt", "r");
long length = file.length();
System.out.println(length);
输出结果:文件的字节长度
read(byte[] buffer, int offset, int length):从文件中读取一定数量的字节并存储到字节数组中。 示例:
RandomAccessFile file = new RandomAccessFile("example.txt", "r");
byte[] buffer = new byte[5];
file.read(buffer, 0, 5);
System.out.println(new String(buffer));
输出结果:读取的前5个字节的内容(如果文件内容不足5个字节,则输出实际读取的内容)
?