多平台统一管理软件接口,如何实现多平台统一管理软件接口
457
2023-03-13
JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现
JDK1.7中引入了新的文件操作类java.nio.file这个包,其中有个Files类它包含了很多有用的方法来操作文件,比如检查文件是否为隐藏文件,或者是检查文件是否为只读文件。开发者还可以使用Files.readAllBytes(Path)方法把整个文件读入内存,此方法返回一个字节数组,还可以把结果传递给String的构造器,以便创建字符串输出。此方法确保了当读入文件的所有字节内容时,无论是否出现IO异常或其它的未检查异常,资源都会关闭。这意味着在读文件到最后的块内容后,无需关闭文件。要注意,此方法不适合读取很大的文件,因为可能存在内存空间不足的问题。开发者还应该明确规定文件的字符编码,以避免任异常或解析错误。
readAllBytes(Path)方法的源码:
/**
* Reads all the bytes from a file. The method ensures that the file is
* closed when all bytes have been read or an I/O error, or other runtime
* exception, is thrown.
* 注意该方法只适用于简单的情况,这种简单的情况能够很方便地将所有的字节读进一个字节数组,但并不适合用来读取大文件
*
Note that this method is intended for simple cases where it is
* convenient to read all bytes into a byte array. It is not intended for
* reading in large files.
*
* @param path
* the path to the file
*
* @return a byte array containing the bytes read from the file
*
* @throws IOException
* if an I/O error occurs reading from the stream
* 如果大于文件2G,将抛出内存溢出异常
* @throws OutOfMemoryError
* if an array of the required size cannot be allocated, for
* example the file is larger that {@code 2GB}
* @throws SecurityException
* In the case of the default provider, and a security manager is
* installed, the {@link SecurityManager#checkRead(String) checkRead}
* method is invoked to check read access to the file.
*/
public static byte[] readAllBytes(Path path) throws IOException {
try (SeekableByteChannel sbc = Files.newByteChannel(path);
InputStream in = Channels.newInputStream(sbc)) {//JDK1.7 try-with-resource
long size = sbc.size();
if (size > (long)MAX_BUFFER_SIZE)
throw new OutOfMemoryError("Required array size too large");
return read(in, (int)size);
}
}
读取文件只要一行
package entryNIO;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class BufferAndChannel {
public static void main(String[] args) {
try {
System.out.println(
new String(Files.readAllBytes(Paths.get("C:\\FileChannelImpl.java")))
);
} catch (IOException e) {
e.printStackTrace();
}
}
}
readAllLines方法的源码
public static List
try (BufferedReader reader = newBufferedReader(path, cs)) {
List
for (;;) {
String line = reader.readLine();
if (line == null)
break;
result.add(line);
}
return result;
}
}
package entryNIO;
import java.util.List;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
public class BufferAndChannel {
public static void main(String[] args) {
//如果是文本文件也可以这么读 调用readAllLines 方法
try { //JDK1.8以后可以省略第二个参数,默认是UTF-8编码
List
StringBuilder sb = new StringBuilder();
for (String line : lines) {
sb.append(line+"\n");// \r\n 换行符
}
String fromFile = sb.toString();
System.out.println(fromFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用Java8 流的方式:
先看源码实现
public static Stream
return lines(path, StandardCharsets.UTF_8);
}
package entryNIO;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class BufferAndChannel {
public static void main(String[] args) {
//Java8 新增lines方法
try {
// Java8用流的方式读文件,更加高效
Files.lines(Paths.get("C:\\FileChannelImpl.java")).forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
读文件一行写文件也只需要一行
package entryNIO;
import java.util.Arrays;
import java.util.List;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandaLHLcCrdOpenOption;
public class BufferAndChannel {
public static void main(String[] args){
//Java8 新增lines方法
String filePath="C:\\FileChannelImpl.java";
try {
// Java8用流的方式读文件,更加高效
/*Files.lines(Paths.get(filePath)).forEach((line)->{
try {
Files.write(Paths.get("\\1.java"), line.getBytes(), StandardOpenOption.APPEND);
//Files.copy(in, target, options);
} catch (IOException e) {
e.pLHLcCrintStackTrace();
}
}); */
/* Files.readAllLines(Path path)方法返回值为List
* 因为Files.write()需要传入一个Iterable extends CharSequence>类型的参数
*
* Files.write(Path path, Iterable extends CharSequence> lines, OpenOption... options)
*/
List
//因为Files.lines(Path path)返回的是Stream
//List
//StandardOpenOption为枚举类 ,如果当前所Paths.get()的文件不存在,第三个参数可选择StandardOpenOption.CREATE_NEW
//文件存在则抛java.nio.file.FileAlreadyExistsException异常
Files.write(Paths.get("C:\\2.java"), stringStream, StandardOpenOption.CREATE_NEW);
} catch (IOException e) {
e.printStackTrace();
}
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~