BufferedReader的readchar []如何工作?

问题描述

我正在Internet上搜索,发现此代码是从文件中读取文件并将其转换为字符串。但是我不明白in.read(arr)是如何一次读取文件的所有内容

   import java.util.Scanner;
   import java.io.*;
   class Main{
       public static void main(String[] args)
       {
         Scanner sc = new Scanner(system.in);
         String s = sc.next();
         try
         {
           File file = new File(s);
           BufferedReader in = new BufferedReader(new FileReader(file));
           int c;
           char arr[] = new char[(int)file.length()];
           in.read(arr);
           String res = new String(arr);
           System.out.println(res);
         }
         catch(Exception e){}
       }
   }

解决方法

在现代Java代码中,您将为此使用Files.readString。它是Java 11引入的,专门将整个文本文件读取到String中。

您要查询的代码中发生的事情是read(someArray)方法的常见现象:它们读取许多条件,例如

  • 已读取指定数量的字符,
  • 基础流的读取方法返回-1,表示文件结束,或者
  • 基础流的ready方法返回false,表示其他输入请求将被阻止。

在这里使用第一个和第二个条件,并希望第三个条件不会出现,因此从本地文件读取不会在任意文件位置引起“阻塞”。
File.length告诉您文件的大小(以字节为单位)。文件中的字符数不能超过其字节大小,因此,file.length是您需要的字符数的理想上限。但是,由于有些编码会导致单个字符存储为多个字节(例如UTF-8),因此您实际上应该使用该read()调用的返回值,该值告诉您读取的字符数,然后传递交给String构造函数:

char arr[] = new char[(int)file.length()];
int count = in.read(arr);
String res = new String(arr,count);

您的代码的实际变体:

  • File.toPath()一起使用

    import java.util.Scanner;
    import java.io.File;
    import java.nio.file.Files; // "Files" is needed of course
    
    class Main
    {
        public static void main(String[] args)
        {
            Scanner sc = new Scanner(System.in);
            String s = sc.next();
            try
            {
                File file = new File(s);
                String res = Files.readString(file.toPath()); // many lines disappeared
                System.out.println(res);
            }
            catch (Exception e) {}
        }
    }
    
  • 具有java.nio类和接口:

    import java.util.Scanner;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    class Main
    {
        public static void main(String[] args)
        {
            Scanner sc = new Scanner(System.in);
            String s = sc.next();
            try
            {
                Path path = Paths.get(s); // "File file" became "Path path"
                String res = Files.readString(path); // many lines disappeared again
                System.out.println(res);
            }
            catch (Exception e) {}
        }
    }
    

这取决于您的口味和所拥有的东西。如果您仍然有一个File对象(例如您出于其他目的需要它的大小,或者例如从GUI代码获得它的对象-在许多情况下将是File),请使用其{ {1}}。如果您有toPath(),则单个String的键入较少。

,
  1. 对象'in'具有与文件有关的信息。
  2. 'arr'是数组,其长度等于文件内容的长度。
  3. 然后读取'in'直到文件的那个长度