1.流的本质为基本类型数组
2.网络流和数据流都是读某个文件路径,形成编码,再解析出来
short x = arr[i]<<8+arr[i+1] char w = (char)x
char\int\short\long都可以存视频流、音频流等
3.文件流:基本数据类型数组拼接起来
(例:C语言中
char[ ] arr 为一个文件流,char在C中为8比特,UTF-32为32位表示一个字符
arr[i]<<24+arr[i+1]<<16+arr[i+2]<<8+arr[i+3]拼接成UTF-32,在编码库中查询,将各种基本类型转化为char文件解析出来生成符号
文件形成编码时需要在头部标注出是什么编码以及文件总大小(字节数,文件总大小的表示数一般为32位)
4.数据流转成文件操作系统有专门的方法,把byte数组变成二进制数据存下来到硬盘上,对这块数据显示为有效,文件中有这块地址,把数读出来重新变为基本数据类型编码,显示出来
5.网络流通过高低电压传输,我们接收的时候也是用基本数据类型
6.文件流:文件的存取
①、字节输出流(文件字节流)
public class FOSWriterStream {
//将数据写入文件
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象,构造函数中的 true 表示在原有数据末尾追加续写
FileOutputStream fos = new FileOutputStream("fos.txt", true);
// 1、逐个字节写出
fos.write(97); // 97 的 ascll 码是 a
fos.write(98); // 98 的 ascll 码是 b
fos.write(99); // 99 的 ascll 码是 c
// 2、写出一个换行, 换行符号转成数组写出
fos.write("\r\n".getBytes());
// 字符串转换为字节数组
byte[] b = "一个优秀的废人".getBytes();
// 3、写出字节数组数据
fos.write(b);
// 4、写出指定长度字节数组数据(不可超过 b 的长度,否则数组越界)
fos.write(b, 0, b.length);
// 关闭资源
fos.close();
}
}
②、字节输入流(文件字节流)
public class FISReadStream {
//将数据从文件中读出
public static void main(String[] args) throws IOException {
// 1、逐个读取字节
int b;
FileInputStream fis1 = new FileInputStream("fis.txt");
// 循环读取
while ((b = fis1.read())!=-1) {
System.out.println((char)b);
}
// 关闭资源
fis1.close();
System.out.println("----华丽丽的分割线----");
// 2、定义字节数组读取
int length;
FileInputStream fis2 = new FileInputStream("fis.txt");
// 定义字节数组,作为装字节数据的容器
byte[] bytes = new byte[1024];
// 循环读取
while ((length = fis2.read(bytes))!=-1) {
// 每次读取后,把数组变成字符串打印
System.out.println(new String(bytes, 0, length));
}
// 关闭资源
fis2.close();
}
}
③、复制文件
public class FileCopyStream {
//复制文件
public static void main(String[] args) throws IOException {
// 指定数据源
FileInputStream fis = new FileInputStream("Java IO 流.png");
// 指定目的地
FileOutputStream fos = new FileOutputStream("流.png");
// 定义数组
byte[] b = new byte[1024];
// 定义长度
int len;
// 循环读取
while ((len = fis.read(b))!=-1) {
// 写出数据
fos.write(b, 0 , len);
}
// 关闭资源,后开先关,后开先关
fos.close();
fis.close();
}
}
④、文件字符流
7.网络流:socket的存取
所有网络收发都是socket。socket是一个类,专门用来收发,需要指定端口
①、服务端
public class server {//服务端
public static void main(String[] args){
//从服务端接收数据
try{
ServerSocket server = new ServerSocket(8089);
Socket socket = server.accept();
Reader reader = new InputStreamReader(socket.getInputStream());
char[] chars = new char[1024];
int len;
StringBuilder builder = new StringBuilder();
while ((len=reader.read(chars)) != -1) {
builder.append(new String(chars, 0, len));
}
System.out.println("Receive from client message=: " + builder);
reader.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
②、客户端
public class client {//客户端
public static void main(String[] args){
try {
//向服务端发送数据
Socket socket = new Socket("127.0.0.1",8089);
Writer writer = new OutputStreamWriter(socket.getOutputStream());
writer.write("Hello From Client");
//它用于将缓冲区中的数据强制刷新到目标流中,确保数据已经被写入到磁盘或其他持久化设备中,并释放相应的缓冲区。
writer.flush();
writer.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}