• 10-io java


    Java 流(Stream)、文件(File)和IO

    java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目 java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

    一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。 Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

    读取控制台输入

    System.in

    从控制台读取多字符输入

    int read( ) throws IOException
    每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。

      
    char c;  
    do {  
        c = (char) br.read();  
        if (c != '\n') {  
            out.println(c);  
        }  
      
    } while (c != 'q');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    读取字符串

    String str;  
    do {  
        str = br.readLine();  
        if (str != "\n") {  
            out.println(str);  
        }  
        out.println(identityHashCode(str));  
        out.println(identityHashCode("end"));  
      
    } while (!str.equals("end"));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意, 两个字符串比较是否相同, 需要使用 equals 否则比较的是引用变量。

    控制台输出

    在此前已经介绍过,控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。
    PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。

    PrintStream 定义 write() 的最简单格式如下所示:

    void write(int byteval)

    读写文件

    下图是一个描述输入流和输出流的类层次图。

    ![[Pasted image 20220723155410.png]]

    FileInputStream

    可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
    InputStream f = new FileInputStream("C:/java/hello");

    也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:

    File f = new File("C:/java/hello");
    InputStream in = new FileInputStream(f);
    
    • 1
    • 2

    方法:

    • public void close() throws IOException{}
    • protected void finalize()throws IOException {}
    • public int read(int r)throws IOException{}
    • public int read(byte[] r) throws IOException{} # 即下次可以读取的字节数

    FileOutputStream

    OutputStream f = new FileOutputStream("C:/java/hello")

    或者

    File f = new File("C:/java/hello"); 
    OutputStream fOut = new FileOutputStream(f);
    
    • 1
    • 2

    写文件

    File f = new File("op.txt");  
    FileOutputStream fo = new FileOutputStream(f);  
    OutputStreamWriter osw = new OutputStreamWriter(fo, StandardCharsets.UTF_8);  
      
    osw.write("asdf");  
    osw.append("asdfasfafasdf");  
    osw.append("asdfasfafasdf");  
    osw.flush();  
    osw.close();  
    fo.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    读文件

    FileInputStream fis = new FileInputStream(f);  
    InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);  
      
    StringBuffer ssb = new StringBuffer();  
      
    while (isr.ready()){  
        ssb.append((char) isr.read());  
    }  
    out.println(ssb.toString());  
      
    isr.close();  
    fis.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Java中的目录

    创建目录:

    File类中有两个方法可以用来创建文件夹:

    • mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
    • mkdirs()方法创建一个文件夹和它的所有父文件夹。

    读取目录

    一个目录其实就是一个 File 对象,它包含其他文件和文件夹。

    如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。

    可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。

    File f1 = new File(dirname);
    String s[] = f1.list();  // 目录列表
    
    • 1
    • 2

    f.isDirectory() 判断是否是目录

    f.delete() 删除文件或目录

    Java Scanner 类

    java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。

    下面是创建 Scanner 对象的基本语法:
    Scanner s = new Scanner(System.in);

    使用 next 方法:

    Scanner scan = new Scanner(System.in);  
    // 从键盘接收数据  
      
    // next方式接收字符串  
    System.out.println("next方式接收:");  
    // 判断是否还有输入  
    if (scan.hasNext()) {  
        String str1 = scan.next();  
        System.out.println("输入的数据为:" + str1);  
    }  
    scan.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用 nextLine 方法:

    类似

    next() 与 nextLine() 区别

    next():

    • 1、一定要读取到有效字符后才可以结束输入。
    • 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
    • 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
    • next() 不能得到带有空格的字符串。

    nextLine():

    • 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
    • 2、可以获得空白。

    如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:

    Exception 类的层次

    所有的异常类是从 java.lang.Exception 类继承的子类。

    Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

    Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

    Error 用来指示运行时环境发生的错误。

    例如,JVM 内存溢出。一般地,程序不会从错误中恢复。

    异常类有两个主要的子类:IOException 类和 RuntimeException 类。
    ![[Pasted image 20220723162036.png]]

    try{  
        // 程序代码  
    }catch(异常类型1 异常的变量名1){  
        // 程序代码  
    }catch(异常类型2 异常的变量名2){  
        // 程序代码  
    }catch(异常类型3 异常的变量名3){  
        // 程序代码  
    }finally{ 
    // 程序代码 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    throws/throw 关键字:

    如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

    也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

    下面方法的声明抛出一个 RemoteException 异常:

    import java.io.*;  
    public class className  
    {  
        public void deposit(double amount) throws RemoteException  
        {  
            // Method implementation  
            throw new RemoteException();  
        }  
        //Remainder of class definition  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    try-with-resources

    类似 python中 with xxx as xx:

    JDK7 之后,Java 新增的 try-with-resource 语法糖来打开资源,并且可以在语句执行完毕后确保每个资源都被自动关闭 。
    JDK7 之前所有被打开的系统资源,比如流、文件或者 Socket 连接等,都需要被开发者手动关闭,否则将会造成资源泄露。

    try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {  
        while ((line = br.readLine()) != null) {  
            System.out.println("Line =>"+line);  
        }  
    } catch (IOException e) {  
        System.out.println("IOException in try block =>" + e.getMessage());  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    try-with-resources 处理多个资源

    try-with-resources 语句中可以声明多个资源,方法是使用分号 ; 分隔各个资源:

    声明自定义异常

    class MyException extends Exception{ }

  • 相关阅读:
    【培训课程专用】中断路由代码导读:当cpu运行在TEE来了一个Non secure Group1中断
    台式机卡死救机心情点滴记录第二篇
    Word处理控件Aspose.Words功能演示:使用C#分割MS Word文档
    如何找到redis中的dump.rdb文件?
    Unity学习笔记---材质纹理&天空盒
    为什么Spring中的bean默认都是单例模式?
    spark ui 指南
    Unity Job System详解(2)——如何将业务逻辑Job化
    【论文阅读笔记】CNN-Transformer for Microseismic Signal Classification
    黄东旭:开发者的“技术无感化”时代,从 Serverless HTAP 数据库开始 | PingCAP DevCon 2022
  • 原文地址:https://blog.csdn.net/hpulfc/article/details/125950350