问题描述
我正在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
的键入较少。
- 对象'in'具有与文件有关的信息。
- 'arr'是数组,其长度等于文件内容的长度。
- 然后读取'in'直到文件的那个长度