Java IO流之PrintStream分析

简介

PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式.此外,值得注意的是:

  • 与其他流不同的是,PrintStream流永远不会抛出异常.因为做了try{}catch(){}会将异常捕获,出现异常情况会在内部设置标识,通过checkError()获取此标识.
  • PrintStream流有自动刷新机制,例如当向PrintStream流中写入一个字节数组后自动调用flush()方法.

PrintStream流打印的字符通过平台默认的编码方式转换成字节,在写入的是字符,而不是字节的情况下,应该使用PrintWriter.PrintStream流中基本所有的print(Object obj)重载方法和println(Object obj)重载方法都是通过将对应数据先转换成字符串,然后调用write()方法写到底层输出流中.常见用到PrintStream流:System.out就被包装成PrintStream流,System.err也是PrintStream流,注意System.in不是PrintStream,是没有包装过的OutputStream.所以System.in不能直接使用.

PrintStream流不是直接将数据写到文件的流,需要传入底层输出流out,而且要实现指定编码方式,需要中间流OutputStreamWriter,OutputStreamWriter流实现了字符流以指定编码方式转换成字节流.此外为了提高写入文件的效率,使用到了字符缓冲流BufferWriter.写入PrintStream流的数据怎么写到文件中.需要先了解一下数据读取和写入的流程.

1.数据从流写到文件过程

输出流----->缓冲流----->转化流----->文件流------>文件.

2.数据从文件到流的过程

文件----->文件流----->转化流----->缓冲流----->输入流.

那么从PrintStream流写到文件的过程是:

img

PrintStream介绍

1.构造方法

public PrintStream(OutputStream out) {}
public PrintStream(OutputStream out, boolean autoFlush) {}
public PrintStream(OutputStream out, boolean autoFlush, String encoding){}
public PrintStream(String fileName) {}
public PrintStream(String fileName, String csn){}
public PrintStream(File file){}
public PrintStream(File file, String csn){}
  • 创建了默认编码方式的PrintStream流,字节输出流out作为PrintStream流的输出流,不自动刷新.
  • 创建默认编码方式的PrintStream流,字节输出流out作为PrintStream流的输出流,传入是否自动刷新的参数autoFlush.
  • 创建了指定编码名称encoding的PrintStream,字节输出流out作为PrintStream流的输出流.传入是否自动刷新的参数autoFlush.
  • 创建了指定文件名称,默认字符编码方式的PrintStream流,FileOutputStream流作为PrintStream流的输出流.不自动刷新.
  • 创建指定了文件名称和字符编码名称csn的PrintStream流,FileOutputStream作为PrintStream流的输出流.不自动刷新.
  • 创建指定文件对象File和默认编码方式的PrintStream流,FileOutputStream作为PrintStream流的输出流.不自动刷新.
  • 创建指定文件对象File和编码名称csn的PrintStream流,FileOutputStream作为PrintStream流的输出流.不自动刷新.

2.内部变量

private final boolean autoFlush;
private boolean trouble = false;
private Formatter formatter;
private BufferedWriter textOut;
private OutputStreamWriter charOut;
  • autoFlush----是否自动刷新缓冲区.
  • trouble----是否抛出异常的内部标识.当PrintStream流内部抛出异常时会捕获异常,然后将trouble的值设置成true.
  • formatter----用于数据格式化的对象Formatter.
  • textOut,charOut----PrintStream流本身不具备指定编码功能,BufferedWriter提供了缓冲数据的功能,而OutputStreamWriter提供了按照指定编码方法将字符转化成字节的功能.

3.内部方法.

public void flush() {}
public void close() {}
public boolean checkError(){}
public void write(int b){}
public void write(byte buf[], int off, int len){}
public PrintStream printf(String format, Object ... args){}
public PrintStream printf(Locale l, String format, Object ... args){}
public PrintStream format(String format, Object ... args){}
public PrintStream format(Locale l, String format, Object ... args){}
public PrintStream append(CharSequence csq){}
public PrintStream append(CharSequence csq, int start, int end){}
public PrintStream append(char c){}
public void print(boolean b){}
public void print(char c) {}
public void print(int i) {}
public void print(long l) {}
public void print(float f) {}
public void print(double d) {}
public void print(char s[]) {}
public void print(String s) {}
public void print(Object obj) {}
public void println() {}
public void println(boolean x) {}
public void println(char x){}
public void println(int x) {}
public void println(long x) {}
public void println(float x) {}
public void println(double x) {}
public void println(char x[]) {}
public void println(String x) {}
public void println(Object x) {}
  • flush()----刷新流,将缓冲的数据写到底层输出流中.
  • close()—关闭流,释放关联的资源.
  • checkError()—检查流中异常状态,如果PrintStream流中有异常抛出,返回true.
  • write(int b)----将单个字节b写到PrintStream流中.
  • write(byte buf[] ,int off,int len)----将字节数组buf中off位置开始,len个字节写到PrintStream流中.
  • printf(String format, Object … args)----将数据args按照默认的Locale值和format格式进行格式化后写到PrintStream流中,方法执行等同于out.format(format, args)
  • printf(Locale l, String format, Object … args)----将数据args根据Locale值和format格式进行格式化后写到PrintStream输出流中,方法执行等同于out.printf(l, format,args).
  • format(String format, Object … args)----根据默认的Locale值和format格式来格式化数据args.
  • format(Locale l, String format, Object … args)----将数据args根据Locale值和format格式进行格式化.
  • append(CharSequence csq, int start, int end)----将字符序列csq中start(包含)位置到end(不包含)之间的子字符序列添加到PrintStream输出流中,此方法执行等同于out.print(csq.subSequence(start, end).toString()).
  • append(char c)----将单个字符添加到PrintStream输出流中.此方法执行等同于out.print©.

其他的print(Object obj)的重载方法与println(Object obj)的重载方法总结如下,两个区别是println(Object obj)在写完数据后,会写入一个换行符.而这两类方法写入数据时都会先将数据转成字符串,然后调用底层输出流写到文件中(比如boolean类型的数据true,会先转成字符串"true").此两类方法都将写入数据转化成了字符串,所以实际调用的方法是write(String s).

修饰符不写入换行的方法写入换行的方法(写入数据+换行符)功能
publicvoid print(boolean b){}void println(boolean b){}将boolean类型数据对应字符串写到PrintStream流中
publicvoid print(char c){}void println(char c){}将char类型数据对应字符串写到PrintStream流中
publicvoid print(int i) {}void println(int i) {}将int类型数据对应字符串写到PrintStream流中
publicvoid print(long l) {}void println(long l) {}将long类型数据对应字符串写到PrintStream流中
publicvoid print(float f) {}void println(float f) {}将float类型数据对应字符串写到PrintStream流中
publicvoid print(double d) {}void println(double d) {}将double类型数据对应字符串写到PrintStream流中
publicvoid print(char s[]) {}void println(char s[]) {}将字符数组写到PrintStream流中
publicvoid print(String s) {}void println(String s) {}将字符串s写到PrintStream流中
publicvoid print(Object obj) {}void println(Object obj) {}将对象Obj对应字符串写到PrintStream流中
public-void println() {}将换行符写到PrintStream流中

PrintStream案例

public class PrintStreamDemo {public static void main(String[] args) throws IOException {final String fileName = "D:\\java.txt";File file = new File(fileName);testPrintMethod(fileName, file);testOtherMethod(fileName,file);}private static void testOtherMethod(String fileName,File file) throws IOException {PrintStream ps = new PrintStream(fileName);ps.write("helloworld".getBytes());ps.println();ps.format("文件名称:%s", file.getName());ps.println();ps.write(0x41);ps.append("abcde");ps.close();}private static void testPrintMethod(final String fileName, File file) throws FileNotFoundException {PrintStream ps = new PrintStream(new FileOutputStream(fileName));ps.println('a');ps.println("hello");ps.println(2345);ps.print(3.1415);ps.println();//写入换行符.ps.printf("文件名称:%s,是否可读:%s", file.getName(),file.canRead());ps.println();ps.close();}
}

运行结果:

testPrintMethod结果:

img

testOtherMethod的结果:

img

PrintStream源码分析

public class PrintStream extends FilterOutputStream implements Appendable, Closeable
{//是否自动刷新缓冲区.private final boolean autoFlush;//是否抛出异常的内部标识.当PrintStream流内部抛出异常时会捕获异常,然后将trouble的值设置成true.private boolean trouble = false;//用于数据格式化的对象Formatter.private Formatter formatter;//OutputStreamWriter转化类,实现了编码方式,将字符转化字节.//BufferWriter实现了数据的缓冲.//输出流out是将内存中数据写到文件中./** 所以三个流的转化方式,将数据写到文件中的流程是:*            字符                          缓冲                               编码成字节                             字节* PrintStream---->BufferWriter--->OutputStreamWriter---->FileOutputStream---->文件.* */private BufferedWriter textOut;private OutputStreamWriter charOut;//判断对象是否创建.private static <T> T requireNonNull(T obj, String message) {if (obj == null)throw new NullPointerException(message);return obj;}//根据字符编码名称返回Chatset对象.private static Charset toCharset(String csn)throws UnsupportedEncodingException{requireNonNull(csn, "charsetName");try {return Charset.forName(csn);} catch (IllegalCharsetNameException|UnsupportedCharsetException unused) {// UnsupportedEncodingException should be thrownthrow new UnsupportedEncodingException(csn);}}/*** 私有构造方法,创建的编码方式为charset的PrintStream,输出流out作为PrintStream流的输出流,* 传入是否自动刷新的参数autoFlush*/private PrintStream(boolean autoFlush, OutputStream out) {super(out);this.autoFlush = autoFlush;this.charOut = new OutputStreamWriter(this);this.textOut = new BufferedWriter(charOut);}private PrintStream(boolean autoFlush, OutputStream out, Charset charset) {super(out);this.autoFlush = autoFlush;this.charOut = new OutputStreamWriter(this, charset);this.textOut = new BufferedWriter(charOut);}private PrintStream(boolean autoFlush, Charset charset, OutputStream out)throws UnsupportedEncodingException{this(autoFlush, out, charset);}//创建了默认编码方式的PrintStream流,输出流out作为PrintStream流的输出流,不自动刷新.public PrintStream(OutputStream out) {this(out, false);}//创建默认编码方式的PrintStream流,输出流out作为PrintStream流的输出流,传入是否自动刷新的参数autoFlush.public PrintStream(OutputStream out, boolean autoFlush) {this(autoFlush, requireNonNull(out, "Null output stream"));}//创建了指定编码方式encoding的PrintStream,输出流out作为PrintStream流的输出流.传入是否自动刷新的参数autoFlush.public PrintStream(OutputStream out, boolean autoFlush, String encoding)throws UnsupportedEncodingException{this(autoFlush,requireNonNull(out, "Null output stream"),toCharset(encoding));}//创建了指定文件名称,默认字符编码方式的PrintStream流,FileOutputStream流作为PrintStream流的输出流.不自动刷新public PrintStream(String fileName) throws FileNotFoundException {this(false, new FileOutputStream(fileName));}//创建指定了文件名称和字符编码名称csn的PrintStream流,FileOutputStream作为PrintStream流的输出流.不自动刷新public PrintStream(String fileName, String csn)throws FileNotFoundException, UnsupportedEncodingException{this(false, toCharset(csn), new FileOutputStream(fileName));}//创建指定文件对象File和默认编码方式的PrintStream流,FileOutputStream作为PrintStream流的输出流.不自动刷新.public PrintStream(File file) throws FileNotFoundException {this(false, new FileOutputStream(file));}//创建指定文件对象File和编码名称csn的PrintStream流,FileOutputStream作为PrintStream流的输出流.不自动刷新.public PrintStream(File file, String csn)throws FileNotFoundException, UnsupportedEncodingException{// ensure charset is checked before the file is openedthis(false, toCharset(csn), new FileOutputStream(file));}//确保流没有关闭.private void ensureOpen() throws IOException {if (out == null)throw new IOException("Stream closed");}//刷新流,调用flush()会将缓冲数据写到底层输出流中.public void flush() {synchronized (this) {try {ensureOpen();out.flush();}catch (IOException x) {trouble = true;}}}private boolean closing = false; /* To avoid recursive closing *///关闭流,释放关联资源.public void close() {synchronized (this) {if (! closing) {closing = true;try {textOut.close();out.close();}catch (IOException x) {trouble = true;}textOut = null;charOut = null;out = null;}}}//刷新流,检查异常状态,如果底层输出流抛出异常,将会返回true.public boolean checkError() {if (out != null)flush();if (out instanceof java.io.PrintStream) {PrintStream ps = (PrintStream) out;return ps.checkError();}return trouble;}//设置流的异常状态.protected void setError() {trouble = true;}//清除流的异常状态protected void clearError() {trouble = false;}//将单个字节b写到PrintStream流中.public void write(int b) {try {synchronized (this) {ensureOpen();out.write(b);if ((b == '\n') && autoFlush)out.flush();}}catch (InterruptedIOException x) {Thread.currentThread().interrupt();}catch (IOException x) {trouble = true;}}//将字节数组buf中off位置开始,len个字节写到PrintStream流中.public void write(byte buf[], int off, int len) {try {synchronized (this) {ensureOpen();out.write(buf, off, len);if (autoFlush)out.flush();}}catch (InterruptedIOException x) {Thread.currentThread().interrupt();}catch (IOException x) {trouble = true;}}/**下面对于的字符操作的私有方法会时时刷新缓冲,保持跟底层输出流一样效率*///将字符数组buf写到PrintStream流中.private void write(char buf[]) {try {synchronized (this) {ensureOpen();textOut.write(buf);textOut.flushBuffer();charOut.flushBuffer();if (autoFlush) {for (int i = 0; i < buf.length; i++)if (buf[i] == '\n')out.flush();}}}catch (InterruptedIOException x) {Thread.currentThread().interrupt();}catch (IOException x) {trouble = true;}}//将字符串s写到PrintStream流中.private void write(String s) {try {synchronized (this) {ensureOpen();textOut.write(s);textOut.flushBuffer();charOut.flushBuffer();if (autoFlush && (s.indexOf('\n') >= 0))out.flush();}}catch (InterruptedIOException x) {Thread.currentThread().interrupt();}catch (IOException x) {trouble = true;}}//将换行符写到PrintStream流中private void newLine() {try {synchronized (this) {ensureOpen();textOut.newLine();textOut.flushBuffer();charOut.flushBuffer();if (autoFlush)out.flush();}}catch (InterruptedIOException x) {Thread.currentThread().interrupt();}catch (IOException x) {trouble = true;}}//将boolean类型数据对应的字符串"true"或者"false"写到PrintStream流中,实际调用write()方法public void print(boolean b) {write(b ? "true" : "false");}//将char类型数据对应字符串写到PrintStream流中,实际调用write()方法public void print(char c) {write(String.valueOf(c));}//将int类型数据对应的字符串写到PrintStream流中,实际调用write()方法.public void print(int i) {write(String.valueOf(i));}//将long类型数据对应的字符串写到PrintStream流中,实际调用write()方法.public void print(long l) {write(String.valueOf(l));}//将float类型数据对应的字符串写到PrintStream流中,实际调用write()方法.public void print(float f) {write(String.valueOf(f));}//将doule类型数据对应的字符串写到PrintStream流中,实际调用write()方法.public void print(double d) {write(String.valueOf(d));}//将字符数组写到PrintStream流中,实际调用write()方法.public void print(char s[]) {write(s);}//将字符串s写到PrintStream流中,s为null,将会写入"null",实际调用write()方法.public void print(String s) {if (s == null) {s = "null";}write(s);}//将对象obj对应的字符串写到PrintStream流中,实际调用write()方法.public void print(Object obj) {write(String.valueOf(obj));}//将换行符写到PrintStream流中.用于终止当前行(换行符由系统定义)public void println() {newLine();}//将boolean类型数据对应的字符串+换行符写到PrintStream流中,实际调用print()-->write()public void println(boolean x) {synchronized (this) {print(x);newLine();}}//将char类型单个字符对应字符串+换行符写到PrintStream流中,实际调用print()-->write()public void println(char x) {synchronized (this) {print(x);newLine();}}//将int类型数据对应的字符串+换行符写到PrintStream流中,实际调用print()-->write()public void println(int x) {synchronized (this) {print(x);newLine();}}//将long类型数据对应的字符串+换行符写到PrintStream流中,实际调用print()-->write()public void println(long x) {synchronized (this) {print(x);newLine();}}//将float类型数据对应的字符串+换行符写到PrintStream流中,实际调用print()-->write()public void println(float x) {synchronized (this) {print(x);newLine();}}//将double类型数据对应的字符串+换行符写到PrintStream流中,实际调用print()-->write()public void println(double x) {synchronized (this) {print(x);newLine();}}//将字符数组+换行符写到PrintStream流中,实际调用print()-->write()public void println(char x[]) {synchronized (this) {print(x);newLine();}}//将字符串+换行符写到PrintStream流中,实际调用print()-->write()public void println(String x) {synchronized (this) {print(x);newLine();}}//将对象x对应的字符串+换行符写到PrintStream流中,实际调用print()-->write().public void println(Object x) {String s = String.valueOf(x);synchronized (this) {print(s);newLine();}}//将数据args按照默认的Locale值和format格式进行格式化后写到PrintStream流中.//方法执行等同于out.format(format, args)public PrintStream printf(String format, Object ... args) {return format(format, args);}//将数据args根据Locale值和format格式进行格式化后写到PrintStream输出流中//方法执行等同于out.printf(l, format,args)public PrintStream printf(Locale l, String format, Object ... args) {return format(l, format, args);}//根据默认的Locale值和format格式来格式化数据args写到PrintStream输出流中.public PrintStream format(String format, Object ... args) {try {synchronized (this) {ensureOpen();if ((formatter == null)|| (formatter.locale() != Locale.getDefault()))formatter = new Formatter((Appendable) this);formatter.format(Locale.getDefault(), format, args);}} catch (InterruptedIOException x) {Thread.currentThread().interrupt();} catch (IOException x) {trouble = true;}return this;}//将数据args根据Locale值和format格式进行格式化后写到PrintStream输出流中.public PrintStream format(Locale l, String format, Object ... args) {try {synchronized (this) {ensureOpen();if ((formatter == null)|| (formatter.locale() != l))formatter = new Formatter(this, l);formatter.format(l, format, args);}} catch (InterruptedIOException x) {Thread.currentThread().interrupt();} catch (IOException x) {trouble = true;}return this;}//将字符序列csq添加到PrintStream输出流中,此方法执行等同于 out.print(csq.toString())public PrintStream append(CharSequence csq) {if (csq == null)print("null");elseprint(csq.toString());return this;}//将字符序列csq中start(包含)位置到end(不包含)之间的子字符序列添加到PrintStream输出流中//此方法执行等同于out.print(csq.subSequence(start, end).toString())public PrintStream append(CharSequence csq, int start, int end) {CharSequence cs = (csq == null ? "null" : csq);write(cs.subSequence(start, end).toString());return this;}//将单个字符添加到PrintStream输出流中.此方法执行等同于out.print(c)public PrintStream append(char c) {print(c);return this;}
}

总结

PrintStream继承自OutputStream,属于字节流的一种,方法包含写入单个字节和字节数组的方法.相似流有PrintWriter,继承自Writer()方法,属于字符流的一种.PrintWriter流中没有写入字节的方法,而有写入单个字符和字符数组的方法.

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

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

相关文章

bs4爬取的时候有两个标签相同_10分钟用Python爬取最近很火的复联4影评

《复仇者联盟4&#xff1a;终局之战》已经上映快三个星期了&#xff0c;全球票房破24亿美元&#xff0c;国内票房破40亿人民币。虽然现在热度逐渐下降&#xff0c;但是我们还是恬不知耻地来蹭一蹭热度。上映伊始《复联4》的豆瓣评分曾破了9分。后来持续走低&#xff0c;现在《复…

RabbitMQ 基本概念与高级特性

文章目录1. 什么是消息队列1.1 消息队列概述1.2 使用消息队列的优势1.3 使用消息队列的劣势1.4 常见的消息队列产品对比2. RabbitMQ 基本概念2.1 RabbitMQ 概述2.2 RabbitMQ 的概念模型2.2.1 Message2.2.2 Publisher2.2.3 Exchange2.2.4 Binding2.2.5 Queue2.2.6 Connection2.2…

HTTP 和 SOCKET 的区别

HTTP 和 SOCKET 的区别 要弄明白 http 和 socket 首先要熟悉网络七层&#xff1a;物 数 网 传 会 表 应&#xff0c;如图1 如图1 HTTP 协议:超文本传输协议&#xff0c;对应于应用层&#xff0c;用于如何封装数据. TCP/UDP 协议:传输控制协议&#xff0c;对应于传输层&…

java 8进制串转中文_为什么不能用中文进行编程?而英文就可以

前些天大雄无意间听见几个线下班小伙伴说真的是无(te)意(di)的“我要补英文”“对&#xff0c;英文真的很重要”“如果编码用中文就好了”...听见这大雄就不淡定了中文代码小伙伴确定能够搞懂&#xff1f;&#xff1f;首先我们大概的看一下中文编码&#xff1a;你以为会写中文写…

MATLAB学习笔记(一)求解三阶微分方程

一、求解三阶微分方程 对于多变量三阶微分方程求解问题&#xff0c;这里介绍一种求解方法。 例题如下&#xff1a; 对于以上方程&#xff0c;给定边界条件&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;。求解和的表达式。 二、解题步骤 &#xff08;1&…

axure 内部框架内容下滑_Axure教程:转盘抽奖交互原型

本文跟大家分享&#xff0c;如何使用axure制作转盘抽奖交互原型&#xff0c;不带登录流程。效果如下&#xff1a;抽奖流程一、主要内容(1)主要元件&#xff1a;动态面板(2)重点&#xff1a;旋转交互、随机函数、触发动作。(3)难点&#xff1a;通过停止位置判断抽奖结果(4)涉及函…

日志打印的8种级别(很详细)

日志打印的8种级别&#xff08;很详细&#xff09; 日志的输出都是分级别的&#xff0c;不同的设置不同的场合打印不同的日志。下面拿最普遍用的Log4j日志框架来做个日志级别的说明&#xff0c;其他大同小异。 Log4j的级别类org.apache.log4j.Level里面定义了日志级别&#x…

identity_insert 如何改为on_十分钟教你如何快速提高Laya构建速度,还不快来康康?...

前言如何快速提高Laya构建速度 微信小游戏推出之后&#xff0c;很多公司也相应的进入到微信小游戏这个领域&#xff0c;现在市场上的游戏开发引擎&#xff0c;如Cocos、Egret、Laya都对小游戏有了很好的兼容性。而在实际开发中&#xff0c;如何提高Laya的构建速度&#xff0c;是…

二下语文书电子课本_小学生语文成绩好,不是靠补课,把课本吃透,才是高效学习方法...

关注语文教学发展&#xff0c;解决语文学习困惑。对于基础差、语文学习能力差的同学&#xff0c;我不建议去补课。但是家长说&#xff0c;不补课怎么办呢&#xff1f;我们也没有时间和耐心去给孩子辅导&#xff0c;又怕讲错了&#xff0c;还是让老师讲好。尽管家长们有这个意识…

Java面试——MyBatis系列总结

文章目录&#xff1a; 1.MyBatis是什么&#xff1f; 2.JDBC编程有哪些缺陷&#xff1f;MyBatis又是如何改进的&#xff1f; 3.MyBatis与Hibernate的区别在哪&#xff1f; 4.MyBatis的优缺点 5.请说说MyBatis的工作原理 6.MyBatis的架构设计是怎样的&#xff1f; 7.#{}和…

Java面试——Spring系列总结

文章目录&#xff1a; 1.什么是Spring&#xff1f; 2.Spring由哪些模块组成&#xff1f; 3.Spring中都用到了哪些设计模式&#xff1f; 4.什么是Spring IOC容器&#xff1f;有什么作用&#xff1f; 5.Spring IoC的实现机制 6.BeanFactory 和 ApplicationContext有什么区别…

Spring bean 不被 GC 的真正原因

概述 自从开始接触 Spring 之后&#xff0c;一直以来都在思考一个问题&#xff0c;在 Spring 应用的运行过程中&#xff0c;为什么这些 bean 不会被回收&#xff1f; 今天深入探究了这个问题之后&#xff0c;才有了答案。 思考点 大家都知道&#xff0c;一个 bean 会不会被回…

vts传感器采取船舶的_详解虎门大桥监测系统:传感器与物联网功不可没

来源&#xff1a;传感器专家网近日&#xff0c;虎门大桥“虎躯一震”给全国人民来了个“深呼吸”。虎门大桥是广东沿海地区重要的交通枢纽&#xff0c;始建于1992年&#xff0c;1997年通车至今&#xff0c;大桥一直都十分平稳。但在5月5日下午&#xff0c;虎门大桥发生异常抖动…

MySQL 排名函数.md

概述 MySQL 自带的排名的函数&#xff0c;主要有&#xff1a; row_number()rank()dense_rank()ntile() 测试数据 测试数据如下所示&#xff1a; row_number() 函数 用法如下&#xff1a; SELECT row_number() OVER (ORDER BY Salary DESC) row_num,Salary FROMEmployee查…

深度学习auc_机器学习集成学习与模型融合!

↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习&#xff0c;不错过Datawhale干货 作者&#xff1a;李祖贤&#xff0c;深圳大学&#xff0c;Datawhale高校群成员对比过kaggle比赛上面的top10的模型&#xff0c;除了深度学习以外的模型基本上都是集成学习的…

数控车椭圆编程实例带图_数控车床编程教程,图文实例详解

一、数控车编程特点(1) 可以采用绝对值编程(用X、Z表示)、增量值编程(用U、W表示)或者二者混合编程。(2) 直径方向(X方向) 系统默认为直径编程&#xff0c;也可以采用半径编程&#xff0c;但必须更改系统设定。(3) X向的脉冲当量应取Z向的一半。(4)采用固定循环&#xff0c;简化…

参考文献起止页码怎么写_毕业论文文献综述不会写?快来看看这篇文章(附含通用模板)...

文献综述是对所研究主题的现状进行客观的叙述和评论、寻求新的研究突破点。一个资料全面、研究深入的综述不仅可以帮助作者确立毕业论文的选题&#xff0c;还可以为论文的深入研究提供有力的支撑。本文分享一份"毕业论文文献综述万能模板",以供参考。一、文献综述的基…

常用并发工具类(线程池)

文章目录概述ThreadPoolExecutorThreadPoolExecutor 的主要属性Worker 主要属性线程池的状态线程池的状态流转线程池提交任务的执行流程线程数量的设置线程池的种类FixedThreadPoolCachedThreadPoolSingleThreadExecutorScheduledThreadPoolExecutorSingleThreadScheduledExecu…

JVM 内存模型与内存分配方式

文章目录JVM 内存模型概述基于分代收集理论设计的垃圾收集器所管理的堆结构方法区的演变内存分配划分内存的方法划分内存时如何解决并发问题对象栈上分配基于分代收集理论的垃圾收集器管理下的内存分配规则对象优先分配在 Eden 区大对象直接进入老年代长期存活的对象将逐步进入…

image pil 图像保存_如何利用python中的PIL库做图像处理?

自从这个世界上出现了Python编程&#xff0c;一切都好像有了新的思路与进展&#xff0c;比如人工智能&#xff0c;还有我们常用的PS&#xff0c;你可知道Python也可以做图像处理&#xff0c;用的就是PIL库&#xff0c;还没有用过的&#xff0c;还没有发现的&#xff0c;还没有实…