Java文件流和网络流的原理以及流解析过程

流我们可以理解为水流,流的传输就相当于在水管里传输,本篇博客主要介绍流的原理和解析过程,学疏才浅,抛砖引玉,大佬勿喷。

文件流

假设我们收到了一个以Unicode编码的文件流,对于该文件流所表示的内容我们很好奇,那么就需要我们想办法对其进行解析。

已知它的编码方式为Unicode,16bit为一个字符,我们以byte类型数组接收,由于byte类型数组为8bit,即8bit代表一个字符,对于16bit类型的数据我们可以做以下处理:

byte[] arr;

//假设其中的一个字符为w.由于为16bit,我们可以直接使用short类型数据。

即short w = arr[i] << 8 + arr[i]

之后我们可以直接用char x = (char)w;来获取该字符的实际意义。 

我们获取到流之后,在操作系统中是如何把它识别成文件的呢?

对于操作系统有现成的对流进行处理的方法,我们在Java中经常见到。。。Stream,该类里就调用了操作系统里的方法,我们可以直接拿来使用。

网络流

Socket是建立网络连接的基础,而网络流是Socket连接之上进行数据传输的方式,在建立连接之后,使用流来进行数据的读写操作,从而实现网络通信。

Socket封装了TCP协议的通讯细节,使用它就可以与远端计算机建立TCP连接.并基于两个流(一个输入 一个输出)与远端计算机进行双向通讯 将Socket比喻为是一部手机 Socket实例化时需要传入两个参数

        参数1:服务端的地址信息

        参数2:服务端打开的服务端口

客户端通过服务端的地址找到网络上的服务器计算机,通过端口可以连接上该机器上运行的服务端应用程序.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络是一种图论算法,用于解决最大问题。Java中可以使用Dinic算法或者Edmonds-Karp算法实现网络。 Dinic算法的基本思想是通过多次增广路径来求解最大,时间复杂度为O(V^2E)。Edmonds-Karp算法则是在BFS的基础上进行增广,时间复杂度为O(VE^2)。 以下是Java实现Dinic算法的示例代码: ```java import java.util.*; public class Dinic { static int N = 510, M = 100010, INF = 0x3f3f3f3f; static int n, m, S, T; static int h[] = new int[N], e[] = new int[M], f[] = new int[M], ne[] = new int[M], idx; static int d[] = new int[N], cur[] = new int[N]; static boolean st[] = new boolean[N]; public static void main(String args[]) { Scanner scan = new Scanner(System.in); n = scan.nextInt(); m = scan.nextInt(); S = 1; T = n; Arrays.fill(h, -1); while (m-- > 0) { int a = scan.nextInt(), b = scan.nextInt(), c = scan.nextInt(); add(a, b, c); } System.out.println(dinic()); } static void add(int a, int b, int c) { e[idx] = b; f[idx] = c; ne[idx] = h[a]; h[a] = idx++; e[idx] = a; f[idx] = 0; ne[idx] = h[b]; h[b] = idx++; } static boolean bfs() { Arrays.fill(d, -1); Queue<Integer> q = new LinkedList<>(); q.offer(S); d[S] = 0; cur[S] = h[S]; while (!q.isEmpty()) { int t = q.poll(); for (int i = h[t]; i != -1; i = ne[i]) { int ver = e[i]; if (d[ver] == -1 && f[i] > 0) { d[ver] = d[t] + 1; cur[ver] = h[ver]; if (ver == T) return true; q.offer(ver); } } } return false; } static int find(int u, int limit) { if (u == T) return limit; int flow = 0; for (int i = cur[u]; i != -1 && flow < limit; i = ne[i]) { cur[u] = i; int ver = e[i]; if (d[ver] == d[u] + 1 && f[i] > 0) { int t = find(ver, Math.min(f[i], limit - flow)); if (t == 0) d[ver] = -1; f[i] -= t; f[i ^ 1] += t; flow += t; } } return flow; } static int dinic() { int r = 0, flow; while (bfs()) while ((flow = find(S, INF)) != 0) r += flow; return r; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值