每天一次IO流复习


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
 * 文件工具类
 * @author stu
 *
 */
public class FileUtil {
	/**
	 * 拷贝文件的方法
	 * @param from 从哪儿复制
	 * @param to 复制到哪儿去
	 */
	public void copyFile(String from,String to){
		FileInputStream fis = null;//声明流对象
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(from);//实例化流对象
			fos = new FileOutputStream(to);
			byte [] bytes = new byte[1024];//缓冲字节数组 
			int len = 0;
			//循环写到输出流中去
			while((len = fis.read(bytes))!=-1){
				fos.write(bytes, 0, len);//写数据出去,bytes数组中从0开始到len结束
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//关闭流,一定要关闭,遵循原则先开后关,后开先关
			if(fos !=null)
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if(fis !=null)
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
	/**
	 * 读取与写出去文本文件
	 * @param from 读取文本文件的路径
	 * @param to 写出去文本文件的路径
	 */
	public void readWriteFile(String from,String to){
		FileReader fr = null;//声明字符输入流
		BufferedReader br = null;//声明缓冲输入流
		FileWriter fw = null;//声明字符输出流
		BufferedWriter bw = null;//声明缓冲输出流
		StringBuilder sb = new StringBuilder();//
		try {
			fr = new FileReader(from);//实例化各种流对象
			br = new BufferedReader(fr);
			fw = new FileWriter(to);
			bw = new BufferedWriter(fw);
			String temp = null;
			while((temp = br.readLine())!=null){
				sb.append(temp+"\n");
			}
			bw.write(sb.toString());//使用缓冲输出流写出字符串
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//关闭流
			if(bw !=null)
				try {
					bw.close();
				} catch (IOException e3) {
					e3.printStackTrace();
				}
				if(fw !=null)
					try {
						fw.close();
					} catch (IOException e2) {
						e2.printStackTrace();
					}
					if(br !=null)
						try {
							br.close();
						} catch (IOException e1) {
							e1.printStackTrace();
						}
						if(fr !=null)
							try {
								fr.close();
							} catch (IOException e) {
								e.printStackTrace();
							}
		}
	}
	
	/**
	 * 
	 * @param path 对象写到哪儿去
	 * @param obj 写出去的对象,必须进行序列化
	 */
	public void writeObject(String path ,Object obj){
		ObjectOutputStream oos = null;//声明对象输出流对象
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(path);
			oos = new ObjectOutputStream(fos);
			oos.writeObject(obj);//对象输出流写出去对象
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//关闭流
			if(oos !=null)
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if(fos !=null)
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
	/**
	 * 读取对象
	 * @param path 对象所在的文件路径
	 * @return 读取出来的对象
	 */
	public Object readObject(String path){
		FileInputStream fis = null;//声明流对象
		ObjectInputStream ois = null;
		Object obj = null;
		try {
			fis = new FileInputStream(path);//实例化流对象
			ois = new ObjectInputStream(fis);
			obj = ois.readObject();//使用对象输入流读取对象
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally{
			//关闭流
			if(ois !=null)
				try {
					ois.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if(fis !=null)
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		return obj;
	}
	/**
	 * 
	 * @author stu
	 *		序列化对象就是实现Serializable接口
	 */
	class Goods implements Serializable{
		private String name ;
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public double getPrice() {
			return price;
		}
		public void setPrice(double price) {
			this.price = price;
		}
		private double price;
	}
}

<think>好的,用户之前已经询问过关于能否重新进入计算机行业以及需要哪些技能的问题,现在他进一步要求制定一个详细的学习计划。我需要根据之前的回答来扩展,提供一个具体的时间安排和步骤。 首先,回顾之前的建议,用户有ETL经验,但有两年的空窗期。需要弥补技术栈的更新,尤其是云计算、实时数据处理和现代工具。用户现在需要的是一个详细到每周或每月的计划,帮助他系统性地学习。 用户可能的深层需求是结构化的指导,确保他能高效地恢复竞争力,找到工作。他可能担心时间不够或者方向不对,因此计划需要明确、可行,并且有阶段性的目标,以增强他的信心。 接下来,我需要把之前提到的技能体系升级方案转化为具体的学习模块,分阶段安排。比如,基础重建、核心突破、项目实战等阶段,每个阶段分配合理的时间,并推荐学习资源。 还要考虑用户的学习时间,之前建议每天3小时,所以在计划中需要平衡学习内容和时间安排,避免过于紧张导致放弃。同时,加入求职准备部分,帮助他在学习的同时优化简历和面试技巧。 需要确保每个阶段都有明确的目标和输出,比如完成认证、GitHub项目、技术博客等,这些都能作为求职时的证明。同时,针对不同行业的需求,推荐特定的领域知识,比如金融数据治理或工业物联网,增加就业机会。 最后,保持鼓励的语气,强调坚持和调整的重要性,让用户有动力执行计划,并根据实际情况灵活调整。确保整个计划既有挑战性,又切实可行。</think>以下是针对您的背景和求职目标制定的详细学习计划(6个月周期),结合当前市场需求和技术趋势: --- ### **第一阶段:基础重建(1-2个月)** #### 📌 **目标**:恢复技术敏感度+更新知识体系 ```mermaid gantt title 第一阶段计划 dateFormat YYYY-MM-DD section 云计算基础 AWS/Azure入门 :active, des1, 2023-09-01, 15d 云数仓实操 :des2, after des1, 15d section SQL强化 高级查询优化 :crit, active, 2023-09-01, 20d 执行计划解析 :crit, 2023-09-10, 15d section 开发环境 Docker基础 :des3, 2023-09-16, 10d Git全程实践 :des4, after des3, 5d ``` #### 📚 **每日学习安排(3小时)**: - **晨间1小时**:刷LeetCode SQL题(重点:窗口函数/查询优化) - 推荐平台:HackerRank《Advanced SQL》模块 - **午后1小时**:云平台实验(建议选择AWS) - 必做实验:Redshift数据加载、Glue爬虫配置 - **晚间1小时**:技术文档阅读 - 必读材料:dbt官方文档前5章、Airflow调度原理 #### 🛠️ **阶段成果**: 1. 完成云平台免费认证(如AWS Cloud Practitioner) 2. GitHub上传2个ETL优化案例(附SQL性能对比报告) 3. 产出1篇技术文章(建议主题:《从传统ETL到云数仓的技术迁移路径》) --- ### **第二阶段:核心技术突破(2-3个月)** #### 📌 **目标**:构建现代数据工程能力栈 ```mermaid mindmap root((核心技能)) 实时处理 Kafka消息队列 Flink窗口计算 数据治理 Great Expectations Apache Atlas元数据 基础设施即代码 Terraform部署水线 K8s基础编排 ``` #### 📅 **重点模块学习顺序: 1. **Week 5-6**:Kafka实战 - 搭建本地集群 - 实现订单数据实时采集管道 2. **Week 7-8**:Flink处理 - 完成Flink官方培训课程 - 开发实时风控规则引擎(模拟场景) 3. **Week 9-10**:数据治理体系 - 使用Great Expectations构建数据质量监控看板 - 实现元数据自动采集系统 #### 📚 **配套学习资源**: - 视频课程:《Flink in Action》(Udemy最新版) - 实验平台:Confluent Cloud免费试用环境 - 开源项目:Apache Beam示例代码库 --- ### **第三阶段:项目实战(1-2个月)** #### 🎯 **选择项目方向建议**: ```mermaid pie title 项目领域分布 "金融反欺诈" : 35 "工业物联网" : 25 "零售用户画像" : 40 ``` #### 📝 **项目执行要点**: 1. **电商用户行为分析系统** - 技术栈:Airflow + dbt + Redshift + Metabase - 核心指标:构建RFM分层模型,实现自动化用户分群 2. **制造业设备预警系统** - 技术栈:Kafka + Flink + TimescaleDB - 关键算法:滑动窗口异常检测(需数学推导过程) 3. **跨云数据迁移方案** - 技术栈:Terraform + AWS/Azure混合云 - 文档要求:编写完整的SOP操作手册 #### 🔍 **项目包装技巧**: - 在GitHub仓库中包含: - `architecture.png` 系统架构图(使用draw.io绘制) - `performance_test.md` 性能压测报告 - `cost_analysis.xlsx` 云资源成本估算表 --- ### **第四阶段:求职冲刺(0.5-1个月)** #### 📊 **简历优化矩阵**: | 原始描述 | 升级版表述 | 量化指标 | |-------------------|-----------------------------------|--------------------| | "开发ETL脚本" | "设计分布式数据加载策略" | 处理量提升40% | | "维护数据库" | "主导查询性能调优工程" | 响应时间降低65% | #### 🎤 **高频技术面试题准备**: 1. 批一体架构设计(重点准备Exactly-Once语义实现) 2. 云数仓与传统数仓成本对比分析(需准备计算公式) 3. 数据质量监控的六维度模型(完整性/准确性/一致性等) #### 💼 **目标岗位投递策略**: - 首推:传统行业数字化转型部门(成功案例:某汽车集团数据中台建设) - 备选:云服务商合作伙伴(如埃森哲云迁移团队) - 保底:中型企业BI工程岗(侧重报表体系建设) --- ### **学习效果保障机制** 1. **双周复盘制度**: - 每两周完成一次知识体系图谱更新(推荐使用XMind) - GitHub提交量硬性要求:每周≥3次有效commit 2. **技术社区参与**: - 每月参加2次Data Council等线上会议 - 在Stack Overflow累计50+有效回答 3. **模拟面试安排**: - 第3个月起每周1次模拟面试(可加入技术社群互面) --- ### **风险控制方案** 1. **技术路线偏离**: - 每月比对BOSS直聘最新JD,动态调整学习重点 2. **学习倦怠期**: - 建立番茄钟打卡制度(推荐Forest专注森林) - 加入DataTalks等学习社群(群体监督机制) 3. **就业市场变化**: - 重点关注政策导向领域(如"东数西算"工程相关岗位) 建议每天保持早9-10点、晚8-10点的深度学习时段(大脑黄金记忆期),配合Anki制作技术卡片复习。坚持6个月后,预计可达到年薪20-35W的岗位门槛(数据来源:拉勾网2023数据工程岗位报告)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值