【Java基础概述-10】IO流、字节流、字符流、缓冲流、转换流、序列化、打印流、Properties属性集对象

目录

1、IO流概述

2、字节流的使用

2.1、FileInputStream字节输入流

 2.1.1、读取方式一

2.1.2、读取方式二

2.1.3、字节流读取数据如何避免中文乱码

2.2、OutputStream字节输出流

2.3、案例:复制粘贴小案例

3、字符流 

3.1、FileReader字符输入流

 3.1.1、读取方式一(性能较差,不建议使用)

3.1.2、读取方式二(用数组来存)

3.2、FileWriter字符输出流

4、缓冲流

4.1、字节缓冲流

4.1.1、字节缓冲输入流BufferedInputStream

4.1.2、字节缓冲输出流BufferedOutputStream

5.转换流

5.1、转换输入流

5.2、转换输出流

6、对象序列化技术

7、打印流printStream/PrintWriter


1、IO流概述

        I/O:Input/Output

        输入输出流

        Input:输入流

        Output: 输出流。

        引入:

        File类只能操作文件对象本身,不能读写文件对象的内容。

        读写数据内容,应该使用IO流。

        IO流是一个水流模型;IO理解成水管,把数据理解为水流。

        

        按流的方向分为:输入流/输出流。

        (1)输出流:以内存为基准,把内存中的数据写出到磁盘文件或者网络介质中的流称为输出流。

        (2)输入流:以内存为基准,把磁盘文件中的数据或者网络中的数据读入到内存中去的流称为输入流。

        输入流的作用:读取数据到内存。

        

        按照流的内容分为:字节流/字符流。

        字节流:流中的数据的最小单位是一个一个的字节,这个流就是字节流。

        字符流:流中的数据的最小单位是一个一个的字符,这个流就是字符流。

2、字节流的使用

        IO流的体系:

字节流字符流
字节输入流字节输出流字符输入流字符输出流
InputStreamOutputStreamReaderWriter抽象类
FileInputStreamFileOutputStreamFileReaderFileWriter实现类

       

2.1、FileInputStream字节输入流

        作用:以内存为基准,把磁盘文件的数据按照字节的形式读入到内存当中。

        简单来说,就是按照字节方式读取文件数据到内存。

        构造器:

        public FileinputStream(File Path):创建一个字节输入流管道与源文件对象联通。

        public FileinputStream(String PathName):创建一个字节输入流管道与源文件路径对接。

        方法:

        public int read(): 每次读取一个字节返回!!,读取完毕返回-1

 2.1.1、读取方式一

        一个一个字节读,英文和数字没有问题,

        但是中文有问题,可能会出现乱码,

        性能较差,禁止使用一个一个读的方案。        

public class FileInputStreamDemo01 {public static void main(String[] args) throws Exception {//1.创建文件对象定位test.txt;File file = new File("Day09Demo/src/test.txt");//2.创建一个字节输入流管道与源文件接通InputStream is =new FileInputStream(file);//3.读取一个字节。int read = is.read();//读取一滴水,一个字节。System.out.println((char)read);//97,加char:aint code1 = is.read();//读取一滴水,一个字节。System.out.println((char)code1);int code2 = is.read();//读取一滴水,一个字节。System.out.println((char)code2);//4.使用while读取字节数//定义一个整数变量存储字节。int ch = 0;while ((ch = is.read())!=-1){System.out.println((char) ch);//中文乱码,一个一个读,强行拆开了。}}
}

        

2.1.2、读取方式二

        public int read(byte[] buffer):从字节输入流中读取字节到字节数组里面中

        返回读取的字节数量,没有字节可读就返回-1;

        

public class FileInputStreamDemo02 {public static void main(String[] args) throws Exception {//创建一个文件对象。
//        File file = new File("Day09Demo/test.txt");//创建一个字节输入流管道与源文件对象接通。
//        FileInputStream fileInputStream = new FileInputStream(file);//3.简化写法:创建一个字节输入流管道与源文件接通FileInputStream fileInputStream1 = new FileInputStream("Day09Demo/src/test.txt");//4.定义一个字节数组读取数组.byte[] buffer =new byte[3];int len = fileInputStream1.read(buffer);//一次读3字节.System.out.println("读取字节数"+len);String res = new String(buffer);System.out.println(res );int len1 = fileInputStream1.read(buffer);//一次读3字节.System.out.println("读取字节数"+len1);String res1 = new String(buffer);System.out.println(res1 );fileInputStream1 = new FileInputStream("Day09Demo/src/test1.txt");
//        int len2 = fileInputStream1.read(buffer);//一次读3字节.
//        System.out.println("读取字节数"+len2);
//        String res2 = new String(buffer);
//        System.out.println(res2 );//还是会乱码,例如"12我",一次读三个就乱码了//终极读法
//        byte[] bytes =new byte[3];
//        while ((len=fileInputStream1.read(bytes))!=-1){
//            String s = new String(bytes);
//            System.out.println(s);
//            /*
//            *  abc
//               xyz
//               iyz
//            *
//            * */
//        }//解决方法byte[] bytes =new byte[3];while ((len=fileInputStream1.read(bytes))!=-1){//读取多少倒出多少String s = new String(bytes,0,len);System.out.println(s);/**  abcxyzi** */}}
}

           小结:使用字节数组读取内容,效率可以,但是使用字节数组读取文本内容输出,也无法避免中文乱码问题。        

2.1.3、字节流读取数据如何避免中文乱码

       解决办法:

        a.使用字符流。

        b.一桶水全部装满,定义一个字节输出和文件大小一样大的桶(其实这并不能完美解决,有文件大小限制,只适合读写小文件)

        这里引入一个新的方法

        readAllBytes(),可以一次性读完全部文件,返回一个byte[]数组

        

public class FileInputStreamDemo03 {public static void main(String[] args) throws IOException {File file = new File("Day09Demo/src/test3.txt");//b方法:FileInputStream fileInputStream = new FileInputStream(file);
//        byte[] buffer = new byte[(int)file.length()];
//        fileInputStream.read(buffer);
//        String s = new String(buffer);
//        System.out.println(s);//sun公司其实也考虑到了这个问题.所有:byte[] bytes = fileInputStream.readAllBytes();String s = new String(bytes);System.out.println(s);}
}

小结:定义一个字节大小和文件大小一样的桶,可以解决中文乱码问题,但是局限性太大,如文件太大,底层会报错内容溢出。

        字节流并不适合读取文本文件输出,读取文件建议使用字符流

        

2.2、OutputStream字节输出流

        FileoutputStream文件字节输出流:、

        作用:以内存为基准,把内存中的数据,按照字节的形式写到磁盘文件中去。

        简单来说,把内存的数据写出到磁盘中的文件中去。

        构造器:

        public FileOutputStream(File file):创建一个字节输出流管道通向目标文件对象。

        public FileOutputStream(String File):创建一个字节输出流管道通向目标文件路径。

        public FileOutputStream(FIle file,boolean append):创建一个追加数据的字节输出。

        public FileOutputStream(String file,boolean append):创建一个追加数据的字节输出

        方法:

        public void write(int a):写一个字节出去。

        public void write(byte[] buffer):写一个字节输出出去。

        public void write(byte[] buffer,int pos,int len):写一个字节数组的一部分出去    。

        

public class OutputStreamDemo04 {public static void main(String[] args) throws IOException {//1.创建一个文件对象定位目标文件。
//        File file = new File("Day09Demo/src/test4.txt");//2.创建一个字节输出流管道与目标文件对象接通。
//        OutputStream os = new FileOutputStream(file);//3.简化写法:FileOutputStream os = new FileOutputStream("Day09Demo/src/test4.txt",true);//默认是覆盖管道。//4.写数据出去。//a.写一个字节出去(写一滴水出去)os.write(97);//写一个aos.write('b');//写一个b
//        os.write('张');//有问题,写不进去[ooo],只写出去了[o]os.write("\r\n".getBytes());//写一个字节数组出去byte[] bytes = new byte[]{65,66,67,68};//写个ABCDos.write(bytes);os.write("\r\n".getBytes());byte[] bytes1 ="我爱Java,Java很厉害".getBytes();os.write(bytes1);os.write("\r\n".getBytes());//换行os.write(bytes1,0,10);os.flush();//立即刷新数据到文件中去,刷新后管道还可用os.close();//关闭管道资源,关闭包含了刷新,关闭后管道不能使用了。}
}

    小结:

        可以写一个字符,也可以写一个字节数组,也可以写一个字节数组的一部分出去。

        管道用完需要关闭,数据生效需要刷新,关闭包括刷新,刷新后流还可以继续使用,关闭流无法继续使用。

        字节输出流管道默认是覆盖数据管代,启动管道与写数据前都会清空数据。

2.3、案例:复制粘贴小案例

public class CopyDemo01 {public static void main(String[] args) {try(FileInputStream fileInputStream = new FileInputStream("C:\\Users\\javac\\Pictures\\前端所用杂图\\5848e4a37f5e4fb39f4c4384a9c27523.jpg");FileOutputStream fileOutputStream = new FileOutputStream("Day09Demo/src/3.png");){/** 先读取文件,在直接写入就完成了* */byte[] bytes = new byte[1024];int len=0;while((len=fileInputStream.read(bytes))!=-1) {fileOutputStream.write(bytes, 0, len);}System.out.println("完成了");fileInputStream.close();fileOutputStream.close();}catch (Exception e){e.printStackTrace();}}
}

3、字符流 

        字符流一个一个字符的读取文本内容输出,可以解决中文读取输出乱码问题,

        字符流很适合操作文本内容,一个一个读新性能比较差

3.1、FileReader字符输入流

        FileReader:文件字符输入流。

        作用:以内存为基准,把磁盘文件的数据读入到内存当中,简单来说,读取文本文件内容到内存中去

        构造器:

        public FileReader(File file):创建一个字符输入流与源文件对象接通。

        public FIleReader(StringfilePath):创建一个字符输入流与源文件路径接通。

        方法:

        public int read():读取一个字符的编号返回!,读取完毕返回-1

        public int  read(char[] buffer):读取一个字符数组,读取多少个字符就返回多少个字符数量。

        

 3.1.1、读取方式一(性能较差,不建议使用)
public class FileReaderDemo01 {public static void main(String[] args) throws IOException {//创建一个文件对象通向源文件File file = new File("Day10Demo/src/test.txt");Reader fileReader = new FileReader(file);int c;while ((c=fileReader.read())!=-1){System.out.print((char) c);}}
}
3.1.2、读取方式二(用数组来存)
public class FileReaderDemo02 {public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("Day10Demo/src/test.txt");int len;char[] chars =new char[1024];while ((len=fileReader.read(chars))!=-1){System.out.print(new String(chars,0,len));}}
}

        

3.2、FileWriter字符输出流

        作用:以内存为基准,把内存中的数组按照字节的形式写出到磁盘文件中去。

        构造器:

        public FileWriter(File file):创建一个字符输出流管道通向目标文件对象。

        public FileWriter(String filePath):创建一个字符输出流管道通向目标文件路径。

        public FIleWriter(File file,boolean append):创建一个追加数据的字符输出流管道通向文件。

        public FileWriter(String filePath,boolean append):创建一个追加数据的字符输出流通向文件目录。

        方法:

        public void write(int         c):写一个字符出去。

        public void write(String c):写一个字符串出去。

        public void write(char[] buffer):写一个字符数组出去。

        public void write(String c,int pos,int len):写字符串出去一部分。

public class FileWriterDemo03 {public static void main(String[] args) throws Exception {//创建一个字符输出流管道通向目标文件FileWriter fileWriter = new FileWriter("Day10Demo/src/test1.txt",true);//true为追加//2.写一个字符出去fileWriter.write(97);fileWriter.write('a');fileWriter.write('我');//3.写一个字符串fileWriter.write("Java是优美的语言");//4.写一个字符数组出去。fileWriter.write("我爱中国".toCharArray());fileWriter.write("这是不是很棒",4,2);fileWriter.write("\n");
//        fileWriter.flush();fileWriter.close();}
}

4、缓冲流

缓冲流可以提高文件的读写速度,提高读写性能。

字节流字符流
字节输入流字节输出流字符输入流字符输出流
InputStreamOutputStreamReaderWriter抽象类
FileInputStreamFileOutputStreamFileReaderFileWriter实现类
BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWrite缓冲流实现类

        

4.1、字节缓冲流

       

4.1.1、字节缓冲输入流BufferedInputStream

        作用:可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提升读取文件的效率。

        构造器:public BufferedInputStream(InputStream in)

        原理:缓冲字节输入流管道包装了 低级的字节输入流之后,就自带一个缓冲池,缓冲池是一块区域,一次可以直接提取8kb的数据到内存,以后程序直接在内存的缓冲池里面读取数据,性能很快!!!!

        

public class BufferedInputStreamDemo01 {public static void main(String[] args) throws Exception{FileInputStream fileInputStream = new FileInputStream("Day10Demo/src/test1.txt");BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);byte[] bytes =new byte[1024];int len;while ((len=bufferedInputStream.read(bytes))!=-1){System.out.println(new String(bytes,0,len));}}
}

4.1.2、字节缓冲输出流BufferedOutputStream

        作用:可以把低级的字节输出流包装成一个高级的缓冲输出流,提高写的性能。

        构造器:public BufferedoutputStream(OutputStream os)

        原理: 缓冲字节流自带了8kb的缓冲池,数据直接写入到缓冲池中去了,性能提高了!!

public class BufferedOutputStreamDemo02 {public static void main(String[] args) throws Exception{FileOutputStream fileOutputStream = new FileOutputStream("Day10Demo/src/test2.txt");BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);//把一个低级的字节输出流包装成一个高级的缓冲字节输出流bos.write('1');bos.write('a');bos.write('b');bos.write('c');bos.write("java".getBytes());int len;byte[] buffer = new byte[]{95,96,97};bos.write(buffer);bos.close();}
}

       

注意:字符流不同编码读取会产生乱码问题 

        代码编码        文件编码        中文情况

        UTF-8                UTF-8                不乱码

        GBK                    GBK                 不乱码

        UTF-8                 GBK                乱码

例如:(这里0代表一个字节)

“我爱java” =>0000000000(UTF-8)=>(GBK解析)00000000

这样解析,中文自然出问题,反之也是。

识别的时候中文因为在各编码所占字节数不同,所以导致了解析乱码问题,所以转换流就出现了

5.转换流

5.1、转换输入流

        作用:可以把原始的字节流按照当前默认的代码编码转换成字符流,

                    可以把原始的字节流按照指定的编码转换成字符流。

字节流字符流
字节输入流字节输出流字符输入流字符输出流
InputStreamOutputStreamReaderWriter抽象类
FileInputStreamFileOutputStreamFileReaderFileWriter实现类
BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWrite缓冲流实现类
InputStreamReaderOutputStreamWriter转换流实现类

        构造器:

        public InputStreamReader(InputStream is):可以使用当前代码默认的编码转换成字符流。

        public InputStreamReader(InputStream is,String chatset):可以指定编码把字节转换成字符流。

        

public class InputStreamReaderDemo01 {public static void main(String[] args) throws Exception {FileInputStream fileInputStream = new FileInputStream("Day10Demo/src/gbk2.txt");byte[] bytes =new byte[2];int len;while((len=fileInputStream.read(bytes))!=-1){System.out.print(new String(bytes,0,len,"GBK"));/** 注意,这样的解决办法并不好,因为我们的字符串并不是只有中文,还有数字、标点符号等等* */}/** 优质的办法* */InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"GBK");char[] ch = new char[1024];int len1;while ((len1=inputStreamReader.read(ch))!=-1){System.out.println(new String(ch,0,len));}}
}

        小结:

        可以解决字节流读取不同编码乱码问题。

        字符输入流可以把字节流按照默认编码转换成字符流。

        字符输入流可以解决不同编码乱码问题。

5.2、转换输出流

        作用:可以指定编码把字节输出流转换成字符输出流。

        构造器:       

        public OutputStreamWriter(OutputStream os):用当前默认的编码UTF-8把字节输出流转换数据写入

        public OutputStreamWriter(OutputStream os,String charset):按照指定的编码格式写入进去。

        小结:

        字符输出转换流可以指定编码把字节输出流转换成字符输出流。

        从而实现指定写出去的字符编码!!

public class OutputStreamWriterDemo02 {public static void main(String[] args) throws Exception{FileOutputStream fileOutputStream = new FileOutputStream("E:\\Document\\Java\\JavaPlus\\Day10Demo\\src\\GBK.txt");OutputStreamWriter gbk = new OutputStreamWriter(fileOutputStream, "GBK");gbk.write("我爱Java");gbk.close();}
}

6、对象序列化技术

        作用:把Java对象数组直接存储到文件中去,需要的时候又把Java对象数据文件恢复到Java对象中去。

字节流字符流
字节输入流字节输出流字符输入流字符输出流
InputStreamOutputStreamReaderWriter抽象类
FileInputStreamFileOutputStreamFileReaderFileWriter实现类
BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWrite缓冲流实现类
InputStreamReaderOutputStreamWriter转换流实现类
ObjectInputStreamObjectOutputStream对象序列化

        对象序列化:ObjectOutputStream 

       作用:把内存中的Java对象数据保存到文件中去。

        构造器:public ObjectOutputStream(OutputStream out)

        序列化方法:public final void writerObject(Object obj)

        对象反序列化:        ObjectOutputStream

        注意:如果要序列化对象,那么对象必须实现序列化接口:implements serializable

        存起来不是给我看的,是一种特殊的由JVM设置的格式

        序列化版本号        

        加入序列号版本:private static final long serialVersionUID =2L;

        必须序列化使用版本号和反序列号的版本号一致才能进行正常序列化,否则报错。

        

package _07序列化;import java.io.Serializable;public class User implements Serializable {private String loginName;private transient String userName;//排除这个序列化private String passWord;public User(String loginName, String userName, String passWord) {this.loginName = loginName;this.userName = userName;this.passWord = passWord;}@Overridepublic String toString() {return "User{" +"loginName='" + loginName + '\'' +", userName='" + userName + '\'' +", passWord='" + passWord + '\'' +'}';}public String getLoginName() {return loginName;}public void setLoginName(String loginName) {this.loginName = loginName;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}
}

        序列化

public class SerializeDemo01 {public static void main(String[] args) throws Exception{FileOutputStream fileOutputStream = new FileOutputStream("Day10Demo/src/obj.dat");ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);//创建一个对象User user = new User("cloud","12234","xxx");objectOutputStream.writeObject(user);objectOutputStream.close();}
}

        反序列化:

        

public class SerializeDemo02 {public static void main(String[] args) throws Exception {//1.定义一个低级的字节输入流通向目标文件。FileInputStream fileInputStream = new FileInputStream("Day10Demo/src/obj.dat");ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);//2.开始反序列化Object o = objectInputStream.readObject();User user =(User) o;//大范围转小范围强转换。System.out.println(user);System.out.println("反序列化完成!!!");}
}

7、打印流printStream/PrintWriter

        printStream以字节输出流为底层

        printWriter以字符输出流为底层

        打印流的作用:

        1.可以方便快速把数据输出到磁盘中去。

        2.可以实现打印啥,就是啥出去,不会出现乱码问题处理。

        打印流的构造器:

        public PrintStream(OutputStream os)

        public PrintStream(String filePath)

public class PrintStreamDemo01 {public static void main(String[] args) throws Exception {//打印流(字节输出流为底层),注意,这里因为需要printStream的新特性,是不能用多态写法的PrintStream printStream = new PrintStream("Day10Demo/src/text3.txt");printStream.println("asccaacacac");printStream.print("可以打印任何东西到文件中");printStream.println("烫烫烫烫烫");//注意:加ln换行printStream.close();//打印流(以字符输出流为底层Writer)PrintWriter printWriter = new PrintWriter("Day10Demo/src/text4.txt");printWriter.println("测试测试");printWriter.println("烫烫烫烫");printWriter.close();}
}

        扩展:System.setOut()可以改变输出的方向:

        Public static void setOut(PrintStream out)

public class PrintStreamDemo02 {public static void main(String[] args) throws Exception{PrintStream printStream = new PrintStream("Day10Demo/src/log.txt");System.setOut(printStream);System.out.println("输出转变到了log文件了");}}

       

8、Properties属性集对象

        Properties属性集对象其实就是一个Map集合,也就是一个键值对集合,但是我们一般不会当作集合来使用,因为已经由Map了。

        Properties代表的是一个属性文件,可以把键值对的数据存储到一个文件中去,

        属性文件:后缀是.properties结尾的文件,里面的内存都是key=value。

        在一些大型框架中经常使用,属性文件都是很重要的系统配置文件。

        

        Properties的方法:

        -- properties Obejct  setProperty(String key,String value):设置一对属性

        -- properties String getProperty(String key):根据属性名获取属性值

        -- public Set<String> stringPropertyNames():所有键的名称的集合。

        -- public void store(OutputStream out,String comments):保存数据到属性文件中去。

        -- public void store(Writer fw,String comments):保存数据到属性文件中去。comments是备注,不是内容

        --public synchronized void load(InputStream instream):加载属性文件到集合对象中去。

        --public synchronized void load(ReaderStream rs ):加载属性文件到集合对象中去。

 写入文件案例:

    public class PropertiesDemo01 {public static void main(String[] args) {//1.创建一个属性集对象,Properties的对象。Properties properties = new Properties();
//        properties.put("admin","123456"); 不建议使用Map集合properties.setProperty("admin","123456");properties.setProperty("admin","121212");//键值不不能重复覆盖了。properties.setProperty("kuku","12345");System.out.println(properties);//2.把属性集对象的数据存入到属性文件中去(重点)try (FileOutputStream fileOutputStream = new FileOutputStream("Day10Demo/src/users.properties");){/** 参数一:保存文件的输出管道* 参数二:保存心得,对保存的数据注释* */properties.store(fileOutputStream,"I an very happy");}catch (IOException e){e.printStackTrace();}}
}

读出文件案例:

public class PropertiesDemo02 {public static void main(String[] args) {//1.创建一个属性集合对象,Properties properties = new Properties();try(FileInputStream fileInputStream = new FileInputStream("Day10Demo/src/users.properties");){properties.load(fileInputStream);System.out.println(properties.get("admin"));System.out.println(properties);}catch (Exception e){e.printStackTrace();}}
}

        

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

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

相关文章

打卡学习kubernetes——kubernetes架构原理

接上一篇的内容&#xff0c;除了核心组件&#xff0c;还有一些推荐的Add-ons&#xff1a; kube-dns 负责为整个集群提供DNS服务Ingress Controller 为服务提供外网入口Heapster 提供资源监控&#xff08;没用过这个&#xff0c;但是用过grafana&#xff0c;很方便&#xf…

MySQL的事务隔离是如何实现的?

目录 从一个例子说起 快照读和当前读 事务的启动时机和读视图生成的时刻 MVCC 隐藏字段 Undo Log回滚日志 Read View - 读视图 可重复读(RC)隔离级别下的MVCC 读提交(RR)隔离级别下的MCC 关于MVCC的一些疑问 1.为什么需要 MVCC &#xff1f;如果没有 MVCC 会怎样&am…

ov多域名SSL数字证书1200元一年送一月

随着互联网的发展&#xff0c;不论是个人用户还是企事业单位都不止有一个网站&#xff0c;为了保护网站安全&#xff0c;就需要为网站安装SSL证书&#xff0c;而SSL证书中的通配符SSL证书和多域名SSL证书都可以同时保护多个域名站点。其中&#xff0c;多域名SSL证书可以同时保护…

POS 之 验证者如何才能提议区块

验证者提议区块 验证者帐户提议区块。 验证者帐户由节点运营商(可以是AWS等待云服务商)管理&#xff0c;节点运营商运行验证者软件作为其执行和共识客户端的一部分&#xff0c;并且已经向存款合约中存入了至少 32 个以太币 然而&#xff0c;每个验证者只是偶尔负责提议一个区块…

jvm题库详解

1、JVM内存模型 注意&#xff1a;这个是基于jdk1.8之前的虚拟机&#xff0c;在jdk1.8后 已经没有方法区&#xff0c;一并合并到堆中的元空间了 JVM内存区域总共分为两种类型 线程私有区域&#xff1a;程序计数器、本地方法栈和虚拟机栈 线程共享区域&#xff1a;堆&#xff08…

android MMKV数据持久化缓存集合

前言 最近在使用mmkv缓存的时候 发现没有集合缓存 非常不方便 自己写一个方法 MMKV public class MmkvUtils {private MmkvUtils() {throw new UnsupportedOperationException("u cant instantiate me...");}public static void init() {MMKV.initialize(LeoUtils…

脚本.py文件转.exe文件遇见的问题,打开exe文件出现弹窗: No module named ‘xxx‘

目录 1 问题2 问题分析3 解决过程3.1 确保Pillow库存在3.2 迷惑阶段3.3 解决问题 4 希望大佬解答 1 问题 今天做了一个使用Python写的脚本文件.py&#xff0c;打算把它转换成.exe文件。点击生成的exe文件时&#xff0c;出现了如下弹窗。 2 问题分析 根据错误描述&#xff1…

国际黄金在哪里买?

国际黄金可以在以下几个主要的市场和渠道进行购买&#xff1a; 1. 黄金交易所&#xff1a;国际上有多个黄金交易所&#xff0c;其中最知名的是伦敦金属交易所&#xff08;London Bullion Market Association&#xff0c;简称LBMA&#xff09;。LBMA是全球最大的黄金交易市场&am…

Arrays --Java学习笔记

Arrays 用来操作数组的一个工具类 Arrays类提供的常见方法&#xff1a; 代码演示&#xff1a; import java.util.Arrays; import java.util.function.IntToDoubleFunction; import java.util.function.IntUnaryOperator;public class Arrays类 {public static void main(Str…

[JAVAEE]—进程和多线程的认识

文章目录 什么是线程什么是进程进程的组成什么是pcb 进程概括线程线程与进程的关系线程的特点 创建线程创建线程方法创建线程的第二种方法对比 其他的方式匿名内部类创建线程匿名内部类创建Runable的子类lambda表达式创建一个线程 多线程的优势 什么是线程 什么是进程 首先想…

OpenCASCADE开发指南<七>:OCC 中的数学基本类型和数学算法

1 标准对象的集合容器 在处理现实问题时&#xff0c;经常将问题抽象成一个数学模型&#xff0c;接着对模型求解&#xff0c; 然后将解提取出来以解决现实问题。 其实在 CAD 软件中&#xff0c; 主要解决的就是数学模型。因此&#xff0c;本节将描述 OCC 的数学基本类型和数学算…

JavaWeb06-MVC和三层架构

目录 一、MVC模式 1.概述 2.好处 二、三层架构 1.概述 三、MVC与三层架构 四、练习 一、MVC模式 1.概述 MVC是一种分层开发的模式&#xff0c;其中 M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a; View&#xff0c;视图&#xff0c;界面展…

【LeetCode每日一题】2789. 合并后数组中的最大元素

文章目录 [2789. 合并后数组中的最大元素](https://leetcode.cn/problems/largest-element-in-an-array-after-merge-operations/)思虑&#xff1a;代码&#xff1a; 2789. 合并后数组中的最大元素 思虑&#xff1a; 1.因为要合并的条件之一是&#xff0c;num[i]<num[i1].所…

5.Python从入门到精通—Python 运算符

5.Python从入门到精通—Python 运算符 Python 运算符算术运算符比较&#xff08;关系&#xff09;运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级 Python 运算符 Python语言支持以下类型的运算符: 算术运算符比较&#xff08;关系&#xff09;运算符赋…

c++11语法特性

c11 1.c11发展简介 ​ 第一个比较正式的c标准是1998提出的c98标准。之后定了5年计划&#xff0c;每5年来一次大更新。在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C…

RabbitMQ 模拟实现【三】:存储设计

文章目录 数据库设计SQLite配置数据库实现 数据库关于哈希表等复杂类的存储启动数据库 文件设计消息持久化消息属性格式核心方法消息序列化消息文件回收 统一硬盘存储管理内存存储管理线程安全数据结构实现 数据库设计 数据库主要存储交换机、队列、绑定 SQLite 此处考虑的是…

完整的通过git命令框和windows窗口将本地文件上传到gitee远程仓库流程步骤

1.下载git 这个网站搜索git官方&#xff0c;去下载就行了 2.打开git安装后的Git Bash命令框 3.在Git Bash命令框设置一下要远程链接的gitee账号 git config --global user.name “名字”Git config --global user.email “邮箱” 4.查看一下账号设置 git config --global -…

Chitosan-PEG-DSPE 壳聚糖修聚乙二醇磷脂 DSPE-PEG-Chitosan

产品简称&#xff1a;DSPE-PEG-Chitosan、Chitosan-PEG-DSPE、DSPE-PEG-CS、CS-PEG-DSPE 产品中文名称&#xff1a;壳聚糖-聚乙二醇-磷脂、磷脂-聚乙二醇-壳聚糖 分子量&#xff1a;可以根据要求定制 保存条件&#xff1a; -20干燥保存 有效期&#xff1a; 一年 纯度&…

创建SpringCloudGateWay

创建SpringCloudGateWay 本案例基于尚硅谷《谷粒商城》项目&#xff0c;视频27 创建测试API网关 1、创建module 2、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:x…