Java学习Day29:查漏补缺

news2024/9/22 7:38:17

1.只创建对象不创建文件

2.过滤器

使用匿名内部类实现FileFilter接口,实现过滤;

递归实现遍历目录及子目录下的后缀为。txt文件

public class ioRee {
    public static void main(String[] args) throws IOException {
        File file =new File("D:\\A");
        info(file);
    }
    public static void info(File file){
        if (file.isDirectory()){
            File [] arr =file.listFiles();
            for (File f:arr) {
                info(f);
            }
        }
        else if (file.getName().endsWith(".txt")){
            System.out.println(file);
        }
    }
}

3.字节流

那如何想把内存中的数据读到内存中,我们通过InputStream可以实现。InputStream此抽象类,是表示字节输入流的所有类的超类。定义了字节输入流的基本共性功能方法。

 output类似

字节流转换时,读数据使用

FileInputStream fileInputStream = new FileInputStream("D:\\A\\ABC.txt");
int len =0;
byte [] bytes =new byte[1024];
while ((len=fileInputStream.read(bytes))!=-1) System.out.println(new String(bytes, 0, len));

写数据

String s =new String(bytes);
byte [] b = s.getBytes(StandardCharsets.UTF_8);
o.write(b);

使用byte数组非常方便

4.字符流

字符流输入直接用String型,从文件中时不用使用辅助数组,将len直接强转char即可读取使用。

5.转换流

  1. 字节流到字符流的转换
    • 转换流如InputStreamReaderOutputStreamWriter,分别用于将字节输入流转换为字符输入流,以及将字节输出流转换为字符输出流。这种转换使得开发者可以更方便地按照字符而不是字节的方式来读取和写入数据。
  2. 编码转换
    • 在进行字符数据的读写时,经常需要指定字符编码(如UTF-8、GBK等)。转换流允许开发者在构造时指定字符编码,从而解决因编码不一致导致的乱码问题。

6.序列化

用来存储一整个对象,输出对象

7.线程(多线程实现方法一,使用Thread)

创建一个类继承线程类

Thread

名称  get、setname

休眠      Thread.sleep(2000)

守护线程     thread.setDaemon(true);

thread.join(),        当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续;

Thread.yield()    static void yield() 暂停当前正在执行的线程对象,并执行其他线程。

8.runnable方法(多线程实现方法一,使用Thread)


callable

相比于runnable    run()变成了call()并且可以有返回值

支持泛型返回值

可以抛出异常

1. 创建Callable对象

Callable<Integer> myCallable = new MyCallable();

这里创建了一个MyCallable的实例,MyCallable实现了Callable<Integer>接口。与Runnable接口不同,Callable接口允许任务完成时返回一个结果。在这个例子中,MyCallablecall方法会计算0到99的整数和,并返回这个和。

2. 使用FutureTask包装Callable对象

FutureTask<Integer> ft = new FutureTask<Integer>(myCallable);

FutureTask是一个实现了RunnableFuture接口的类,它用于包装CallableRunnable对象。在这个例子中,它被用来包装myCallable对象。FutureTask提供了一种机制来启动和取消计算,查询计算是否完成,以及检索计算结果。

3. 在主线程中执行循环,并在特定条件下启动新线程

for (int i = 0; i < 1000; i++) {
// ...
if (i == 30) {
Thread thread = new Thread(ft);
thread.start();
}
}

主线程执行一个循环,当循环变量i等于30时,它创建一个新的线程,并将之前创建的FutureTask对象ft作为这个线程的Runnable目标。这意味着新线程将执行ftrun方法,而FutureTaskrun方法会调用其内部Callable对象的call方法。

4. 等待新线程完成并获取结果

try {
int sum = ft.get();
System.out.println("sum = " + sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

在主线程中,调用ft.get()会阻塞当前线程(即主线程),直到FutureTaskcall方法执行完成并返回结果。如果call方法成功完成,

class MyCallable implements Callable<Integer> { // 与run()方法不同的是,call()方法具有返回值 @Override public Integer call() { int sum = 0; for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); sum += i; } return sum; } }get方法将返回其结果。如果call方法抛出异常,则get方法将抛出ExecutionException。如果等待过程中当前线程被中断,则get方法将抛出InterruptedException

5. 线程执行流程

  • 主线程执行循环,当i等于30时,启动一个新线程来执行FutureTaskrun方法。
  • 新线程执行FutureTaskrun方法,该方法调用Callable对象的call方法,计算0到99的和。
  • 同时,主线程继续执行循环直到完成,然后调用ft.get()等待新线程完成并获取结果。
  • 当新线程完成call方法的执行后,它设置FutureTask的结果,然后主线程通过get方法获取这个结果并打印出来。

6. 注意事项

  • 在这个例子中,主线程和新线程之间存在明显的竞争条件。主线程可能在新线程完成之前就尝试获取结果,但由于get方法的阻塞特性,它会等待直到结果可用。
  • 如果不需要在call方法执行期间在主线程中执行其他任务,可以考虑直接在主线程中调用ft.run()(但这样会失去异步执行的好处)。然而,由于FutureTaskrun方法被设计为供线程执行,直接调用它通常不是最佳实践。正确的做法是让另一个线程执行它,如示例中所示。

9.同步

多线程共享数据不安全

线程同步两种方式

1.同步代码块

使用Object lock = new Object();

同步锁object,把想同步的代码块方进synchronized (lock){} 中,即可实现同步

2.同步方法

将synchronized关键字加到方法声明上,接可以省略掉object锁

10.线程组、池

使用线程组时,需要这样定义线程:thread(线程组名,runnable实例名,线程名),默认创建线程都在main方法下;

池:

11.UDP

发送信息时需要注意:

DatagramePacket(打包数据){数据名称,数据长度,目标地址, 目标端口号 }

DatagrameSocket(发送数据){发送端端口号}

发送Socket.send(数据包Packet)

发送端:

接收端:

实现持续发送:

此处与下文有区别!

1.直接从控制台读取和输入容器使用DatagramPacket datagramPacket 即可,初始化使用datagramPacket=new DatagramPacket (bytes,bytes.length, InetAddress.getLocalHost(),456);

此处定义接收端口;使用byte【】接收

2.若从文件中读取,是用转换流容器,初始化写明socket.getOutputStream()字符输入流和字符集;使用char 【】 接收;

outputStreamWriter=new OutputStreamWriter(socket.getOutputStream(),"UTF-8");
public class 网络编程sender {
    public static void main(String[] args) {
        DatagramPacket datagramPacket=null;
        DatagramSocket datagramSocket=null;
        Scanner scanner = new Scanner(System.in);
        String str ="";
        try {
            datagramSocket=new DatagramSocket(123);
            while (!str.equals("end")){
                System.out.println("聊天中,输入end以结束聊天!");
                str=scanner.next();
                byte [] bytes =str.getBytes(StandardCharsets.UTF_8);
                datagramPacket=new DatagramPacket
               (bytes,bytes.length, InetAddress.getLocalHost(),456);
                datagramSocket.send(datagramPacket);
            }
        } catch (SocketException e) {
            throw new RuntimeException(e);
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            if (datagramSocket!=null){
                datagramSocket.close();
            }
        }
    }
}

=========================================================================

public class 网络编程receiver {
    public static void main(String[] args) {
        DatagramPacket datagramPacket=null;
        DatagramSocket datagramSocket=null;
        try {
            datagramSocket=new DatagramSocket(456);
           while (true){
               byte [] bytes =new byte[1024];//定义数据容器
               datagramPacket=new DatagramPacket(bytes, bytes.length);//定义包的大小
               datagramSocket.receive(datagramPacket);//使用接口接收数据包
               bytes =datagramPacket.getData();//数据放入容器
               System.out.println(new String(bytes,0, datagramPacket.getLength()
               //使用datagramPacket.getLength()防止出现未初始化的字符));//输出
           }
        } catch (SocketException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

12.TCP       

需要一个服务端  SeverSocket

【1.定义serverPocket】

【2.pocket=serverPocket.accept】

【3.用转换流接收客户端传来的packet将字节流转为字符流inputstreamReader =   

new inputstreamReader(socket.getInputStream,"UTF-8")】

【4.选择输出方向,控制台输出则直接用数组接收,写入文件则需要用outputstreamWriter转换流转换FileinputStream文件字符流输入文件:outputstreamWriter=new outputstreamWriter (FileoutPutstream (文件位置,"UTF-8"))】

注:转换流接收的是char数组,返回int值

和若干个客户端  Socket

OUTPUT最好加上编码类型 getoutstream(new FileoutputStream , "UTF-8");

================================服务器端==================================

serverSocket=new ServerSocket(123);//定义服务端接口
socket=serverSocket.accept();//定义套接字
//读写操作
inputStreamReader=new InputStreamReader(socket.getInputStream(),"UTF-8");//字节流转换为字符流
outputStreamWriter=new OutputStreamWriter(new FileOutputStream("D:\\A\\a.txt"),"UTF-8");//保存到本地
char [] chars =new char[1024];
int len;
while ((len=inputStreamReader.read(chars))!=-1){
    outputStreamWriter.write(new String(chars,0,len));
}

=================================客户端==================================

inputStreamReader=new InputStreamReader(new FileInputStream("D:\\A\\student.txt"));//read
socket=new Socket(InetAddress.getLocalHost(),123);//creat bag
outputStreamWriter=new OutputStreamWriter(socket.getOutputStream(),"UTF-8");
char [] datas =new char[1024];
int len;
while ((len=inputStreamReader.read(datas))!=-1){
    String s =new  String(datas,0,len);
    outputStreamWriter.write(s);
    outputStreamWriter.flush();//刷新数据,不然传不过去
}

============================多线程实现=====================================

=============================服务器端====================================

public class serverSocket {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStreamReader inputStreamReader=null;
        OutputStreamWriter outputStreamWriter=null;
        Object obj =new Object();
        try {
            serverSocket=new ServerSocket(123);//定义服务端接口
            while (true){
           //加while循环保证服务器一直处于打开的状态,以便于接收多个客户端的数据传输
                synchronized (obj){
                 //加互斥锁保证多个客户端互斥访问创建文件代码
                    socket=serverSocket.accept();//定义套接字
                    //读写操作
                    inputStreamReader=new                   InputStreamReader(socket.getInputStream(),"UTF-8");
//字节流转换为字符流
                    outputStreamWriter=new OutputStreamWriter(new FileOutputStream("D:\\A\\ABC\\"+new Random().nextInt(20)));
//保存到本地
                    char [] chars =new char[1024];
                    int len;
                    while ((len=inputStreamReader.read(chars))!=-1){
                        outputStreamWriter.write(new String(chars,0,len));
                    }
                    outputStreamWriter.flush();
                   //及时刷新输出流可以将数据更新进文件
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
//        }finally {
//            if (serverSocket!=null){
//                try {
//                    serverSocket.close();
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//            if (socket!=null){
//                try {
//                    socket.close();
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//            if (inputStreamReader!=null ){
//                try {
//                    inputStreamReader.close();
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//            if (outputStreamWriter!=null){
//                try {
//                    outputStreamWriter.close();
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//        }
    }
}}

=================================客户端==================================

new Thread(){
    @Override
    public void run() {
        Socket socket=null;
        InputStreamReader inputStreamReader=null;
        OutputStreamWriter outputStreamWriter=null;
        try {
            inputStreamReader=new InputStreamReader(new FileInputStream("D:\\A\\tcp.txt"));//read
            socket=new Socket(InetAddress.getLocalHost(),123);//creat bag
            outputStreamWriter=new OutputStreamWriter(socket.getOutputStream(),"UTF-8");
            char [] datas =new char[1024];
            int len;
            while ((len=inputStreamReader.read(datas))!=-1){
                String s =new  String(datas,0,len);
                outputStreamWriter.write(s);
                outputStreamWriter.flush();//刷新数据,不然传不过去
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (inputStreamReader!=null){
                try {
                    inputStreamReader.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}.start();
 new Thread(){
     @Override
     public void run() {
         Socket socket=null;
         InputStreamReader inputStreamReader=null;
         OutputStreamWriter outputStreamWriter=null;
         try {
             inputStreamReader=new InputStreamReader(new FileInputStream("D:\\A\\tcp1.txt"));//read
             socket=new Socket(InetAddress.getLocalHost(),123);//creat bag
             outputStreamWriter=new OutputStreamWriter(socket.getOutputStream(),"UTF-8");
             char [] datas =new char[1024];
             int len;
             while ((len=inputStreamReader.read(datas))!=-1){
                 String s =new  String(datas,0,len);
                 outputStreamWriter.write(s);
                 outputStreamWriter.flush();//刷新数据,不然传不过去
             }

         } catch (IOException e) {
             throw new RuntimeException(e);
         }finally {
             if (socket!=null){
                 try {
                     socket.close();
                 } catch (IOException e) {
                     throw new RuntimeException(e);
                 }
             }
             if (inputStreamReader!=null){
                 try {
                     inputStreamReader.close();
                 } catch (IOException e) {
                     throw new RuntimeException(e);
                 }
             }
         }
     }
 }.start();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pywebview 入门

pywebview 入门 文档地址 地址 https://pywebview.flowrl.com/guide/ 一、pywebview 简介 1. 什么是 pywebview&#xff1f; pywebview 是一个轻量级的 python 库&#xff0c;旨在简化桌面应用程序的开发。它利用系统的 WebView 组件&#xff0c;使得开发人员可以使用现代 …

web过滤器,前后端同步异步交互,跨域问题,json等知识点

一.过滤器 (1)什么是过滤器 过滤器(Filter)&#xff1a;是web服务器管理所有的web资源例如servlet,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等。 (2)过滤器的作用 通过过滤器可以实现对服务器web资源的拦截&#xff0c;例如编码过滤器通过对web资源的过滤拦截可以实…

python-素数回文(赛氪OJ)

[题目描述] 现在给出一个素数&#xff0c;这个素数满足两点&#xff1a; 1、 只由 1∼9 组成&#xff0c;并且每个数只出现一次&#xff0c;如 13,23,1289 。 2、 位数从高到低为递减或递增&#xff0c;如 2459,87631 。 请你判断一下&#xff0c;这个素数的回文数是否为素数&a…

python之matplotlib (1 介绍及基本用法)

介绍 matplotlib是Python中的一个绘图库&#xff0c;它提供了一个类似于 MATLAB 的绘图系统。使用matplotlib你可以生成图表、直方图、功率谱、条形图、错误图、散点图等。matplotlib广泛用于数据可视化领域&#xff0c;是 Python 中最著名的绘图库之一。 同样matplotlib的安…

day23-测试自动化之Appium的滑动和拖拽事件、高级手势ActionChains、手机操作API

目录 一、滑动和拖拽事件 1.1.应用场景 1.2.swipe滑动事件 1.3.scroll滑动事件 1.4.drag_and_drop拖拽事件 1.5.滑动和拖拽事件的选择 二、高级手势ActionChains 2.1.应用场景 2.2.使用步骤 2.3.注意点 2.4.方法 1).手指轻敲操作 (掌握) 2).手势按下和抬起操作(掌握&#xff0…

【Win/Mac】InDesign 2024(id2024排版和设计软件)中文安装版

目录 一、软件概述 二、下载 三、主要特点 系统要求&#xff08;Windows 系统&#xff09; 一、最低系统要求 二、推荐系统要求 三、图形处理器要求 系统要求&#xff08;Mac 系统&#xff09; 一、最低系统要求 二、推荐系统要求 三、图形处理器要求 使用方法 一、…

【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…

缓存学习

缓存基本概念 概念 对于缓存&#xff0c;最普遍的理解是能让打开某些页面速度更快的工具。从技术角度来看&#xff0c;其本质上是因为缓存是基于内存建立的&#xff0c;而内存的读写速度相比之于硬盘快了xx倍&#xff0c;因此用内存来代替硬盘作为读写的介质当然能大大提高访…

亲测解决OneDrive: Proxy Authentication Error - 2606

这个问题由网络配置有误引起&#xff0c;解决方法是换网络或者关闭代理。 解决方法 换一个网络&#xff0c;比如手机wifi。如果开了代理可以把代理关了。 原版笔记 use vanilla network

RK3588——Linux系统烧录(以Firefly的Core-3588L为例)

Firefly的Core-3588L官网 1. 硬件连接 首先先用Type-C 一端数据线板子的OTG&#xff0c;另一端连接电脑的USB。 按住设备上的 RECOVERY &#xff08;恢复&#xff09;键并保持&#xff0c;连接电源&#xff0c;保持2秒左右&#xff0c;松开RECOVERY &#xff08;恢复&#xff…

图模型训练

一、依赖安装 网址&#xff1a;pyg-team/pytorch_geometric: Graph Neural Network Library for PyTorch (github.com) 找到此处&#xff0c;点击here进入依赖安装界面 找到自己安装的torch版本并点击&#xff0c;&#xff0c;进入安装依赖 二、用库自带的数据集 代码&#x…

WCT系列(二):SyncTransactionQueue类详解

SyncTransactionQueue类&#xff1a; 接上一回的WindowContainerTransaction类讲解&#xff0c;上一篇博客根据TaskView.java中的updateTaskVisibility()方法分析了WindowContainerTransaction的功能及使用。本次继续上一篇的思路&#xff0c;主要拆解syncTransactionQueue类。…

【JUC】06-可重入锁

可重入锁&#xff1a;又称递归锁。在外层使用锁后&#xff0c;内层仍然可以使用&#xff0c;并不发生死锁&#xff0c;这样的锁就叫可重入锁。synchronized默认是一个可重入锁。 public class Demo01 {public synchronized void m1() {System.out.println(Thread.currentThrea…

软件函数过期-软件开发故障处理-开发语言升级-全栈软件架构师-软件修仙界掌握几十门开发语言

一、软件界通用关键字 obsolete&#xff0c;deprecated&#xff0c;deprecation 二、多语言全栈&#xff0c;所有语言混合开发是什么&#xff1f;十几门开发语言 组合1、php/java/aspJSCandroid 平台物联网设备&#xff0c;智能音箱 组合2&#xff1a;C#PHPPYTHON 组合3&am…

云计算的三大服务模式:IaaS、PaaS、SaaS的深入解析

在数字化转型的浪潮中&#xff0c;云计算以其独特的灵活性、可扩展性和成本效益&#xff0c;正逐渐成为企业IT架构的核心。云计算提供了三种主要的服务模式&#xff0c;分别是基础设施即服务&#xff08;IaaS&#xff09;、平台即服务&#xff08;PaaS&#xff09;和软件即服务…

【算法/学习】双指针

✨ 少年要迎着朝阳&#xff0c;活得肆无忌惮 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;算法学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &a…

挑战1G内存!如何在千万记录中找到最热TOP10查询串?

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 哈喽大家好!我是你们的技术小伙伴小米,今天又来和大家分享一个非常实用的算法题!假设我们现在有1000w个查询记录,这些记录中有很多重复的内容,但去…

内存碎片问题—容器启动状态卡在ContainerCreating

线上发现部分容器处于ContainerCreating状态: 查看kubelet日志&#xff1a; [rootdc07-prod-k8s-node /root] journalctl -u kubelet Jul 01 00:45:30 prod-k8s-node kubelet[12227]: I0701 00:45:30.491326 12227 kubelet.go:1908] SyncLoop (ADD, "api"): &quo…

RK3568笔记五十五:yolov10训练部署测试

若该文为原创文章,转载请注明原文出处。 yolov8还没熟悉,yolov10就出来了,本篇记录使用yolov10训练自己的数据,并部署到rk3568上。 参考大佬的博客yolov10 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快_yolov10 rknn-CSDN博客 一、…

【网络编程】基于UDP的TFTP文件传输

1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09; mail&#xff1a;已经不再…