JavaSE基础及案例(一)IO流与多线程(上)

别急着让AI画板!聊聊Cadence Allegro X AI和OrCAD X在实际PCB项目中的真实体验 本文分享了Cadence Allegro X AI与OrCAD X在PCB设计中的实际应用体验,探讨了AI辅助Layout的效率提升与潜在陷阱。通过高速ADC采集板案例,详细对比了AI与传统方法在电源平面分割、低速信号布线等任务中的表现,并总结了人机协作的最佳实践,为工程师提供实用参考。 阅读详情

IO流

1. IO流知识点
IO流(字符输入流FileReader) 字节输入流 FileInputStream

IO流(字符输出流FileWriter) 字节输出流 FileOutputStream

字符缓冲区输入流( BufferedReader)
字节缓冲区输入流BufferedInputStream

字符缓冲区输出流( BufferedWriter)
字节缓冲区输出流BufferedOutputStream

2. 实战案例
案例2.1 将键盘录入拷贝到当前项目下的text.txt中,键盘录入数据遇到quit时就退出

public class demo12 {
     /**
      * @param args
      * 将键盘录入拷贝到当前项目下的text.txt中,键盘录入数据遇到quit时就退出
      *
      * 1.创建键盘录入对象
      * 2.创建输出流对象,关联text.txt文件
      * 3.定义无限循环
      * 4.遇到quit退出
      * 5.没有quit就将内容写出
      * 6.关流
      * @throws IOException
      */
     public static void main(String[] args) throws IOException{
          Scanner sc = new Scanner(System.in);//创建键盘录入对象
          //2.创建输出流对象,关联text.txt
          FileOutputStream fos = new FileOutputStream("text.txt");
          //3.定义无限循环
          while(true){
              String nl = sc.nextLine();//将键盘录入对象写在line中
              //4.遇到quit退出
              if("quit".equals(nl)){
                   break;
              }else{//5.没有quit就将内容写出
                   fos.write(nl.getBytes());//字符串必须转换成字节数组
                   fos.write("\r\n".getBytes());
              }
              fos.close();
          }
     }
}

结果:将111111.txt写入到了text文件中。。。。。。。。。。。。。。。
***案例2.2***模拟收费软件试用次数

public class test {
     /**
      * @param args
      * 模拟试用版软件,10次机会
      *
      * 1.创建带缓冲的输入流对象,使用readLine方法,保证数据的原样性
      * 2.将读到的字符串转换成int数;
      * 3.对int数进行判断,如果大于0,将其--写回去,如果不大于0,提示请购买正版
      * 4.在if判断将要--的结果打印,并将结果通过输出流写到文件上
      * @throws IOException
      */
     public static void main(String[] args) throws IOException{
          //1.创建带缓冲的输入流对象,使用readLine方法,保证数据的原样性
          BufferedReader br = new BufferedReader(new FileReader("config.txt"));
          //2将读到的字符串转换成int类型
          String line = br.readLine();
          //将数字字符串转换成数字
          int times = Integer.parseInt(line);
          //3.对int数进行判断,如果大于0,将其--写回去,如果不大于0,提示请购买正版
          if(times>0){
              System.out.println("您还有"+times--+"次机会");
              FileWriter fw = new FileWriter("config.txt");
              fw.write(times+"");
              fw.close();
          }else{
              System.out.println("已结束,请购买正版");
          }
          //关闭流
          br.close();
     }
}

案例3 IO流获取文本字符出现次数

/**
 * @author 
 *
 *1.创建带缓冲的输入流对象
 *2.创建双列集合对象
 *3.将读到的字符存储在双列集合中,存储的时候做判断,如果不包含这个键
 *   就将键和1存储,如果包含这个键,就将键和值加1存储
 *4.关闭输入流
 *5.创建输出流
 *6.遍历集合,将集合中的内容写到times.txt中,
 *7.关闭输出流
 */
public class demo1_Wrap {
     public static void main(String[] args) throws IOException{
          //1.创建待缓冲的输入流对象
          BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
          //2.创建双列集合
          TreeMap<Character, Integer> tm = new TreeMap<>();
          //3.判断
          int ch;
          while((ch=br.read())!=-1){
              //向下强转
              char c = (char)ch;
              /*if(!tm.containsKey(c)){//如果集合不包含,就把字符加入,计数1次
                   tm.put(c, 1);
              }else{//如果集合已经包含该字符,则次数+1(次数通过键获取值>>>tm.get(c)+1)
                   tm.put(c, tm.get(c)+1);
              }*/
              //三元运算符表示
              tm.put(c, !tm.containsKey(c)? 1 :tm.get(c)+1);
              
          }
          //4.关流
          br.close();
          //5.创建输出流对象
          BufferedWriter bw = new BufferedWriter(new FileWriter("times.txt"));
          //6.遍历集合,将集合内容写到times.txt中
          for (Character key : tm.keySet()) {
              bw.write(key+"="+tm.get(key));//写出键和值
              bw.newLine();//换行
          }
          //7.关闭输出流
          bw.close();
     }
}

案例4 拷贝文件

public class demo11 {
     public static void main(String[] args) throws IOException{
          //获取文件
          File file = getFile();
      //BufferedInputStream和BufferOutputStream拷贝
          BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));//读取数据,创建输入流对象
          BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getName()));//创建输出流对象
          int b;
          while((b=bis.read())!=-1){
              bos.write(b);
          }
          bis.close();
          bos.close();
     }
     /**
      * @return
      * 定义一个方法获取键盘录入的文件路径(仅获取文件)
      */
     public static File getFile(){
          Scanner sc = new Scanner(System.in);
          while(true){
              String nc = sc.nextLine();//接收键盘录入路径
              File file = new File(nc);//封装成File对象,并对其进行判断
              if(!file.exists()){
                   System.out.println("文件不存在");
              }else if(file.isDirectory()){
                   System.out.println("不是文件");
              }else{
                   return file;
              }
          }
     }
}

案例5 从键盘输入一个文件夹路径,打印该文件夹下的所有.java文件名

/*案例:从键盘输入一个文件夹路径,打印该文件夹下的所有.java文件名
 *
 *从键盘接受一个文件夹路径
 *1.如果文件夹不存在,提示
 *2.如果输入的不是文件夹,也提示
 *3.如果是文件夹路径,则直接返回
 *打印该文件夹下的以java结尾的文件
 *4.获取该文件夹路径下所有的文件和文件夹,存储在File数组中
 *5.遍历数组,对每一个文件或者文件夹做判断
 *6.如果是文件,且后缀是.java的>>打印
 *7.如果是文件夹就递归调用
 */
public class demo4_File {
	public static void main(String[] args){
		File dir = getDir();//获取文件夹路径
		getJava(dir);
	}
	/**
	 * @return
	 * 获取文件夹路径
	 */
	public static File getDir(){
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入路径:");
		while(true){
			String line = sc.nextLine();//将路径存储
			//封装路径
			File dir = new File(line);
			if(!dir.exists()){
				System.out.println("您录入的文降价不存在");
			}else if(dir.isFile()){
				System.out.println("您录入的是文件路径,请重新录入");
			}else{
				return dir;//返回文件夹路径
			}
		}
	}
	/**
	 * 获取文件夹下的所有java文件
	 */
	public static void getJava(File dir){
		File[] files = dir.listFiles();//获取文件夹下的所有文件和文件夹,存储在files中
		//遍历数组,对每一个文件或者文件夹打印
		for (File file : files) {
			if(file.isFile()&&file.getName().endsWith(".java")){
				System.out.println(file);
			}else{
				//递归调用
				if(file.isDirectory()){
					getJava(file);//如果file是一个文件夹,那么就把这个文件夹在进行调用
				}
			}
		}
	}
}

递归调用练习

案例一 运用递归计算文件夹大小

/**
 * @author ZHENG
 *	计算文件夹大小
 */
public class test2 {
	public static void main(String[] args){
		File dir = getDir();
		long l = getDirLength(dir);
		System.out.println(l);
	}
	/**
	 * 获取文件夹
	 * @return
	 */
	public static File getDir(){
		Scanner sc = new Scanner(System.in);
		System.out.println(">>请输入文件夹路径:");
		while(true){
			String nl = sc.nextLine();
			//接受的数据封装成Flie对象
			File dir = new File(nl);
			if(!dir.exists()){
				System.out.println("文件夹不存在");
			}else if(dir.isFile()){
				System.out.println("不是文件夹");
			}else{
				return dir;//返回文件夹
			}
		}
	
	}
	/**
	 * @param dir
	 * @return
	 * 计算文件夹大小
	 */
	public static long getDirLength(File dir){
		int len = 0;
		//获取该文件夹下的所有文件,并进行遍历
		File[] files = dir.listFiles();
		for (File file : files) {
			if(file.isFile()){
				len += file.length();
			}else{
				//否则递归调用自身,直到找到文件为止
				len+=getDirLength(file);
			}
		}
		return len;
	}
}

案例2删除空的文件夹

public class test3 {
	public static void main(String[] args){
		File dir = test2.getDir();//获取文件夹
		deleteFile(dir);
	}
	
	public static void deleteFile(File dir){
		File[] files = dir.listFiles();
		for (File file : files) {
			if(file.isFile()){
				file.delete();
			}else{//如果是文件夹递归调用
				deleteFile(file);
			}
		}
		dir.delete();//删除空文件夹
	}
}

案例3将文件夹中的所有文件按照层级打印

public class test4{
	public static void main(String[] args){
		//依据test2里的getDir方法获取文件夹路径
		File dir = test2.getDir();
		printLev(dir,0);
	}
	private static void printLev(File dir,int lev){
		//将文件夹中的所有文件按照层级打印
		File[] files = dir.listFiles();
		for(File file:files){
			//无论是文件还是文件夹都需要直接打印
			system.out.println(file);
			//如果是文件夹,递归调用
			if(file.isDirectory()){
				printLev(file,lev+1);
			}
		}
	}
}

多线程

1.多线程之多线程的两种实现方式
1.1继承Thread方式开启线程

public class demo1_Thread {

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.start();//开启线程
		for (int i = 0; i < 1000; i++) {
			System.out.println("主方法");
		}
		
	}

}
class MyThread extends Thread{

	@Override
	public void run() {
		for (int i = 0; i < 1000; i++) {
			System.out.println("aaaa");
		}
	}
	
}

1.2实现Runnable接口方式开启线程

public class demo2_Thread {

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		new Thread(mt).start();//Runnable接口实现开启线程
		for (int i = 0; i < 1000; i++) {
			System.out.println("主方法");
		}
	}
}
class MyThread implements Runnable{

	@Override
	public void run() {
		for (int i = 0; i < 1000; i++) {
			System.out.println("aaaaaaaa");
		}
	}
}

2.多线程(两种实现方式的区别)
查看源码的区别:
1.继承Thread:由于子类重写了Thread类的run()方法,当调用start()时,直接找子类的run()方法;
2.实现Runable:构造函数中传入了Runable的引用,成员变量记住了它,start()调用run()方法时内部判断成员变量Runable的引用是否为空,不为空编译时看的是Runable的run()方法,运行时执行的是子类的Run()方法。
继承Thread
好处:可直接使用Thread类中的方法,代码简单;
弊端:若有父类,则不能使用这种方法;
实现Runable接口
好处:接口可以多实现
弊端:不能直接使用Thread中的方法,先获取线程对象后,才可以得到Thread方法,代码复杂

3.多线程之匿名内部类实现线程的两种方式
好处:不需要继承,也不需要实现接口,代码简洁
匿名内部类之实现Runnable接口方式开启线程方式:需要把Runnable子类对象当做参数传给Thread的子类对象方可开启线程。

/**
 1. @author ZHENG
 2. 匿名内部类实现多线程
 */
public class demo3_Thread {
	public static void main(String[] args){
		
		//第一种匿名内部类方式:继承Thread类
		new Thread(){//1.继承Thread类
			//2.重写Run方法
			public void run(){
				for (int i = 0; i < 1000; i++) {
					System.out.println("aaaaaaa");
				}
			}
		}.start();//3.开启线程
		
		
		//第二种匿名内部类方式:实现Runnable接口
		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 1000; i++) {
					System.out.println("bbbbbb");
				}
			}
		}).start();//Runnable方式开启线程
	}
}

4.多线程之获取线程名字与设置线程的名字
------获取名字:getName()
------设置名字: setName()

/**
 * @author ZHENG
 * 
 * 获取与设置线程名字的三种方式
 *
 */
public class demo4 {
	public static void main(String[] args){
		/* 方式1 */
		new Thread("线程名字"){
			public void run(){
				for (int i = 0; i < 1000; i++) {
					System.out.println(getName()+"aaaaaa");
				}
			}
		}.start();
		/* 方式2 */
		new Thread(){
			public void run(){
				this.setName("设置线程名字");
				for (int i = 0; i < 1000; i++) {
					System.out.println(getName()+"bbbbb");
				}
			}
		}.start();
		
		/* 方式3 父类引用指向子类对象*/
		Thread t1 = new Thread("线程名字"){
			public void run(){
				for (int i = 0; i < 1000; i++) {
					System.out.println(getName()+"aaaaaa");
				}
			}
		};
		t1.setName("新的名字1");
		t1.start();
		Thread t2 = new Thread(){
			public void run(){
				this.setName("设置线程名字");
				for (int i = 0; i < 1000; i++) {
					System.out.println(getName()+"bbbbb");
				}
			}
		};
		t2.setName("新的名字2");
		t2.start();
	}
}

5.多线程之获取当前线程对象
-----Thread.currentThread();
------Thread.currentThread().getName();//获取当前线程的名字

以及如何设置与获取主线程的名字

public class demo6 {
	public static void main(String[] args){
		new Thread(){
			public void run(){
				for (int i = 0; i < 1000; i++) {
					System.out.println(getName()+"aaaaaaaa");
				}
			}
	}.start();
	new Thread(new Runnable() {
		
		@Override
		public void run() {
			for (int i = 0; i < 1000; i++) {
				System.out.println(Thread.currentThread().getName()+"bbbbbb");
			}
		}
	}).start();
	//获取主线程的名字
	Thread.currentThread().setName("主线程");
	System.out.println(Thread.currentThread().getName());

}
}

6.多线程之线程休眠
----Thread.sleep(1000)//休眠1s
运用休眠实现倒计时功能

public class demo7 {
	public static void main(String[] args){
		for (int i=5; i>=0; i--) {
			if(i==0){
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("已通知");
				break;
			}else{
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("倒计时"+i+"秒");
			}
			
		}
	}
}

7.多线程之守护线程
----setDaemon():设置一个守护线程,该线程不会单独执行,当非守护线程结束后,该线程自动停止。
守护线程=======“車马相”等;
非守护线程=====“帅”

public class demo8_Daemon {
	public static void main(String[] args){
		//将t2设置为守护线程:当t1(帅)挂掉,t2(車马相等)自动挂掉,但是由于缓冲的原因
		//t2不会立刻停止,但执行次数一定小于50次
		Thread t1 = new Thread(){
			public void run(){
				for (int i = 0; i < 2; i++) {//执行2次
					System.out.println(getName()+"...aaaa");
				}
			}
		};
		
		Thread t2 = new Thread(){//执行50次
			public void run(){
				for (int i = 0; i < 50; i++) {
					System.out.println(getName()+"...bbb");
				}
			}
		};
		t2.setDaemon(true);//将t2设置为守护线程
		t1.start();
		t2.start();
	}
}

8.多线程之加入线程
-------join():当前线程暂停,等待其他线程结束后再执行;
-------join(1000)等待1s后继续交叉执行

public class demo9_join {
	public static void main(String[] args){
		final Thread t1 = new Thread(){
			public void run(){
				for (int i = 0; i < 10; i++) {
					System.out.println(getName()+"aaaaa");
				}
			}
		};
		Thread t2 = new Thread(){
			public void run(){
				for (int i = 0; i < 10; i++) {
					
						try {
							t1.join(1);//插队指定的时间,过了时间,两条线程交替执行,1ms
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					
					System.out.println(getName()+"bbbbbbb");
				}
			}
		};
		t1.start();
		t2.start();
	}
}

9.多线程之设置线程的优先级
---------setPriority();
t1.setPriority(Thread.MIN_PRIORITY);//将t1设置成最小的线程优先级
t2.setPriority(Thread.MAX_PRIORITY);//将t2设置成最大的线程优先级,即保证t2线程首先执行完

/**
 * @author ZHENG
 *	设置线程优先级
 */
public class demo10_Priority {
	public static void main(String[] args){
		Thread t1 = new Thread(){
			public void run(){
				for (int i = 0; i < 100; i++) {
					System.out.println(getName()+"aaaaaaaa");
				}
			}
		};
		Thread t2 = new Thread(){
			public void run(){
				for (int i = 0; i < 100; i++) {
					System.out.println(getName()+"bbbbbbbb");
				}
			}
		};
		/*t1.setPriority(1);
		t2.setPriority(10);*/
		t1.setPriority(Thread.MIN_PRIORITY);//将t1设置成最小的线程优先级
		t2.setPriority(Thread.MAX_PRIORITY);//将t2设置成最大的线程优先级
		t1.start();
		t2.start();
	}
}

10.多线程之同步代码块——同步方法
-----synchronized关键字加上一个锁对象来定义一段代码,叫做同步代码块
多个同步代码块如果使用相同的锁对象,即是同步的;
锁对象可以使用任意对象,随便创建一个对象也可以,但是不能使用匿名对象
例子:
class Demo{
}
class Print{
Demo d = new Demo();
public void print1(){
synchronized(d){
}
}
}
1.非静态的同步方法锁对象是什么?--------this
即synchronized(this){

}
2.静态方法的锁对象是-------------Print.class对象
即synchronized(Print.class){

}

public class demo10 {
	public static void main(String[] args){
		final Print p = new Print();
		new Thread(){
			public void run(){
				while(true){
					p.print1();
				}
			}
		}.start();
		new Thread(){
			public void run(){
				while(true){
					p.print2();
				}
			}
		}.start();
	}
}
class Print{
	public static synchronized void print1(){
			System.out.print("1");
			System.out.print("2");
			System.out.print("3");
			System.out.print("4");
			System.out.println();
	}
	public static void print2(){
		synchronized (Print.class) {
			System.out.print("a");
			System.out.print("b");
			System.out.print("c");
			System.out.print("d");
			System.out.println();
		}
	}
}

11.多线程之线程安全问题----多线程实现4个窗口出售100张火车票

/**
 * @author ZHENG
 *	多线程实现4个窗口出售100张火车票
 */
public class demo12 {
	public static void main(String[] args){
		Tickets t1 = new Tickets();
		t1.setName("1号窗口");
		t1.start();
		Tickets t2 = new Tickets();
		t2.setName("2号窗口");
		t2.start();
		Tickets t3 = new Tickets();
		t3.setName("3号窗口");
		t3.start();
		Tickets t4 = new Tickets();
		t4.setName("4号窗口");
		t4.start();
	}
}
class Tickets extends Thread{
	//定义初始化100张火车票(定义成静态的代表4个线程共享100张票,即4个窗口一共出售100张票)
	private static int tickets = 100;
	public void run(){
		while(true){
			synchronized (Tickets.class) {
				if(tickets==0){
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(getName()+"票已售完");
					break;
				}else{
					try {
						Thread.sleep(10);//如果有大量数据如10w数据如果不睡眠则无法全部加载出来
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("【"+getName()+"】:"+"已售出"+tickets--+"号票");
				}
			}
		}
	}
}

12.多线程之死锁
避免死锁:不要嵌套同步代码块
13多线程之线程安全问题
通过查看源码可以得出:线程安全的都是有synchronized修饰的类

  • 以Hashtable为例通过ctrl+o找到put方法可以看出Hashtable由synchronized修饰
  1. Vector:线程安全的; ArrayList:线程不安全
  2. StringBuffer:线程安全的;StringBuilder线程不安全的
  3. Hashtable:线程安全的;HashMap线程不安全的
codemirror6 制作markdown编辑器(源码模式) 总体上感觉能用,但是不怎么友好,官方文档有点散乱,而且关键字高亮功能是独立出去的,去官方文档找半天,也没找到怎么改。EditorView.theme可以往EditorView模块中修改CSS的样式,从而影响编辑器的样式展示。"### 测试\n\n```javascript\nlet x = 'y'\n```"这个插件中的markdown语法的高亮样式。//这里指定markdown中代码块使用的解析扩展。开头的class样式,并且还需要在选择器前面添加。//markdown语言解析扩展。 阅读详情

相关推荐

DINOv2 基于自定义数据集进行图片分类预测

(前提是安装好pytorch)1. pip安装2. 下载dinov2提供的预训练模型,需要自行前往网站上查找dinov2模型进行下载。模型需要下载三个文件:下载完成后将上述三个文件放置在本地一个名为dinov2_base的文件夹中即可。

sinat_34770838的博客 6666

JAVA--集合与IO综合练习

需求 有5个学生,每个学生有3门课的成绩, 从键盘输入以上数据(包括姓名,三门课成绩), 输入的格式:如 zhangsan,30,40,60计算出总成绩, 并把学生的信息和计算出的总分数按高低顺序存放在磁盘文件"stuinfo.txt"中 1.描述学生对象。 2.定义一个可操作学生对象的工具类。 思路 1.通过获取键盘录入一行数据,并将改行中的信息取出封装成学生对象。 2.因为学...

Xin6Yang的博客 380

Mininet 2.2.1 图形可视化界面使用注意事项

前言 关于mininet的安装,网上教程不少,大致可以参考以下这篇文章: https://blog.youkuaiyun.com/linyixiao88/article/details/65651390 安装的时候,也可以不必根据上面这篇文章这么麻烦,直接sudo apt-get install mininet,即可。 Mininet可视化 Mininet 2.2.0以上版本内置了...

裕东方的博客 4192

JavaSE基础全套视频(环境搭建 面向对象 正则表达式 IO流 多线程 网络编程 java10

课程《Java零基础至高级应用》从基础入门开始进行系统教学,全套课程精细讲解,高级课程超过其他机构30%的课程量,经过我们全套课程系统学习的同学,可轻松从事Java高级工程师或系统架构师岗位,课程提供全套代码笔记其它相关素材及答疑服务,可谓是低投资高回报!学习前或学习后有任何疑问请在课程中提问,老师看到会第一时间回复!课程涵盖的内容如下:

【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识

问题:前端如何获取并生成设备唯一标识?核心要点:浏览器原生信息有限,但通过组合多个维度可生成设备指纹(Device Fingerprint),用于唯一标识设备。常见方式浏览器信息(User-Agent)屏幕与系统参数本地存储标识(localStorage / cookie)第三方指纹库(如 FingerprintJS)方式优点缺点手动组合指纹实现简单不稳定,识别率低持久化强容易被用户清除识别率高、稳定性好依赖第三方库IP 地址识别网络识别粗略共享网络环境下重复可能大。

qq_59344127的博客 1796

Vivado 2023.1及更早版本永久License全功能解锁:HLS、System Generator等IP核使用详解

本文深入解析Vivado 2023.1及更早版本的全功能许可证,详细指导如何解锁HLS、System Generator等高级IP核。通过许可证类型对比、功能验证方法和实战应用指南,帮助FPGA开发者充分利用Vivado工具套件,提升复杂系统设计和算法加速的效率。

weixin_31286719的博客 385

【Java】网络编程的简单应用,多线程下载最佳实践

【Java】网络编程笔记 package com.demo.networkprogram; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class Down

minkee的博客 743

ROS-订阅与处理激光雷达scan话题

激光雷达通常有四个性能衡量指标:测距分辨率、扫描频率(有时也用扫描周期)、角度分辨率及可视范围。测距分辨率衡量在一个给定的距离下测距的精确程度,通常与距离真实值相差在5-20mm;扫描频率衡量激光雷达完成一次完整扫描的快慢,通常在10Hz及以上;角度分辨率直接决定激光雷达一次完整扫描能返回多少个样本点;可视范围指激光雷达完整扫描的广角,可视范围之外即为盲区。

weixin_42438635的博客 4478

利用Java中的IO流,多线程及网络编程技术自制一个简易的多人聊天室

    在java基础课程中,IO流,多线程以及网络编程都属于java高级部分的内容,这部分内容虽然不算复杂,不难以理解,但是在学习和应用中往往要求我们将它们一起理解、运用,因此常常会让我们感到不知从何处下手,那么,我们可以通过一个简易的多人聊天室的项目,来综合运用这部分知识点,帮助我们更好地掌握和理解这部分知识 package com.softeem.TalkRoom.server; /**...

qq_42017374的博客 1501

泰凌微8258入门教程——导读

基于泰凌微TLSR8258 Bluetooth® SIG Mesh 的入门系列教程

2万+

彻底解决Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource

Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource

renkai721的专栏 24万+

java网络编程和io,多线程结合完成文件上传和下载案例

客户端: package cn.lmj201403; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class FileUpload_client { public stat

u010548376的专栏 931

CAPL诊断功能实现

UDS(Unified Diagnostic Services)是一种用于汽车电子系统诊断的标准协议。它定义了一系列诊断服务,用于读取和写入车辆电子控制单元(ECU)中的数据,以及处理诊断故障码(DTC)。UDS协议通常运行在CAN总线上,使用ISO 15765-2(ISO-TP)协议进行数据传输。通过本文的学习,读者应该对CAPL诊断功能实现有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1517

JavaSE—IO流

用一个通道一端链接文件,一端连接程序,读取文件的话,则认为这通道是输出流还是输入流呢?站在文件的角度是输出流。站在程序的角度是输入流。J2SDK所提供的所有流类型位于包 Java.io内,都分别继承自以下四种抽象流类型。(字节流)Reader(字符流)(字节流),Writer(字符流)这四个类都是抽象类,可以把这四个类想象成四根不同的管道。一端接着你的程序,另一端接着数据源,你可以通过输出管道从数据源里面往外读数据,也可以通过输入管道往数据源里面输入数据,总。

2501_90237168的博客 741

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【JavaSE】IO流

【学习记录】Java后端路线,Java核心语法,关于IO的那些事儿。

m0_64098804的博客 1111

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IO流、多线程学习

本文介绍了Java语言的IO流,实现对文件或目录的操作。介绍了多线程编程的好处和用法。

攸攸太上的博客 1456

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JavaSE-IO流

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。的继承关系:蓝色为节点流,黑色为处理流(小红旗重点)【常用方法】方法描述关闭此输入流并释放与该流关联的所有系统资源从输入流读取下一个数据字节从输入流中读取一定数量的字节并将其存储在缓冲区数组b中将输入流中最多len个数据字节读入字节数组。

qq_59737375的博客 1028

javaSE:IO流

本文详细介绍与使用了IO流各方法

2401_88007700的博客 1091

JavaSE之IO流、网络编程、反射

JavaSE之IO流、网络编程、反射

weixin_44528963的博客 808

【JavaSE】之IO流

Java基础IO流相关详细介绍~

小新要变强的博客 4036

Javase基础——IO流

Javase基础——IO流

涛涛的个人博客 901

JavaSE基础:IO流

JavaSE基础 IO流 要学习某个大的、需要记住比较多个类以及容易搞混的知识点时,我认为可以先从继承结构图入手去大致的了解每一个类的父类,子类。最后再去层层击破每一个类的具体用法。 以下知识点讲述了字节流与字符流、缓冲流、数据流、对象流以及File类。 有些知识点以及代码引用到了动力节点的杜老师的教学,想学javase基础的我强力推荐你们去动力节点听听里面的课程。 一、基础概念 1、什么是IO流? 文件通常是由一连串的字节或字符构成,**组成文件的字节序列称为字节流,组成文件的字符 序列称为字符流。Jav

weixin_44675404的博客 834

JavaSE基础(12)——文件、递归、IO流

flush() 这个函数是清空的意思,用于清空缓冲区的数据流,进行流的操作时,数据先被读到内存中,然后再用数据写到文件中,那么当你数据读完时,我们如果这时调用 close() 方法关闭读写流,这时就可能造成数据丢失,为什么呢?2. 使用字符数组读取: read(Char[] b) ,每次读取b的长度个字符到数组中 返回读取到的有效字符个数,读取到末尾时,返回 -1。1. 读取字符: read 方法,每次可以读取一个字符的数据,返回为int类型,读取到文件末尾,返回 -1。任何数据都可以转化成字节数组。

qq_64751004的博客 1966

JavaSE总结(三)IO流

JavaSE总结(三)IO流 文章目录JavaSE总结(三)IO流一.File类二.IO原理三.流的分类1.字节流和字符流:1)字节流2)字符流3)字节流和字符流的区别2.输入流和输出流:1)输入流(Input)2)输出流(Outpu)3.输入字节流(InputStream)与输出字节流(OutputStream)InputStream:OutputStream:4.输入字节流(Reader)和输...

ITgagaga的博客 208
下一篇: JavaSE基础(三)反射
一朝游
博客等级 码龄8年 0粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值