Java技术体系之基础能力篇(三)——IO流使用及原理(TODO)
·
1、IO流概述
1.1 IO流概述(百度百科)
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
IO流的数据来源一般有硬盘、内存、键盘、网络等。
1.2 IO流分类
在Java中I/O流操作的类很多,但是核心体系实际上就只有File、InputStream、OutputStream、Reader、Writer。
字节流: 操作的数据单元是8位的字节。InputStream、OutputStream作为抽象基类。
字符流: 操作的数据单元是字符。以Writer、Reader作为抽象基类。
缓冲流: 是带缓冲区的处理流,它会提供一个缓冲区,缓冲区的作用的主要目的是:避免每次和硬盘打交道,能够提高输入/输出的执行效率。


1.3 IO流示例
1.3.1 从磁盘中读取文件并打印(通过文件字节流)
public class FileInputStreamDemo {
public static void main(String[] args) {
FileInputStream fileInputStream;
try {
fileInputStream = new FileInputStream("D:/test.txt");
int i;
while((i = fileInputStream.read()) != -1) {
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.3.2 从文件、内存、键盘、网络读取IO流
public class DataSourceDemo {
public static void main(String[] args) {
//从文件中读取
fromFile();
//从内存读取
fromMemory();
//从键盘读取
fromKeyBoard();
//从网络读取,网络IO单独补充
fromInternet();
}
// 网络IO单独补充
private static void fromInternet() {
// todo
}
private static void fromKeyBoard() {
try (InputStream inputStream = System.in) {
int i;
while((i = inputStream.read()) != -1) {
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println();
}
public static void fromFile() {
try (FileInputStream fileInputStream = new FileInputStream("D:/test.txt")) {
int i;
while((i = fileInputStream.read()) != -1) {
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println();
}
public static void fromMemory() {
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream("Hello World!".getBytes())) {
int i;
while((i = byteArrayInputStream.read()) != -1) {
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println();
}
}
1.3.3 根据用户端输入的路径进行目录的遍历
public class FileDemo {
public static void main(String[] args) {
try(InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
String path = bufferedReader.readLine();
File file = new File(path);
if (file.exists() && file.isDirectory()) {
fileList(file);
} else {
System.out.println("文件路径输入错误");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void fileList(File filePath) {
File[] files = filePath.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
System.out.println(file.getName());
} else {
fileList(file);
}
}
}
}
}
1.3.4 文件复制
public class InputStreamDemo {
public static void main(String[] args) {
File file = new File("D:/test.png");
try(FileInputStream fileInputStream = new FileInputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream("D:/test_cp.png")) {
int len;
// 通过缓冲区提升磁盘读写效率
byte[] buffer = new byte[1024];
while((len = fileInputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.3.5 通过缓冲区读取文件内容并打印
public class ReadDemo {
public static void main(String[] args) {
try(FileInputStream fileInputStream = new FileInputStream("D:/test.txt")) {
int i;
byte[] buffer = new byte[3];
// 读取制定目录的字节,如果read方法没有输入会阻塞
while((i = fileInputStream.read(buffer)) != -1) {
System.out.print(new String (buffer,0, i));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.3.6 通过缓冲流复制文件
public class BufferedDemo {
public static void main(String[] args) {
try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("D:/test.txt"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("D:/test_cp.txt"))) {
int len;
byte[] bytes = new byte[1024];
while((len = bufferedInputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes, 0, len);
bufferedOutputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.3.7 通过字符流读取文件并打印
public class ByteReadDemo {
public static void main(String[] args) {
try(FileReader fileReader = new FileReader("D:/test.txt")) {
int i = 0;
char[] chars = new char[1024];
while ((i = fileReader.read(chars)) != -1) {
System.out.println(new String(chars, 0, i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.3.8 过字节流读取文件,转换为指定编码的字符流并打印
public class StreamConvertDemo {
public static void main(String[] args) {
try(InputStream inputStream = new FileInputStream("D:/test.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
InputStreamReader inputStreamReader = new InputStreamReader(bufferedInputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) {
int i = 0;
char[] chars = new char[1024];
while ((i = bufferedReader.read(chars)) != -1) {
System.out.println(new String(chars, 0, i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.3.9 将一个Java对象持久化到磁盘中,再从磁盘读取到内存中并打印
public class SerializeDemo {
public static void main(String[] args) {
User user = new User("Mic", 18);
// 序列化
try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:/user"))) {
objectOutputStream.writeObject(user);
} catch (Exception e) {
e.printStackTrace();
}
// 反序列化
try(ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:/user"))) {
User user1 = (User) objectInputStream.readObject();
System.out.println(user1);
} catch (Exception e) {
e.printStackTrace();
}
}
static class User implements Serializable {
public User(String name, int age) {
this.name = name;
this.age = age;
}
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
1.4 IO流基本原理
2、网络IO
2.1 网络通信基础知识
2.1.1 网络通信协议分析



2.1.2 IO通信原理分析
2.1.2.1 磁盘IO通信原理分析

2.1.2.2 网络IO通信原理分析

2.1.3 Socket通信流程

2.2 网络IO示例实战
2.3 拓展:深入解析零拷贝原理
3、NIO
4.1 XXX
4.2 XXX
4.3 XXX
5、XXX
5.1 XXX
5.2 XXX
5.3 XXX
6、XXX
6.1 XXX
6.2 XXX
6.3 XXX
更多推荐



所有评论(0)