IO流的介绍
Java中的I/O流是指用于读取和写入数据的输入流和输出流。Java提供了一套丰富的I/O API,包括字节流和字符流,可以用于从文件、网络、内存和其他数据源中读取和写入数据。
应用:
java程序 — 硬盘
java程序 — 网络
需求:
java中的数据,如何输出到硬盘。
从硬盘文件中,读取数据到java中!
IO能够做什么 java web?
- 上传图片(注册,头像)
- 上传文件
- 下载文件
IO: stream 形象!
- 参考点
- 流,管道
- 对象(脱水、压缩,粉末,传递) “木乃伊”, “瞬间移动”
- 序列化 implements Serializable (记录对象的信息) 标记接口
- 写法:完成数据的赋值
InputStream in = new BufferedInputStream(…);
OutputStream out = new BufferedOutputStream(…);
int length = 0;
byte[] buf = new byte[1024];
while((length=in.read(buf))!= -1) {
out.write(buf, 0, length)
}
Java I/O流可以分为以下几类:
-
字节流:字节流是基于字节的输入流和输出流,用于读取和写入字节数据。Java提供了两个字节流类:InputStream和OutputStream。InputStream用于从数据源读取字节数据,而OutputStream用于向数据源写入字节数据。
-
字符流:字符流是基于字符的输入流和输出流,用于读取和写入字符数据。Java提供了两个字符流类:Reader和Writer。Reader用于从数据源读取字符数据,而Writer用于向数据源写入字符数据。
-
缓冲流:缓冲流是一种高效的I/O流,它利用缓冲区在内存中暂存数据,以减少I/O操作的次数。Java提供了四个缓冲流类:BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter。
-
数据流:数据流是一种特殊的流,可以读取和写入基本数据类型和字符串。Java提供了两个数据流类:DataInputStream和DataOutputStream。
-
对象流:对象流是一种特殊的流,可以读取和写入Java对象。Java提供了两个对象流类:ObjectInputStream和ObjectOutputStream。
-
序列化流:序列化流是一种特殊的对象流,可以将Java对象序列化为字节序列,或将字节序列反序列化为Java对象。Java提供了两个序列化流类:ObjectInputStream和ObjectOutputStream。
Java I/O流的使用步骤通常包括以下几个步骤:
-
创建输入流或输出流对象,指定要读取或写入的数据源。
-
使用流对象读取或写入数据,可以使用read()和write()方法读取或写入单个字节或字符,也可以使用readLine()和write()方法读取或写入一行文本或一组数据。
-
在读取或写入完成后,关闭流对象,以释放资源并确保数据被正确保存或写入。可以使用close()方法关闭流对象。
在使用Java I/O流时,还需要注意以下几点:
-
在读取或写入数据时,需要注意处理可能抛出的IOException异常。
-
在使用缓冲流时,需要注意及时刷新缓冲区,并确保在关闭流对象之前将缓冲区中的所有数据写入到目标数据源中。
-
在使用数据流或对象流时,需要注意序列化和反序列化的过程,并确保序列化和反序列化的对象类型一致。
总之,Java I/O流是Java编程中不可或缺的一部分,掌握了它们的基本用法和原理,可以更加灵活和高效地读取和写入各种类型的数据,为开发Java应用程序提供强大的支持。除了上述基本的I/O流类外,Java还提供了许多其他的I/O类和接口,如RandomAccessFile、File、FileInputStream、FileOutputStream、PrintStream等,可以根据具体的需求选择不同的I/O流类和API。
除了基本的I/O流类和API外,Java还提供了许多高级的I/O框架和库,如NIO(New I/O)和AIO(Asynchronous I/O)等,可以用于实现更高效、更灵活和更可扩展的I/O操作。例如,NIO提供了基于通道和缓冲区的I/O模型,可以大大提高数据读取和写入的效率和吞吐量;而AIO则提供了异步I/O模型,可以实现非阻塞的I/O操作,并利用回调函数来处理I/O事件,可以在高负载的情况下提供更好的响应能力和性能。
代码示例:
- 文件输入流(FileInputStream)读取文件内容
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("test.txt");
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 文件输出流(FileOutputStream)将字符串写入文件
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("test.txt");
String str = "Hello, World!";
fos.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 缓冲输入流(BufferedInputStream)读取文件内容
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferedInputStreamDemo {
public static void main(String[] args) {
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream("test.txt"));
byte[] buffer = new byte[1024];
int length;
while ((length = bis.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, length));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bis != null) {
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 缓冲输出流(BufferedOutputStream)将字符串写入文件
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedOutputStreamDemo {
public static void main(String[] args) {
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream("test.txt"));
String str = "Hello, World!";
bos.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}