1.Java获取文件字符编码
/*方式1*/ System.out.println(System.getProperty("file.encoding")); /*方式2*/ Charset charset=Charset.defaultCharset(); System.out.println(charset);
2.转换流
InputStreamReader(InputStream in):使用默认的字符集编码,将字节输入流转换为字符输入流并读取数据; InputStreamReader(InputStream in,Charset c):按指定字符集的编码从输入流读取数据; InputStreamReader(InputStream in,String enc)throws UnsupportedEncodingException:使用指定的字符集编码,将字节输入流转换为字符输入流并读取数据。
-
Java把读入的字节输入流转换成字符输入流读取(避免字节读取中文的时候出现乱码)
package com.pyb.studyIo; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; /*** @version 1.0* @Author 彭彦彬* @Date 2025/1/4 15:05* @注释*/ public class InputStreamWriter {public static void main(String[] args) {try {InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("pom.xml"));System.out.println(inputStreamReader.getEncoding());int ch;while ((ch = inputStreamReader.read()) != -1) {System.out.print((char) ch);}} catch (Exception e) {throw new RuntimeException(e);}} }
转换输出流(OutputStreamWriter)类 OutputStreamWriter类是Writer的子类。一个OutputStreamWriter对象将UTF-16字符转换为指定的字符编码的形式写入字节输出流。常用的构造方法有:
OutputStreamWriter(OutputStream out):按默认字符集的编码将字节输出流转换为字符输出流并写入数据; OutputStreamWriter(OutputStream out,Charset c):按指定字符集的编码往输出写入数据; OutputStreamWriter(OutputStream out,String enc)throws UnsupportedEncodingException:按名称所指字符集的编码将字节输出流转换为字符输出流写入数据。
-
用Java字节输出流转为字符输出流,按指定编码写入相应路径文件
package com.pyb.studyIo; import java.io.FileOutputStream; import java.io.OutputStreamWriter; /*** @version 1.0* @Author 彭彦彬* @Date 2025/1/4 15:20* @注释*/ public class OutPutStreamWriter {public static void main(String[] args) {try {OutputStreamWriter outPutStreamWriter=new OutputStreamWriter(new FileOutputStream("李四.txt"),"gbk");outPutStreamWriter.write("李四你好");outPutStreamWriter.flush();} catch (Exception e) {throw new RuntimeException(e);}} }
3.字符流
FileWriter类用于写字符文件,每次写入一个字符、一个数组或一个字符串,其类对象通常看成一个以字符为基本单位的无格式字符输出流。其构造方法有:
FileWriter(File file,boolean append)throws IOException:根据File对象构造一个FileWriter对象,若第二个参数为true,则将字符以添加的方式写入文件尾处,若为false则原有文件内容被清除; FileWriter(String fileName,boolean append)throws IOException:根据字符串文件名构造一个FileWriter对象,若第二个参数为true,则将字符以添加的方式写入文件尾处,若为false则原有文件内容被清除。
-
应用(把九九乘法表写入文本文件)
package com.pyb.studyIo; import java.io.IOException; /*** @version 1.0* @Author 彭彦彬* @Date 2025/1/4 15:30* @注释*/ public class FileWriter {public static void main(String[] args) {try {java.io.FileWriter fileWriter = new java.io.FileWriter("test.txt", false);for (int i = 1; i <= 9; i++) {for (int j = 1; j <= i; j++) {String str = i + "*" + j + "=" + i * j + " ";fileWriter.write(str);}fileWriter.write("\r\n");}fileWriter.flush();} catch (IOException e) {throw new RuntimeException(e);}} }
FileReader类用于读字符文件,每次读取一个字符或一个字符数组,其类对象通常看成一个以字符为基本单位的无格式字符输入流。其构造方法有:
FileReader(String fileName)throws FileNotFoundException:在给定中的文件名读取数据的情况下创建一个新的FileReader类; FileReader(File file)throws FileNotFoundException:在给定中的File参数读取数据的情况下创建一个新的FileReader类。
-
用Java字符流读取刚刚写入的文本文件
package com.pyb.studyIo; import java.io.FileNotFoundException; /*** @version 1.0* @Author 彭彦彬* @Date 2025/1/4 15:38* @注释*/ public class FileReader {public static void main(String[] args) {try {java.io.FileReader fileReader = new java.io.FileReader("test.txt");int len;while ((len = fileReader.read()) != -1) {System.out.print((char) len);}} catch (Exception e) {throw new RuntimeException(e);}} }
4.字符缓冲流
BufferedWriter是带缓冲的字符流,可用于以文本行为单位处理文本的场合,其常用的方法有:
BufferedWriter(Writer out):将输出流out转换成带缓冲的字符流,缓冲区大小为系统默认的; BufferedWriter(Writer out,int sz):将流out转换成带缓冲的字符流,缓冲区大小为sz; void newLine()throws IOException:写入行结束标记,该标记不是简单的换行符('\n'),而是由系统定义的属性line.separator。
-
应用把100以内的偶数,用字符缓冲流写入文本文件
package com.pyb.studyIo; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; /*** @version 1.0* @Author 彭彦彬* @Date 2025/1/4 15:44* @注释*/ public class BufferWri {public static void main(String[] args) {try {BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("test.txt"));int count = 0;for (int i = 1; i <= 100; i++) {count++;if (i % 2 == 0) {String str = i + " ";bufferedWriter.write(str);}if (count == 10) {count = 0;bufferedWriter.newLine();}}bufferedWriter.flush();} catch (IOException e) {throw new RuntimeException(e);}} }
-
最后别忘了刷新一下缓冲区
-
用Java字符缓冲流读取刚刚写入文本文件的内容
package com.pyb.studyIo; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; /*** @version 1.0* @Author 彭彦彬* @Date 2025/1/4 15:54* @注释*/ public class BufferR {public static void main(String[] args) {try {BufferedReader bufferedReader = new BufferedReader(new FileReader("test.txt"));String str;while ((str = bufferedReader.readLine()) != null) {System.out.println(str);}} catch (Exception e) {throw new RuntimeException(e);}} }
5.PrintWriter
文本文件的输出流有FileWriter类,该类通常是以字符为单位写入文本文件,但有时需要以Java的基本数据类型为单位写入文本文件,使用FileWriter类写入处理起来不是很方便,因此Java引入PrintWriter类进行此类文本的输出。其构造方法有:
PrintWriter(Writer out):将任意一个字符输出流out串接成一个PrintWriter对象,不自动刷空流; PrintWriter(Writer out,boolean autoFlush):将任意一个字符输出流out串接成一个PrintWriter对象,若boolean值为true则自动刷空流; PrintWriter(OutputStream out):将任意一个字符输出流out串接成一个PrintWriter对象,不自动刷空流; PrintWriter(OutputStream out,boolean autoFlush):将任意一个字节输出流out串接成一个PrintWriter对象,若boolean值为true则自动刷空流。
-
应用(把100以内的奇数用PrintWriter写入文本文件)
package com.pyb.studyIo; import java.io.FileWriter; import java.io.IOException; /*** @version 1.0* @Author 彭彦彬* @Date 2025/1/4 16:02* @注释*/ public class PrintWriter {public static void main(String[] args) {try {/*可以设置是否自动刷新*/java.io.PrintWriter printWriter = new java.io.PrintWriter(new FileWriter("test.txt"), true);/*把100以内的偶数用*/int count = 0;for (int i = 1; i <= 100; i++) {count++;if (i % 2 != 0) {printWriter.print(i + "\t");}if (count == 10) {count = 0;printWriter.println();}}} catch (IOException e) {throw new RuntimeException(e);}} }