IO流进阶

2023-10-27

IO流加强

字符流

整体框架

image-20230807090051516

FileReader(文件字符输入流)

作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。

构造方法
构造器 说明
public FileReader**(File file)** 创建字符输入流管道与源文件接通
public FileReader**(String pathname)** 创建字符输入流管道与源文件接通
常用方法
方法名称 说明
public int read() 每次读取一个字符返回,如果发现没有数据可读会返回-1.
public int read(char[] buffer) 每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1.
一个字符一个字符读取
    public static void main(String[] args) {
        try (
                Reader fr = new FileReader("src\\IoExpand\\text.txt");
            )
        {
            int c =0;
            while(c!=-1){
                c = fr.read();
                System.out.print((char) c);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

其中可以优化的点,这个代码是正确的,但是这个我们可以在简化一下比如说我们可以改成while((c==fr.read())!=-1)

            int c =0;
            while(c!=-1){
                c = fr.read();
                System.out.print((char) c);
            }
多个字符读取
            //字符数组读取
            char[] ch = new char[4];
            int length;
            while ((length=fr.read(ch))!=-1){
                String s = new String(ch,0,length);
                System.out.print(s);
            }

多个字符读取我们是返回的是成功读取的字符长度,并将其存放到字节数组中

FileWriter(文件字符输出流)

作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。

构造方法
构造器 说明
public FileWriter(File file) 创建字节输出流管道与源文件对象接通
public FileWriter(String filepath) 创建字节输出流管道与源文件路径接通
public FileWriter(File file,boolean append) 创建字节输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath,boolean append) 创建字节输出流管道与源文件路径接通,可追加数据

boolean append如果是false我们就是将文件覆盖,如果是true,我们就是在将原有的内容上在添加内容

常用方法
方法名称 说明
void write(int c) 写一个字符
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部分
    public static void main(String[] args) {
        try ( Writer fw = new FileWriter("src/IoExpand/write.txt",true);){
           //写一个字符
            fw.write('a');;
            fw.write('b');
            fw.write('c');
            fw.write("\r\n");
            //写一个字符串出去
            fw.write("我爱你");
            fw.write("\r\n");
            //写字符串的一部分出去
            fw.write("郑丽霞爱我",0,3);
            fw.write("\r\n");
            //写一个字符数组出去
            fw.write(new char[]{'我','爱','你','就','爱','你'});
            fw.write("\r\n");
            //写字符数组的一部分
            fw.write(new char[]{'我','爱','你','就','爱','你'},0,5);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
注意事项

字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效

这是因为为了防止多次调用系统资源,我们是先将数据放到内存中的缓冲区的,缓冲区由于是内存所以读取的速度也很快,然后等这个输出流刷新或者关闭的时候在将这个数据放到文件中

关闭的时候自动就会刷新这个内存

close是关闭

flush是刷新

我们一般不用刷新,但是如果你想清空数据可以用刷新

当缓冲区满 的话我们就会自动将这个数据存放到文件中

方法名称 说明
public void flush() throws IOException 刷新流,就是将内存中缓存的数据立即写到文件中去生效!
public void close() throws IOException 关闭流的操作,包含了刷新!

字节流、字符流的使用场景小结:
字节流适合做一切文件数据的拷贝(音视频,文本);字节流不适合读取中文内容输出。
字符流适合做文本文件的操作(读,写)。

缓冲流

image-20230807095425983

image-20230807095831024

原理:字节缓冲输入流自带了8KB缓冲池;字节缓冲输出流也自带了8KB缓冲池

字节缓冲输入输出流

构造器 说明
public BufferedInputStream(InputStream is) 把低级的字节输入流包装成一个高级的缓冲字节输入流,从而提高读数据的性能
public BufferedOutputStream(OutputStream os) 把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能
  1. 字节缓冲流自带8KB缓冲区
  2. 可以提高原始字节流、字符流读写数据的性能

这个流的使用方法和字节输入输出流的方法是一样的,只是它的大小变化了

    public static void main(String[] args) {
        try (InputStream is = new FileInputStream("src\\IoExpand\\text.txt");
             BufferedInputStream bis= new BufferedInputStream(is);
             OutputStream os = new FileOutputStream("src\\IoExpand\\newtext.txt");
             BufferedOutputStream bos= new BufferedOutputStream(os);
             ){
            int c;
            while ((c=bis.read())!=-1){
                os.write(c);
                System.out.print((char) c);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

需要注意的是

这几个构建方法千万别忘记,还有就是书写这个try catch的时候一定要注意不能漏写一个符号

InputStream is = new FileInputStream("src\\IoExpand\\text.txt");
BufferedInputStream bis= new BufferedInputStream(is);
OutputStream os = new FileOutputStream("src\\IoExpand\\newtext.txt");
BufferedOutputStream bos= new BufferedOutputStream(os);

字符缓冲输入输出流

BufferedReader(字符缓冲输入流)

作用:自带8K(8192)的字符缓冲池,可以提高字符输入流读取字符数据的性能。

构造器 说明
public BufferedReader(Reader r) 把低级的字符输入流包装成字符缓冲输入流管道,从而提高字符输入流读字符数据的性能

image-20230807103203895

字符缓冲输入流新增的功能:按照行读取字符

方法 说明
public String readLine() 读取一行数据返回,如果没有数据可读了,会返回null
    public static void main(String[] args) {
        try(Reader reader = new FileReader("src\\IoExpand\\csb.txt");
            BufferedReader br  = new BufferedReader(reader);
        ){
            String s;
            while (( s = br.readLine())!=null){
                System.out.println(s);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
BufferedWriter(字符缓冲输出流)

作用:自带8K的字符缓冲池,可以提高字符输出流写字符数据的性能

构造器 说明
public BufferedWriter(Writer r) 把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能

字节缓冲输出流新增的功能,换行

方法 说明
public void newLine() 换行
    public static void main(String[] args) {
        try (InputStream is = new FileInputStream("src\\IoExpand\\text.txt");
             BufferedInputStream bis= new BufferedInputStream(is);
             OutputStream os = new FileOutputStream("src\\IoExpand\\newtext.txt");
             BufferedOutputStream bos= new BufferedOutputStream(os);
             ){
            int c;
            while ((c=bis.read())!=-1){
                os.write(c);
                System.out.print((char) c);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

出师表

出现问题

  1. list.sort((o1, o2) -> o1.charAt(0) - o2.charAt(0));

刚开始的提示我

java.lang.StringIndexOutOfBoundsException: String index out of range: 0
	at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
	at java.base/java.lang.String.charAt(String.java:1515)
	at IoExpand.csb.lambda$main$0(csb.java:21)
	at java.base/java.util.TimSort.binarySort(TimSort.java:296)
	at java.base/java.util.TimSort.sort(TimSort.java:221)
	at java.base/java.util.Arrays.sort(Arrays.java:1307)
	at java.base/java.util.ArrayList.sort(ArrayList.java:1721)
	at IoExpand.csb.main(csb.java:21)

仔细查阅发现这个出现了问题就是文件里面的首字母可能是空字符,所以出现错误

因此我们要加入一个判断语句,或者修改文件内容,让其不存在这个空字符开头的内容

            /* if (o1.length() == 0 || o2.length() == 0) {
                // 处理空字符串的情况,例如:抛出异常、放到末尾等
                // 这里假设将空字符串放到末尾
                return o1.isEmpty() ? 1 : -1;
            }*/
package IoExpand;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class csb {
    public static void main(String[] args) {
        try(Reader read = new FileReader("src\\IoExpand\\csb.txt");
            BufferedReader br = new BufferedReader(read);
            Writer writer = new FileWriter("src\\IoExpand\\newcsb.txt");
            BufferedWriter bw = new BufferedWriter(writer);
        ){
            ArrayList<String> list = new ArrayList<>();
            String s;
            while ((s=br.readLine())!=null){
                list.add(s);
            }
            //System.out.println(list);
            //离谱,这个有空字符
            /* if (o1.length() == 0 || o2.length() == 0) {
                // 处理空字符串的情况,例如:抛出异常、放到末尾等
                // 这里假设将空字符串放到末尾
                return o1.isEmpty() ? 1 : -1;
            }*/
            list.sort((o1, o2) -> o1.charAt(0) - o2.charAt(0));

            for (String s1 : list) {
                bw.write(s1);
                bw.newLine();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

原始流和缓冲流的性能分析

测试用例:
分别使用原始的字节流,以及字节缓冲流复制一个很大视频。
测试步骤:

  1. 使用低级的字节流按照一个一个字节的形式复制文件。
  2. 使用低级的字节流按照字节数组的形式复制文件。
  3. 使用高级的缓冲字节流按照一个一个字节的形式复制文件。
  4. 使用高级的缓冲字节流按照字节数组的形式复制文件。

使用低级的字节流按照一个一个字节的形式复制文件。

    public static void copy1(){
        Long startTIme = System.currentTimeMillis();
        try(InputStream is = new FileInputStream(SRC_FILE);
            //BufferedInputStream bis = new BufferedInputStream(is);
            OutputStream os = new FileOutputStream(DEST_FILE+"1.zip");
            //BufferedOutputStream bos = new BufferedOutputStream(os);
        ) {
            int c ;
            while ((c=is.read())!=-1){
                os.write(c);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("字节流,一个字节一个字节耗时:"+(endTime-startTIme)/1000+"秒");
    }


使用低级的字节流按照字节数组的形式复制文件。

    public static void copy2(){
        Long startTIme = System.currentTimeMillis();
        try(InputStream is = new FileInputStream(SRC_FILE);
            //BufferedInputStream bis = new BufferedInputStream(is);
            OutputStream os = new FileOutputStream(DEST_FILE+"2.zip");
            //BufferedOutputStream bos = new BufferedOutputStream(os);
        ) {
            byte[] bytes = new byte[1024*8];
            int len;
            while ((len=is.read(bytes))!=-1){
                os.write(bytes,0,len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("字节流,字节数组耗时:"+(endTime-startTIme)/1000+"秒");
    }

使用高级的缓冲字节流按照一个一个字节的形式复制文件。

    public static void copy3(){
        Long startTIme = System.currentTimeMillis();
        try(InputStream is = new FileInputStream(SRC_FILE);
            BufferedInputStream bis = new BufferedInputStream(is);
            OutputStream os = new FileOutputStream(DEST_FILE+"3.zip");
            BufferedOutputStream bos = new BufferedOutputStream(os);
        ) {
            int c ;
            while ((c=bis.read())!=-1){
                bos.write(c);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("缓冲字节流,一个字节一个字节耗时:"+(endTime-startTIme)/1000+"秒");
    }

使用高级的缓冲字节流按照字节数组的形式复制文件。

    public static void copy4(){
        Long startTIme = System.currentTimeMillis();
        try(InputStream is = new FileInputStream(SRC_FILE);
            BufferedInputStream bis = new BufferedInputStream(is);
            OutputStream os = new FileOutputStream(DEST_FILE+"4.zip");
            BufferedOutputStream bos = new BufferedOutputStream(os);
        ) {
            byte[] bytes = new byte[1024*8];
            int len;
            while ((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("换种字节流,字节数组耗时:"+(endTime-startTIme)/1000+"秒");
    }

字节数组在某个范围中越大越好,但是达到一定程度,这个速度提高范围就不行了,因为你装数据和倒数据就要会变的很慢

同时并不是使用高级的缓冲字节流按照字节数组的形式复制文件就会快于其他的,当我们提高这个字节数组的大小,比如说我们扩大好多倍,我们的缓冲字节流和低级的字节流按照字节数组的形式复制文件速度是类似的

            byte[] bytes = new byte[1024*8];   //*32 *64 *128
            int len;
            while ((len=is.read(bytes))!=-1){
                os.write(bytes,0,len);
            }
        try(InputStream is = new FileInputStream(SRC_FILE,1024*8);  //*32 *64
            BufferedInputStream bis = new BufferedInputStream(is);
            OutputStream os = new FileOutputStream(DEST_FILE+"4.zip",1024*8);//*32 *64
            BufferedOutputStream bos = new BufferedOutputStream(os);
        ) {
            byte[] bytes = new byte[1024*8];  //*32 *64
            int len;
            while ((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
            }

推荐使用哪种方式提高字节流读写数据的性能?
建议使用字节缓冲输入流、字节缓冲输出流,结合字节数组的方式,目前来看是性能最优的组合。

不同编码读取会出现乱码

image-20230807122757380

image-20230807131704416

InputStreamReader(字符输入转换流)

我们之前学的转换是

String提供了如下方法 说明
String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName) 通过指定的字符集解码指定的字节数组来构造新的 String
byte[] getBytes() 使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName) 使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中

现在是直接通过这个文件进行转码

解决不同编码时,字符流读取文本内容乱码的问题。
解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。

构造器 说明
public InputStreamReader(InputStream is) 把原始的字节输入流,按照代码默认编码转成字符输入流(与直接用FileReader的效果一样)
public InputStreamReader (InputStream is , String charset) 把原始的字节输入流,按照指定字符集编码转成字符输入流(重点)

OutputStreamWriter字符输出转换流

作用:可以控制写出去的字符使用什么字符集编码。
解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。

构造器 说明
public OutputStreamWriter(OutputStream os) 可以把原始的字节输出流,按照代码默认编码转换成字符输出流。
public OutputStreamWriter(OutputStream os,String charset) 可以把原始的字节输出流,按照指定编码转换成字符输出流(重点)

打印流

image-20230807131747849

PrintStream/PrintWriter(打印流)

作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。

PrintStream提供的打印数据的方案

构造方法
构造器 说明
public PrintStream(OutputStream/File/String) 打印流直接通向字节输出流/文件/文件路径
public PrintStream(String fileName, Charset charset) 可以指定写出去的字符编码
public PrintStream(OutputStream out, boolean autoFlush) 可以指定实现自动刷新
public PrintStream(OutputStream out, boolean autoFlush, String encoding) 可以指定实现自动刷新,并可指定字符的编码
其他方法
方法 说明
public void println(Xxx xx) 打印任意类型的数据出去
public void write(int/byte[]/byte[]一部分) 可以支持写字节数据出去
    public static void main(String[] args) {
        try(
                PrintStream ps = new PrintStream("src\\IoExpand\\print.ext");
                ){
                ps.print(67);
                ps.println(56);
                ps.print(45);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

PrintWriter提供的打印数据的方案

构造器 说明
public PrintWriter(OutputStream/Writer/File/String) 打印流直接通向字节输出流/文件/文件路径
public PrintWriter(String fileName, Charset charset) 可以指定写出去的字符编码
public PrintWriter(OutputStream out/Writer, boolean autoFlush) 可以指定实现自动刷新
public PrintWriter(OutputStream out, boolean autoFlush, String encoding) 可以指定实现自动刷新,并可指定字符的编码
方法 说明
public void println(Xxxxx) 打印任意类型的数据出去
public void write(int/String/char[]/…) 可以支持写字符数据出去

PrintStream和PrintWriter的区别

  1. 打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)
  2. PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法。
  3. PrintWriter继承自字符输出流Writer,因此支持写字符数据出去。
  4. 两者的唯一区别就是这个write方法不一样

注意事项

如果我们使用这个打印流的时候想要追加数据,我们可以并不能直接在高级流中进行追加,我们可以在低级流中进行追加之后在进行高级流的使用

PrintStream ps = new PrintStream(new FileOutputStream("src\\IoExpand\\print.ext",*true*));

打印流的一种应用:输出语句的重定向

如果我们将项目进行封装了之后我们就不能够直接进行输出到控制台了,我们这个时候就要将这个输出语句进行重定向了,将其输出到文件中.

System.out.println("老骥伏枥");
System.out.println("志在千里");
System.out.println("烈士暮年");
System.out.println("壮心不已");

可以把输出语句的打印位置改到某个文件中去。

PrintStream ps = new PrintStream("文件地址")
System.setOut(ps);

System.setOut(ps);

改变这个输出语句的默认输出位置,之后再使用这个System.out.println("壮心不已");就会输出到文件中去

数据流

image-20230807150315703

DataInputStream(数据输入流)

允许把数据和其类型一并写出去。

构造器 说明
public DataOutputStream**(**OutputStream out) 创建新数据输出流包装基础的字节输出流
方法 说明
public final void writeByte(int v) throws IOException 将byte类型的数据写入基础的字节输出流
public final void writeInt**(int v)** throws IOException 将int类型的数据写入基础的字节输出流
public final void writeDouble**(Double v)** throws IOException 将double类型的数据写入基础的字节输出流
public final void writeUTF**(String str)** throws IOException 将字符串数据以UTF-8编码成字节写入基础的字节输出流
public void write(int/byte[]/byte[]一部分) 支持写字节数据出去
    try (DataOutputStream dos= new DataOutputStream(new FileOutputStream("src\\IoExpand\\data.txt"));){
        dos.write(97);
        dos.writeDouble(12.3);
        dos.writeUTF("woaini");
        dos.writeBoolean(true);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

DataInputStream(数据输入流)

用于读取数据输出流写出去的数据。

构造器 说明
public DataInputStream**(**InputStream is) 创建新数据输入流包装基础的字节输入流
方法 说明
Public final byte readByte() throws IOException 读取字节数据返回
public final int readInt() throws IOException 读取int类型的数据返回
public final double readDouble() throws IOException 读取double类型的数据返回
public final String readUTF() throws IOException 读取字符串数(UTF-8)据返回
public int readInt()/read(byte[]) 支持读字节数据进来
        try (DataOutputStream dos= new DataOutputStream(new FileOutputStream("src\\IoExpand\\data.txt"));
             DataInputStream dis = new DataInputStream(new FileInputStream("src\\IoExpand\\data.txt"));
        ){
            dos.write(97);
            dos.writeDouble(12.3);
            dos.writeUTF("woaini");
            dos.writeBoolean(true);
            int read = dis.read();
            System.out.println(read);
            double v = dis.readDouble();
            System.out.println(v);
            System.out.println(dis.readUTF());
            System.out.println(dis.readBoolean());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

通过这个数据流能够很方便的让我们能够从这个文件中读取变量赋值给数据吗???

序列化流

image-20230807151726665

ObjectOutputStream(对象字节输出流)

可以把Java对象进行序列化:把Java对象存入到文件中去。

构造器 说明
public ObjectOutputStream**(**OutputStream out) 创建对象字节输出流,包装基础的字节输出流
方法 说明
public final void writeObject**(Object o)** throws IOException 把对象写出去
public static void main(String[] args) {
    User u = new User("qiu",19);
    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\IoExpand\\user\\object.txt"));){
        oos.writeObject(u);
        System.out.println("win");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

注意:对象如果要参与序列化,必须实现序列化接口(java.io.Serializable)

接口时一个标志,里面没有内容,是通知虚拟机这个对象能够序列化的

public class User implements Serializable {
    private  String name;
    private  int age;
}

ObjectInputStream(对象字节输入流)

可以把Java对象进行反序列化:把存储在文件中的Java对象读入到内存中来。

构造器 说明
public ObjectInputStream(InputStream is) 创建对象字节输入流,包装基础的字节输入流
方法 说明
public final Object readObject() 把存储在文件中的Java对象读出来

如果想要同时序列化多个对象,怎么办

用一个ArrayList集合存储多个对象,然后直接对集合进行序列化即可
注意:ArrayList集合已经实现了序列化接口!

不想序列化对象的某个属性

transientji加在对象属性前面,我们就可以让这个对象属性不用进行序列化

框架

解决某类问题,编写的一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的。
好处:在框架的基础上开发,可以得到优秀的软件架构,并能提高开发效率
框架的形式:一般是把类、接口等编译成class形式,再压缩成一个.jar结尾的文件发行出去。

image-20230807155155226

什么是IO框架

封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。

Commons-io

Commons-io是apache开源基金组织提供的一组有关IO操作的小框架,目的是提高IO流的开发效率。

FileUtils类提供的部分方法展示 说明
public static void copyFile(File srcFile, File destFile) 复制文件。
public static void copyDirectory(File srcDir, File destDir) 复制文件夹
public static void deleteDirectory(File directory) 删除文件夹
public static String readFileToString(File file, String encoding) 读数据
public static void writeStringToFile(File file, String data, String charname, boolean append) 写数据
IOUtils类提供的部分方法展示 说明
public static int copy(InputStream inputStream, OutputStream outputStream) 复制文件。
public static int copy(Reader reader, Writer writer) 复制文件。
public static void write(String data, OutputStream output, String charsetName) 写数据

添加外部框架

以Commons-io为例,如果只是想使用的话,我们只需要使用这个包就好了

image-20230807160216028

别的jat不导入也不影响你使用

之后我们在我们的主项目里面新建一个目录lib,专门用来存放这个外部的包

然后哦我们将这个jar包赋值粘贴过来,之后我们右击这个lib包,我们可以将这个包添加到库中

image-20230807160351147

g readFileToString(File file, String encoding) | 读数据 |
| public static void writeStringToFile(File file, String data, String charname, boolean append) | 写数据 |

IOUtils类提供的部分方法展示 说明
public static int copy(InputStream inputStream, OutputStream outputStream) 复制文件。
public static int copy(Reader reader, Writer writer) 复制文件。
public static void write(String data, OutputStream output, String charsetName) 写数据

添加外部框架

以Commons-io为例,如果只是想使用的话,我们只需要使用这个包就好了

[外链图片转存中…(img-cVw3Bk6q-1691455389419)]

别的jat不导入也不影响你使用

之后我们在我们的主项目里面新建一个目录lib,专门用来存放这个外部的包

然后哦我们将这个jar包赋值粘贴过来,之后我们右击这个lib包,我们可以将这个包添加到库中

[外链图片转存中…(img-jBoRa7Df-1691455389419)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IO流进阶 的相关文章

  • 读取文件并获取 key=value 而不使用 java.util.Properties

    我正在构建一个 RMI 游戏 客户端将加载一个包含一些键和值的文件 这些键和值将用于多个不同的对象 它是一个保存游戏文件 但我不能为此使用 java util Properties 它符合规范 我必须读取整个文件并忽略注释行和与某些类不相关
  • 如何以编程方式找出我的 PermGen 空间使用情况?

    我正在尝试诊断java lang OutOfMemoryError PermGen Space在 Sun 的 Hotspot JVM 上运行时出现错误 并且想知道我的程序在不同时刻使用了多少 PermGen 空间 有没有办法以编程方式找出这
  • 如何用Java写入OS系统日志?

    Mac OS 有一个名为 Console 的应用程序 其中包含记录的消息 错误和故障 我相信 Windows 中的等效项是事件查看器 我想 Linux 上也有一个 但我不知道它是什么 也不知道它在哪里 是否可以像这样从 Java 输出获取消
  • 正确配置JDK环境变量后仍然找不到java命令

    我在 Windows 虚拟机启动时安装 JDK 使用 cloudinit 用户数据将 PowerShell 脚本传输到 Windows 计算机 然后运行该脚本来安装 JDK softwares Get ItemProperty HKLM S
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • Java中定义类型后同时初始化多个变量?

    这里需要一些语法方面的帮助 我正在尝试在定义类型后重新初始化多个变量 例如 int bonus sales x y 50 这工作正常 但是我想稍后在程序中将不同的值放入其中一些变量中 但我收到语法错误 bonus 25 x 38 sales
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • 如何使用 Spring MVC 和 Thymeleaf 添加静态文件

    我的问题是如何添加 CSS 和图像文件等静态文件 以便我可以使用它们 我正在使用 Spring MVC 和 Thymeleaf 我查看了有关此主题的各种帖子 但它们对我没有帮助 所以我才来问 根据这些帖子 我将 CSS 和图像文件放在res
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • 更改 RowLayout SWT Java 中元素的顺序

    有没有办法更改在行布局中创建的元素的顺序 我想将其显示在元素中 首先显示 例如 如果我创建 element1 则 element2 element3 element4 我想看到的布局为 元素4 元素3 元素2 元素1 这意味着最后创建的元素
  • XSLT:我们可以使用abs值吗?

    我想知道在 XSLT 中我们是否可以使用 math abs 我在某处看到过这个 但它不起作用 我有类似的东西
  • NoSuchMethodError:将 Firebase 与应用程序引擎应用程序集成时

    我试图将 firebase 实时数据库与谷歌应用程序引擎应用程序集成 我在调用时收到此错误 gt DatabaseReference ref FirebaseDatabase gt getInstance gt getReference t
  • 膨胀类片段 InflateException 二进制 XML 文件时出错

    我正在使用 Material Design 和 NavigationDrawer 布局等设计我的第一个应用程序 但我遇到了一个问题 该应用程序非常简单 它只显示文本 并且基于 Android Studio 中提供的模板 尝试启动我的应用程序
  • 如何将任务添加到 gradle 中的主要“构建”任务

    当我尝试使用以下代码将任务添加到主构建任务时 rootProject tasks getByName build dependsOn mytask 当我跑步时它抱怨gradle w build输出 Where Build file line
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • 当我在 Java 中输入 IP 时无法连接到我的服务器

    好的 我正在尝试学习 Java 客户端 服务器的内容 并且正在浏览教程代码 如下所示 当我将 localhost 更改为我的 IP 时 它会停止工作 请帮忙 编辑 127 0 0 1 似乎也可以工作 但不是我的真实IP Copyright
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN

随机推荐

  • 兼容性测试真实案例-餐饮APP

    兼容性测试真实案例 某餐饮APP 项目背景 APP是以电商加直播为载体 供应链为核心 辅以短视频和直播内容分销带货 以及积分商城体系 本项目主要对APP的商品列表及商品采购流程及涉及页面 针对不同品牌 操作系统 分辨率的机型 验证APP是否
  • jenkins和jdk安装教程(安装支持jdk8的最新版本)

    1 安装版本查看 Jenkins稳定版 2 进入清华镜像 下载对应版本的rpm包 清华镜像 3 已rpm安装过Jenkins 现在先卸载 1 卸载 rpm e jenkins 2 检查是否卸载成功 rpm ql jenkins 3 彻底删除
  • (大集合)AI工具和用法汇总—集合的集合

    AI 工具和用法汇总 汇集整理 by Staok 瞰百 源于相关资料在我这慢慢越积累越多 到了不得不梳理的程度 文中有许多内容作者还没有亲自尝试 所以很多内容只是罗列 但信息大源都已给出 授人以渔 欢迎 PR 补充细节内容 比如 好的教程
  • HTML+CSS简单复习

    目录 什么是HTML CSS VSCode编辑器 HTML基本结构和属性 HTML初始代码 HTML注释 标题与段落 文本修饰标签 图片标签 路径的引入 链接标签 锚点 特殊字符 列表标签 表格标签 表单标签 div和span CSS基础语
  • 【机器学习笔记4】逻辑回归模型

    目录 什么是逻辑回归 Sigmoid函数 决策边界 逻辑回归的损失函数 为什么平方误差模型不可行 对数损失函数 单个样例损失 整体损失函数 梯度下降算法 补充 F1 score评价指标 F1 Score简介 相关概念 F Score 示例及
  • 第一次实践一个多文件的代码

    收获 1 ifndef防止头文件重复包含 为了避免同一个头文件被包含 include 多次 C C 中有两种宏实现方式 一种是 ifndef方式 另一种是 pragma once方式 ifndef 标识符A 每一个头文件都要有自己独特的标识
  • 小程序通过webview实现本地任意文件上传

    微信小程序做文件上传的时候 只能选择相册的图片或者视频 没办法选择手机内存卡里的文件 比如 word pdf文件等等 下面可以通过 webview 的方式 借用 h5 的方式即可实现上面的功能 添加业务域名 webview里面打开的地址 首
  • 【pytorch】pytorch-yolov3拍照并保存,进行检测后遍历所有图片并显示图片

    参看摄像头参数 v4l2 ctl d dev video0 all 安装numpy sudo apt get install python numpy 下载onnx pip install onnx 效果图 拍照部分 url http 19
  • HashMap实现原理及源码分析

    哈希表 hash table 也叫散列表 是一种非常重要的数据结构 应用场景及其丰富 许多缓存技术 比如memcached 的核心其实就是在内存中维护一张大的哈希表 而HashMap的实现原理也常常出现在各类的面试题中 重要性可见一斑 本文
  • Dubbo实战(三)多注册中心配置

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net FX SKY article details 51935533 本文将展示如何在Dubbo中进行多注册中心配置 开发环境 JDK 1 7 Maven
  • 如何实现前后端交互

    大概流程 首先我们要实现前端的页面 我们要有一个页面来让我们肉眼可以看见 JS的语法我们要掌握 1因为我们要通过JS来绑定事件 比如我们点击按钮就能发送数据给服务器 或者从服务器获取资源 2我们通过ajax请求来实现向服务器发送请求 3通过
  • mfc140u.dll丢失怎么解决?,哪种方法更简单?

    如果您在运行 Windows 操作系统时遇到了 mfc140u dll 丢失 或 找不到 mfc140u dll 等错误提示 那么这意味着您的计算机遗失了该文件 mfc140u dll 文件是 Microsoft Visual C 的一部分
  • jmeter如何进行一个简单的测试(超级详细,有图有文字,闭着眼都能成功)

    大家好 我是雄雄 内容先知 前言 软件获取 开始测试 1 新建线程组 2 创建一个请求 3 添加HTTP信息头 4 开始测试 5 查看请求情况 前言 上头问题要服务器的配置 基于我们现在做的项目 需要安排别人去采购服务器 给出的消息是 20
  • pytest.mark.parametrize及mock使用

    目录 pytest mark parametrize mock patch pytest mark parametrize 现在有 zjk py 模块 想测试其中 add 函数的功能 传入 x y 把 x 平方后的结果与 y 相加返回 zj
  • 在线旅游OTA行业调研报告-携程美团同程飞猪booking对比分析

    1 行业现状 根据前瞻研究院数据显示 2019年 我国在线旅游交易规模首次突破万亿规模 达到10866 5亿元 同比增长11 4 随着市场不断扩大 行业竞争也愈发激烈 市场上形成了以携程系 阿里系 美团系三大实力角逐的格局 在线酒店预订市场
  • Root cause: BlockMissingException【查看修复HDFS中丢失的块】ORG.APACHE.HADOOP.HDFS.BLOCKMISSINGEXCEPTION: COULD

    首先得好看有多少损坏的文件 其中需要使用Hadoop的fsck命令 以下是官方解释 用法 hadoop fsck 路径 以上将会展示该路径下所有受损的文件 最后用 delete 可以清除掉所有受损的文件
  • 第二十三课,抗锯齿(Anti Aliasing)

    Anti Aliasing nti eli s 反走样 文章目录 超采样抗锯齿 Super Sample Anti aliasing SSAA 多重采样抗锯齿 Multisample Anti aliasing MSAA GLFW中的MSA
  • 网络编程day1

    https note youdao com s WcWYSExkhttps note youdao com s WcWYSExk请简述字节序的概念 并用共用体 联合体 的方式 判断本机的字节序 字节序是指在计算机中存储多字节数据时 字节的顺
  • long long类型

    long long在win32中是确实存在 长度为8个字节 定义为LONG64 记住它表示的是64位即可 但对于不同的系统 在使用前还是测试一下为好 long long是C 的64位整型的基本类型 现任 长整型 long long占用8个字
  • IO流进阶

    IO流加强 字符流 整体框架 FileReader 文件字符输入流 作用 以内存为基准 可以把文件中的数据以字符的形式读入到内存中去 构造方法 构造器 说明 public FileReader File file 创建字符输入流管道与源文件