JavaIO——文件读写

  • Post author:
  • Post category:java


在读写文件时,Java可以分别以字节和字符为单位对文件进行操作。

在java读写文件的方法中,分别可以字节读写,字符读写,按照行读,Files工具类中有readAllLines方法。

本文代码为了简介考虑,没有书写相关的异常处理,具体的异常处理代码查看此文:

文件异常处理



字节读写

// 字节读
InputStream inputStream = new FileInputStream("D:\\test\\test01.txt");
StringBuilder stringBuilder = new StringBuilder();
// read():以int形式返回读取的字节,只有一个字节,范围为(0-255)
// 若读到文件结尾,返回-1
int data = inputStream.read();
while (data != -1) {
    char dataChar = (char) data;
    stringBuilder = stringBuilder.append(dataChar);
    data = inputStream.read();
}
inputStream.close();
System.out.println(stringBuilder.toString());

// 运行结果:
// test
// 字节写
OutputStream outputStream = new FileOutputStream("D:\\test\\test02.txt");
outputStream.write("HelloWorld".getBytes());
outputStream.close();



字符读写

当读取的文件或是写入的字符中含有中文,需要保证读取或是写入的

文件的编码格式要与程序保持一致

,否则会有乱码。此处我都设置为UTF-8。txt文件的编码格式可以通过:“文件”->“另存为”->“编码”设置。Java程序的编码格式通过-Dfile.encoding=UTF-8设置。

// 字符读写
Reader reader = new FileReader("D:\\test\\test.txt");
StringBuilder stringBuilder = new StringBuilder();
// read():以int形式返回读取的字节,可能是一个或者两个字节,范围为(0-65535)
// 若读到文件结尾,返回-1
int data = reader.read();
while (data != -1) {
    char ch = (char) data;
    stringBuilder = stringBuilder.append(ch);
    data = reader.read();
}
reader.close();
System.out.println(stringBuilder);

// 运行结果:
// test测试文本
// 字符写
Writer writer = new FileWriter("D:\\test\\test2.txt");
writer.write("HelloWorld你好世界");
writer.close();



按行读写

// 按行读
Reader reader = new FileReader("D:\\test\\test.txt");
// 想要按行读文件,需要使用BufferedReader
BufferedReader bufferedReader = new BufferedReader(reader);
// readLine():按行读
String data = bufferedReader.readLine();
while (data != null) {
    System.out.println(data);
    data = bufferedReader.readLine();
}
bufferedReader.close();

// 运行结果:
// test测试文本
// 第二行
// 第三行abc
// 按行写
Writer writer = new FileWriter("D:\\test\\test3.txt");
BufferedWriter bufferedWriter = new BufferedWriter(writer);
bufferedWriter.write("HelloWorld你好世界");
// 写入行分隔符,与当前系统相关,不一定是('\n')
bufferedWriter.newLine();
bufferedWriter.write("第二行");
bufferedWriter.newLine();
bufferedWriter.write("第三行abc");
bufferedWriter.close();



Files工具类读写

Files类中有读取文件中全部数据的方法,readAllLines().

// 读取文件中全部内容
List<String> stringList = Files.readAllLines(Paths.get("D:\\test\\test.txt"));
for (String s : stringList) {
    System.out.println(s);
}

// 运行结果:
// test测试文本
// 第二行
// 第三行abc

查看readAllLines()源码:

public static List<String> readAllLines(Path path) throws IOException {
    // 默认使用UTF-8的编码规则,也可以使用readAllLines的重载方法,指定编码规则
    return readAllLines(path, StandardCharsets.UTF_8);
}

// 也是一行行读取文件
public static List<String> readAllLines(Path path, Charset cs) throws IOException {
    try (BufferedReader reader = newBufferedReader(path, cs)) {
        List<String> result = new ArrayList<>();
        for (;;) {
            String line = reader.readLine();
            if (line == null)
                break;
            result.add(line);
        }
        return result;
    }
}

Files类写文件

Path path = Paths.get("D:\\test\\test4.txt");
Files.write(path, "test测试文本\n".getBytes());
Files.write(path, "第二行\n".getBytes(), StandardOpenOption.APPEND);
Files.write(path, "第三行abc".getBytes(), StandardOpenOption.APPEND);

Files工具类中还有很多复制、移动、创建文件的方法,有兴趣的查看源码学习即可。



版权声明:本文为weixin_46927507原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。