当前位置: 首页 > news >正文

IO流与多线程

目录

一、IO流体系

1. File类基础操作

2. 字节流体系

3. 字符流体系

4.应用:

二、多线程体系

1. 线程创建方式对比

一、IO流体系

1. File类基础操作

核心知识点:

  • File类的作用:表示文件或目录的抽象路径名,用于文件和目录的创建、删除、重命名、查询等操作
  • 相对路径与绝对路径:理解两种路径的区别和使用场景
  • 路径分隔符:Windows使用\,Unix/Linux使用/,Java中使用File.separator保证跨平台性
  • 重要方法分类
    • 判断型exists(),isFile(),isDirectory(),canRead(),canWrite(),isHidden()
    • 获取型getName(),getPath(),getAbsolutePath(),getParent(),length()
    • 操作型createNewFile(),mkdir()/mkdirs(),delete(),renameTo()
    • 遍历型list(),listFiles(),list(FilenameFilter)

注意事项:

  • mkdir()只能创建单级目录,mkdirs()可创建多级目录

  • delete()无法删除非空目录
  • 文件操作前应先判断文件是否存在

2. 字节流体系

字节流基类:InputStream / OutputStream
├── 文件字节流:FileInputStream / FileOutputStream
├── 缓冲字节流:BufferedInputStream / BufferedOutputStream
├── 数据字节流:DataInputStream / DataOutputStream
├── 对象字节流:ObjectInputStream / ObjectOutputStream
├── 打印字节流:PrintStream
└── 字节数组流:ByteArrayInputStream / ByteArrayOutputStream

3. 字符流体系

字符流基类:Reader / Writer
├── 文件字符流:FileReader / FileWriter
├── 缓冲字符流:BufferedReader / BufferedWriter
├── 转换流:InputStreamReader / OutputStreamWriter
├── 打印字符流:PrintWriter
└── 字符数组流:CharArrayReader / CharArrayWriter

缓冲字符流特有方法

  • BufferedReader.readLine():读取一行文本
  • BufferedWriter.newLine():写入换行符

4.应用:

package o_IO.Test2; import java.io.*; import java.util.Scanner; public class Dome2 { public static void main(String[] args) throws IOException { /* 需求:写一个登陆小案例。(添加锁定账号功能) 步骤: 将正确的用户名和密码手动保存在本地的userinfo.txt文件中。 保存格式为:username=zhangsan&password=123&count=0 让用户键盘录入用户名和密码 比较用户录入的和正确的用户名密码是否一致 如果一致则打印登陆成功 如果不一致则打印登陆失败,连续输错三次账号锁定 */ //读取正确用户密码 BufferedReader br = new BufferedReader(new FileReader("src\\o_IO\\userinfo.txt")); String line = br.readLine();//username=zhangsan&password=123&count=0 br.close(); String[] split = line.split("&"); String rightUsername = split[0].split("=")[1]; String rightPassword = split[1].split("=")[1]; int count = Integer.parseInt(split[2].split("=")[1]); //用户输入账号密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名"); String username = sc.nextLine(); System.out.println("请输入密码"); String password = sc.nextLine(); //判断账号 if (username.equals(rightUsername) && password.equals(rightPassword) && count < 3) { System.out.println("登陆成功"); //count清零 writeInof(rightUsername,rightPassword,0); } else { if (count < 3) { count++; System.out.println("登陆失败,还剩下"+(3-count)+"次机会"); }else { System.out.println("账户锁定"); } writeInof(rightUsername,rightPassword,count); } } //定义方法将数据写回 public static void writeInof(String rightUsername,String rightPassword,int count) throws IOException { BufferedWriter bw = new BufferedWriter(new FileWriter("src\\o_IO\\userinfo.txt")); bw.write("username=" + rightUsername + "&password=" + rightPassword + "&count=" + count); bw.close(); } }

二、多线程体系

1. 线程创建方式对比

  1. 继承Thread类
    优点:简单直接
    缺点:单继承限制,不能继承其他类
    适用:简单任务,不需要共享资源
    package p_Thread.Chreadcase1; public class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName()+"Hello World"); } } } package p_Thread.Chreadcase1; public class ThreadDome { public static void main(String[] args) { /*多线程的第一种启动方式: 1.自己定义一个类继承Thread 2.重写run方法 3.创建子类的对象,并启动线程 */ MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); t1.setName("线程一"); t2.setName("线程二"); t1.start(); t2.start(); } }
  2. 实现Runnable接口
    优点:避免单继承限制,资源共享方便
    缺点:不能直接获取线程执行结果
    适用:需要资源共享的多线程
    package p_Thread.Chreadcase2; public class MyRun implements Runnable{ @Override public void run() { for (int i = 0; i < 100; i++) { //获取当前线程对象 Thread t = Thread.currentThread(); System.out.println(t.getName()+"HelloWorld"); } } } package p_Thread.Chreadcase2; public class ThreadDome { public static void main(String[] args) { /* 多线程的第二种启动方式: 1.自己定义一个类实现Runnable接口 2.重写里面的run方法 3.创建自己的类的对象 4.创建一个Thread类的对象,并开启线程 */ //创建MyRun对象 //表示多线程要执行的任务 MyRun mr = new MyRun(); //创建线程对象 Thread t1 = new Thread(mr); Thread t2 = new Thread(mr); //给线程起名字 t1.setName("线程一"); t2.setName("线程二"); //开启线程 t1.start(); t2.start(); } }
  3. 实现Callable接口
    优点:可以获取返回值,可以抛出异常
    缺点:需要FutureTask包装
    适用:需要返回结果的多线程任务
    package p_Thread.Chreadcase3; import java.util.concurrent.Callable; public class MyCallable implements Callable<Integer> { @Override public Integer call() throws Exception { int sum=0; for(int i=0;i<=100;i++){ sum+=i; } return sum; } } package p_Thread.Chreadcase3; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class ThreadDome { public static void main(String[] args) throws ExecutionException, InterruptedException { /* 多线程的第三种实现方式: 特点:可以获取到多线程运行的结果 1.创建一个类MyCallable实现callable接口 2.重写ca11 (是有返回值的,表示多线程运行的结果) 3.创建MyCallable的对象(表示多线程要执行的任务) 4.创建FutureTask的对象(作用管理多线程运行的结果) 5.创建Thread类的对象,并启动(表示线程) */ //创建MyCallable对象(表示多线程要执行的任务) MyCallable mc = new MyCallable(); //创建FutrueTask对象(管理多线程运行结果) FutureTask<Integer> ft = new FutureTask<>(mc); //创建线程对象 Thread t = new Thread(ft); //启动线程 t.start(); //获取结果 Integer result = ft.get(); System.out.println(result); } }
http://www.cnnetsun.cn/news/61185.html

相关文章:

  • JVM内存模型详解
  • 源启高校・郑航站圆满落幕!鸿蒙 6.0 适配实战 + 职业机遇双赋能,解锁开源新可能
  • 腾讯混元大模型开源:520亿激活参数改写行业效率标准
  • 计算机专业毕业=码农?网络安全正在重塑你的职业天花板
  • 120亿参数颠覆智能体市场:GLM-4.5-Air-FP8如何重新定义企业AI效率标准
  • Forget-Me-Not: 建议采用一种简单的提示技术,防止在长时间的提示中遗忘信息
  • 数据处理服务:G1/ZGC如何提升稳定性
  • 18、使用 Neutron 创建独立路由器
  • 什么是回溯算法
  • 7、OpenStack网络配置与Linux桥接网络详解
  • Web服务器性能优化终极指南:快速提升响应时间
  • 古城景区管理|基于springboot + vue古城景区管理系统(源码+数据库+文档)
  • 腾讯开源HunyuanVideo-Avatar:一张照片+14秒音频,开启数字人创作全民时代
  • AI提示词实战技巧:从新手到专家的五个关键突破
  • agsXMPP使用
  • HTML图像与多媒体:img、picture、figure、video标签深度解析
  • 区块链 Web3 外包开发公司
  • Claude Code Router智能路由系统:5步实现多AI模型自动调度
  • 3天掌握专业RAW照片处理:darktable零基础快速上手指南
  • CogAgent-9B:2025年视觉语言模型的GUI交互革命
  • Awesome-CV模板完全攻略:打造专业双语简历的终极方案
  • PowerShell自动化运维终极指南:系统管理的革命性工具集
  • 解锁Discord隐藏权限:从用户视角到管理视角的无缝切换
  • 35亿参数重构边缘智能:Liquid AI LFM2-350M开启终端AI效率革命
  • AI产品经理思维揭秘:普通人如何转型成为未来10年最抢手的职业人才!
  • 大语言模型开源突破终极指南:从万亿参数到产业落地
  • 专业的外贸推广电话
  • SimHei字体下载完全指南:轻松解决中文显示难题
  • 基于springboot + vue学习测评系统(源码+数据库+文档)
  • 基于springboot + vue医院管理系统(源码+数据库+文档)