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
类型,并增强其能力。
- 提供了缓冲区。
- 提供了
mark
、rset
支持重复读取。(依赖于缓冲区) - 提供了
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:读取整个文件
- 如果出错,会自动关闭文件。
- 如果文件大于
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 | 开始偏移量。(从字符串的何处开始取) |
len | 从 off 开始向后取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的主要内容,如果未能解决你的问题,请参考以下文章