day20

Day19-IO

  1. 数据结构
    数据结构是计算机存储、组织数据的方式。
    精心挑选的数据结构可以带来更高的运行或存储效率

讲集合时本质讲了些数据结构
根据存储的方式和操作以及特征不同,分为几类
数组 : 有序可重复,查询快更改快,删除添加慢
链表 : 有序可重复,添加删除快,查询更改慢
散列表 : 无序不可重复,存储键值对,key唯一,value可以重复
Tree : 无序不可重复,元素按照某种规则自动排序,(Comparator和Comparable)
记住特性,根据需求进行选择就可。

  1. IO
    2.1 概述
    流-------设备之间的数据传递称
    流的本质 就是数据的传输,根据不同的数据传输特性,抽象出各种类,方便我们直接操作数据

流中的操作对象是指 内存 中,当前操作的程序而言

输入 : 指往内存中导入数据 输出 : 指从内存中写出数据
I : input 输入 O : output 输出

按处理数据类型的不同,分为字节流和字符流
按数据流向的不同,分为输入流和输出流。(入和出是相对于内存来讲的)

按功能不同,分为节点流和处理流
节点流:直接操作数据源

2.2四大抽象类
InputStream 字节输入
OutputStream 字节 输出
Reader 字符输入
Writer 字符输出
2.3 文件流

  • 原始文件流 : 用于打开链接,操作数据
  •  1 FileInputStream  字节输入
    
  •  2 FileOutputStream  字节输出
    
  •  3 FileReader		字符输入
    
  •  4 FileWriter			字符输出
    

2.3.1 FileInputStream
2.3.1.1 概述

  • java.io.InputStream
  • java.io.FileInputStream; 按照自己的方式在原始文件中读取数据

定位到某个文件 有两种方式, 1 绝对路径 2 相对路径
*

  • 相对路径 : 相对当前文件,如何找到 ./ 当前目录 , …/ 上级目录, …/…/…/ 上上上级目录 , / 下级
  • 绝对路径 : 以系统跟目录为准,如何找到这个文件

2.3.1.2 常用方法

// 读取数据
// 读取一个字节,返回下一个字节的值,因为开始光标在顶端。 如果到达文件末尾(后面没有了) 就返回-1
int i1 = fis.read();

2.3.1.3 Read
Read( ) 返回下一个字节的值,如果到达文件末尾 返回 -1
2.3.1.4 Read(byte[] bytes)
read(byte[] b) : 使用字节数组来存储读取的数据,并一次返回(要么数组装满,要么到达文件末尾),可以提高读取效率

  •  	返回值 是本次读取到的字节个数,如果到达文件末尾 返回-1
    

2.3.2 FileReader
2.3.2.1 概述

  • FileRead : 一次读一个字符,也就是2字节,而 unicode编码也是2字节

  • 字符串输入流 一般用于读取纯文本文件,
    字节流 用于压缩包,图片等
    2.3.2.2 常用方法

  • read一样有方法重载,

  •  read() : 读取一个字符,返回下一个的字符数据,到达文件末尾返回-1
    
  •  read(char[] c) : 读取一个字符数组,返回读取到的字符数,到达文件末尾返回-1
    

while((temp = fis.read(bytes))!= -1){ System.out.println( new String(bytes,0,temp)); }
2.3.3 FileOutputStream
2.3.3.1 概述

  • java.io.OutputStream
  • java.io.FileOutputStream
  •  	将程序中内容 写出到硬盘中
    
  • 输入流找不到指定文件 会报错 , 但是输出流不会报错,会自动创建该文件,但是不会创建文件夹(目录) 关资源前要刷新flush

2.3.3.2 常用方法

  • 构造方法 :
  • FileOutputStream(String) : 把内容输,出到指定文件中,并会覆盖原文件中内容
  • FileOutputStream(String,boolean) : 如果第二个参数是true,把内容输出到指定文件中,并在原文件中追加数据。
  • 成员方法 :
  •  write(int i) : 写出整型
    
  •  write(byte[] b) : 写出字节数组,想要输出字符串可以利用字符串中的getBytes()方法,把字符串转换为字节数组
    
  •  flush() : 刷缓存,强制把缓冲区写出,避免造成数据遗漏
    

2.3.4 FileWriter
2.3.4.1 概述

  • java.io.Writer
  • java.io.File.Writer 字符输出流
  • 和字节输出流基本一致,新增字符串写出
    2.3.4.2 常用方法

2.4 缓冲流
缓冲流是包装流。 创建对象的时候,传入的参数不再是文件地址,而是文件流对象
作用 : 把每次读入的数据存入到一个缓冲区,然后一次写入(提升效率)

  •  	把输出的数据存入一个缓冲区,然后一次写出
    

如果缓存流关闭,那么传入的对应的文件流对象也会被关闭

  •  BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter
    

针对字符操作,提供了两个新方法
*readLine() : 读一行,返回值就是读到的这一行的数据,到达文件末尾,返回null
*newLine() : 换行,就等于\

2.4.1 BufferedInputStream
和 FileInputStream方法几乎一致,只是效率提高
2.4.2 BufferedOutputStream
2.4.3 BufferedReader

新增方法 readLine() 读取一行

2.4.4 BufferedWriter
新增输出换行方法 newLine()

2.5 转换流
转换流 是字节流和字符流之间转换 的桥梁,可以通过转换 流把字节流转换为字符流

  •  并且 还可以再转换过程中 指定字符编码
    

特点
转换流是指将字节流向字符流的转换,主要有InputStreamReader和OutputStreamWriter
InputStreamReader主要是将字节流输入流转换成字符输入流
OutputStreamWriter主要是将字节流输出流转换成字符输出流

2.5.1 InputStreamReader

2.6 打印流
2.6.1 概述

【特点】
打印流是输出最方便的类
包含字节打印流PrintStream,字符打印流PrintWriter
PrintStream是OutputStream的子类,把一个输出流的实例传递到打印流之后,可以更加方便地输出内容,相当于把输出流重新包装一下
PrintStream类的print()方法被重载很多次print(int i)、print(boolean b)、print(char c)

【标准输入/输出】
Java的标准输入/输出分别通过System.in和System.out来代表,在默认的情况下分别代表键盘和显示器,当程序通过System.in来获得输入时,实际上是通过键盘获得输入。当程序通过System.out执行输出时,程序总是输出到屏幕。

在System类中提供了三个重定向标准输入/输出的方法 
static void setErr(PrintStream err) 重定向“标准”错误输出流
static void setIn(InputStream in) 重定向“标准”输入流
static void setOut(PrintStream out)重定向“标准”输出流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。首先,广度优先搜索(BFS)是一种图搜索算法,可以用来解决一些问题,比如迷宫问题。在迷宫问题中,我们需要找到一条从起点到终点的最短路径。下面是用 Python 实现 BFS 解决迷宫问题的示例代码: ```python from collections import deque # 定义一个二维数组表示迷宫,0 表示可以走,1 表示障碍物 maze = [ [0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 1, 0], ] # 定义起点和终点 start = (0, 0) end = (4, 4) # 定义四个方向,上下左右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] def bfs(maze, start, end): # 定义队列,初始时将起点加入队列 queue = deque([start]) # 定义 visited 集合,用于记录已经访问过的位置 visited = set([start]) while queue: # 取出队列中的第一个节点 node = queue.popleft() # 如果当前节点是终点,返回到达终点的最短距离 if node == end: return distance[node[0]][node[1]] # 对于当前节点,遍历它的四个方向 for direction in directions: # 计算出下一个节点的坐标 next_node = (node[0] + direction[0], node[1] + direction[1]) # 如果下一个节点不越界且没有访问过,并且可以走(maze[next_node[0]][next_node[1]] == 0),将它加入队列和 visited 集合 if 0 <= next_node[0] < len(maze) and 0 <= next_node[1] < len(maze[0]) and next_node not in visited and maze[next_node[0]][next_node[1]] == 0: queue.append(next_node) visited.add(next_node) # 如果没有找到到达终点的路径,返回 -1 return -1 # 计算每个位置到起点的最短距离 distance = [[float('inf') for _ in range(len(maze[0]))] for _ in range(len(maze))] distance[start[0]][start[1]] = 0 bfs(maze, start, end) ``` 在上面的代码中,我们首先定义了一个迷宫,然后定义了起点和终点。接着,我们定义了四个方向,上下左右。接下来,我们定义了 bfs 函数,用于实现广度优先搜索。在 bfs 函数中,我们首先定义了一个队列和 visited 集合,用于记录已经访问过的位置。然后,我们将起点加入队列和 visited 集合。接着,我们进行循环,取出队列中的第一个节点,遍历它的四个方向。如果下一个节点不越界且没有访问过,并且可以走,我们将它加入队列和 visited 集合。最后,如果没有找到到达终点的路径,返回 -1。 最后,我们计算每个位置到起点的最短距离,并调用 bfs 函数求解最短路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值