Java 学习笔记 - IO篇:读写文本文件txt

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 学习笔记 - IO篇:读写文本文件txt相关的知识,希望对你有一定的参考价值。

Java 学习笔记 - IO篇:读写文本文件txt

读字符

FileReader 逐字读取

FileReader 创建 字符流 的底层是 InputStreamReader(FileInputStream)

try (FileReader fileReader = new FileReader("E:\\\\in.txt");
     StringWriter stringWriter = new StringWriter();) 
    stringWriter.write('\\n');
    stringWriter.write("StringWriter输出:");
    
    int c;
    System.out.print("逐字输出:");
    while((c = fileReader.read()) != -1) 
        System.out.print((char)c);
        stringWriter.write(c);
    
    System.out.println(stringWriter.toString());
 catch (IOException e) 
    e.printStackTrace();

逐字输出:天使只是别处的凡人,神仙不过他山的妖怪。
StringWriter输出:天使只是别处的凡人,神仙不过他山的妖怪。

BufferedReader 逐行读取

BufferedReader 接受 Reader 类型,并增强其能力。

  1. 提供了缓冲区。
  2. 提供了 markrset 支持重复读取。(依赖于缓冲区)
  3. 提供了 readLine 按行读取。
StringBuilder sb = new StringBuilder();
String line;
try (FileReader fileReader = new FileReader("E:\\\\in.txt");
     BufferedReader br = new BufferedReader(fileReader);)

    while ((line = br.readLine()) != null)  
        System.out.println(line); // 逐行输出
        sb.append(line).append("\\n");  // 拼接字符串
    
    System.out.println(sb.toString());
 catch (IOException e) 
    e.printStackTrace();

Scanner 逐行读取

try(Scanner sc = new Scanner(new File("E:\\\\in.txt"))) 
    ArrayList<String> list = new ArrayList<>();
    while (sc.hasNext()) 
        list.add(sc.next());
    
    list.forEach(System.out::println);
 catch (FileNotFoundException e) 
    e.printStackTrace();

StringReader

提供以的形式处理字符串的能力。

String str = "大家好,\\n我是笨笨,\\n笨笨的笨,\\n笨笨的笨,\\n谢谢!";
try( BufferedReader bufferedReader = new BufferedReader( new StringReader(str)) ) 
    String line = null;
    while ((line = bufferedReader.readLine()) != null)  
        System.out.println(line); // 逐行输出
    

Properties 读配置文件

username=abc
pwd=123456
age=18
String path = "src\\\\Resources\\\\my.properties";
try(FileReader fileReader = new FileReader(path); FileWriter fileWriter = new FileWriter(path, true))
    Properties properties = new Properties();
    properties.load(fileReader);
    String username = properties.getProperty("username");
    String pwd = properties.getProperty("pwd", "木找到");
    int age = Integer.parseInt(properties.getProperty("age", "999"));
    System.out.println(String.format("【%s】【%s】【%s】",username , pwd , age)); // 【abc】【123456】【18】

FileInputStream 读 UTF-8 字符集

读取整个文件到 byte[]

File file = new File("E:\\\\in.txt");
try (InputStream in = new FileInputStream(file)) 
    byte[] bytes = new byte[(int) file.length()];
    in.read(bytes);
    String content = new String(bytes, StandardCharsets.UTF_8);
    System.out.println(content);
 catch (Exception e) 
    e.printStackTrace();

分段读完整个文件,最后还是一起解码。

File file = new File("E:\\\\in.txt");
String str = null;
try (InputStream in = new FileInputStream(file)) 
    byte[] bytes  = new byte[(int)file.length()];
    int offset = 0;
    while (offset < bytes.length) 
        int result = in.read(bytes, offset, bytes.length - offset);
        if (result == -1) 
            break;
        
        offset += result;
    
    str = new String(bytes, StandardCharsets.UTF_8);
 catch (FileNotFoundException e) 
    e.printStackTrace();
 catch (IOException e) 
    e.printStackTrace();

System.out.println(str);

字节流字符流

字节流读取数据后转字符流并指定以UTF-8方式解码字符串。

try (FileInputStream fis = new FileInputStream(new File("E:\\\\in.txt"));
     InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
     BufferedReader inbr = new BufferedReader(isr)) 
    String str;
    while ((str = inbr.readLine()) != null) 
        System.out.println(str);
    
 catch (Exception e) 
    System.out.println(e.getMessage());

Java7- Files

Files 的功能很全,对文件、目录操作的功能基本都有了。

读取整个文件到 byte[]

读小文件很方便。

try 
    byte[] bytes = Files.readAllBytes(Paths.get("E:\\\\in.txt"));
    String str = new String(bytes);
    System.out.println(str);
 catch (IOException e) 
    e.printStackTrace();

读取整个文件到 List<String>

java.nio.file.Files 下还有很多其他读取文件的方法如:
public static List<String> readAllLines(Path path, Charset cs)
public static List<String> readAllLines(Path path)

List<String> list = Files.readAllLines(path);
list.forEach(System.out::println);

读取文件获得 Stream<String>

Files.lines(Paths.get("E:\\\\in.txt"), StandardCharsets.UTF_8)
        .forEach(System.out::println);

Java8 - Stream 读取

逐行读取

  • 逐行输出
try (Stream<String> stream = Files.lines(Paths.get("E:\\\\in.txt"), StandardCharsets.UTF_8))
    stream.forEach(System.out::println);
 catch (IOException e) 
    e.printStackTrace();

Stream<String>String

String str = stream.collect(Collectors.joining("\\n"));

取第 N 行

通过流处理大文件,跳过N行,直接从目标行开始处理。

String str = stream
        .skip(10) // 跳过10行,取第11行
        .findFirst()
        .get();

Java8:BufferedReader

Java8 添加了 public Stream<String> lines() 可以获得流、 Files.newBufferedReader 可以获得 BufferedReader。配合使用就:

BufferedReader br = Files.newBufferedReader(Paths.get("E:\\\\in.txt"));
Stream<String> lines = br.lines();

Java11:读取整个文件

  1. 如果出错,会自动关闭文件。
  2. 如果文件大于2GB会报 OutOfMemoryError
Path path = Path.of("E:\\\\in.txt");
String str= Files.readString(path);

写字符

写到临时文件

  • BufferedWriter、FileWriter 版
File tempFile = File.createTempFile("jerryTemp_", ".txt");
try(FileWriter fw = new FileWriter(tempFile);
    BufferedWriter bw = new BufferedWriter(fw);)

    bw.write("天使只是别处的凡人,神仙不过他山的妖怪。笑虾如是说。");
 catch (IOException e) 
    e.printStackTrace();

  • Files 版
final Path path = Files.createTempFile("jerryTemp_", ".txt");
try 
    byte[] buf = "那唐僧内眼凡胎不识妖怪,反护着它……".getBytes();
    Files.write(path, buf);
 catch (IOException e) 
    e.printStackTrace();

String s = path.toString();

FileWriter

FileWriter.write(String str, int off, int len) 字符串的某一部分写入

参数说明
str字符串
off开始偏移量。(从字符串的何处开始取)
lenoff开始向后取len个字符。(写入流)
String out = "E:\\\\out.txt";
try (FileWriter fileWriter = new FileWriter(out)) 
    char[] c = "天使只是别处的凡人,神仙不过他山的妖怪。".toCharArray();
    fileWriter.write(c, 10, 1);
    fileWriter.write(c, 11, 1);
    fileWriter.write(63);
    fileWriter.write(c, 17, 2);
    fileWriter.write(63);
    fileWriter.write("谢谢", 0, 2);
    fileWriter.write(46);
 catch (IOException e) 
    e.printStackTrace();

E:\\\\out.txt 结果:

神仙?妖怪?谢谢.

Files

try 
    final Path path2 = Paths.get("文件完整路径");
    byte[] buf = "\\n那唐僧内眼凡胎不识妖怪,反护着它……".getBytes();
    Files.write(path, buf, StandardOpenOption.APPEND);
 catch (IOException e) 
    e.printStackTrace();

利用完灭口

path.toFile().deleteOnExit(); 

BufferedWriter

第二个参数 true 开启追加模式

try(BufferedWriter writer = new BufferedWriter(new FileWriter("E:\\\\out.txt", true)))

    writer.write("\\n天使只是别处的凡人,神仙不过他山的妖怪。笑虾如是说。");

PrintWriter

第二个参数 true 开启追加模式

try(PrintWriter printWriter = new PrintWriter(new FileWriter("E:\\\\out.txt", true)))

    printWriter.println("\\n天使只是别处的凡人,神仙不过他山的妖怪。笑虾如是说。");

FileOutputStream

第二个参数 true 开启追加模式

try(FileOutputStream outputStream = new FileOutputStream("E:\\\\out.txt", true)) 
    outputStream.write("\\n天使只是别处的凡人,神仙不过他山的妖怪。笑虾如是说。".getBytes());

转字符流再输出,从 第4个索引 开始,输出 4个字符

try( BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E:\\\\out.txt"))) ) 
    bw.write("大家好,我是笨笨,笨笨的笨,笨笨的笨,谢谢!", 4, 4 );

追加

上面的代码中可以看出,输出流一般默认覆盖模式
创建流时,如果它支持追,通常我们只要在第二个参数传一个布尔值就可以开启追加模式了。

工具类

Apache Commons IO - FileUtils

读取整个文件到 String

File file = new File("E:\\\\int.txt");
String content = FileUtils.readFileToString(file, "UTF-8");
System.out.println(content);

读取整个文件到 List<String>

List<String> lines = FileUtils.readLines(new File(in), Charset.defaultCharset());
lines.forEach(System.out::println);

逐行迭代

try(LineIterator it = FileUtils.lineIterator(new File("E:\\\\int.txt"), "UTF-8")) 
    while (it.hasNext()) 
        String line = it.nextLine();
        System.out.println(line)以上是关于Java 学习笔记 - IO篇:读写文本文件txt的主要内容,如果未能解决你的问题,请参考以下文章

用java分别以字节流和文本流方式实现文件的读写操作(先向test1.txt文件中写“各位同学:

java学习笔记之IO一()

Java学习——读写txt文件

Nodejs 学习笔记 - 同步读写文件

Nodejs 学习笔记 - 同步读写文件

Java学习笔记文件和Excel操作工具类