话接上回,继续java IO的学习。上一次说完了字符流的读写数据,这次将基础部分剩余的一点内容看完。
一、流按功能分类
1、系统流
1.1 概述
系统流的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流。
1 2 3
| System.in:标准输入流,默认设备是键盘。 System.out:标准输出流,默认设备是控制台。 System.err:标准错误流,默认设备是控制台。
|
1.2 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.io.IOException;
public class SystemDemo { public static void main(String[] args){ byte[] byteData=new byte[100]; System.out.println("请输入英文:"); try{ System.in.read(byteData); }catch (IOException e){ e.printStackTrace(); } System.out.println("您输入的内容如下:"); for(int i=0;i<byteData.length;i++){ System.out.print((char)byteData[i]); } } }
|
运行结果
1 2 3 4
| 请输入英文: admdom sldmv skemcp 您输入的内容如下: admdom sldmv skemcp
|
1.2 几点注意
System.in 是 InputStream 类的一个对象,System.in.read() 访问 InputStream 类定义的 read() 方法,可以从键盘读取一个或多个字符。
System.out 本质是一个字节输出流,主要用于将指定内容输出到控制台。
System.out 和 System.error 是 PrintStream 类(一个从 OutputStream 派生的输出流,还执行低级别的 write() 方法)的对象。故除了 print() 和 println() 方法,System.out 还可以调用 write() 方法实现控制台输出(一般不用)
2、打印流
有字节打印流(PrintStream)和字符打印流(PrintWriter)。
特点:只负责输出数据,不负责读取数据,且有自己的特有方法
2.1 字节打印流(PrintStream)
1 2
| PrintStream(String fileName):使用指定的文件名创建新的打印流 使用继承父类(OutputStream)的方法(write方法)写数据,查看的时候会转码;使用自己特有的方法写数据,查看的数据原样输出
|
2.2 字符打印流(PrintWriter)
继承父类:Writer,即可以调用父类的方法(Writer()方法重载:5个)
常用构造方法(两个)
1 2 3 4
| PrintWriter(String fileName):使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新 PrintWriter(Writer out,boolean autoFlush):创建一个新的PrintWriter - out:字符输出流 - autoFlush:一个布尔值,若为真,则println、printf或format方法将刷新输出缓冲区(即写完后不用再调用flush()方法刷新流也能在文件中显示数据)
|
2.3 示例(字节打印流)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.io.IOException; import java.io.PrintStream;
public class PrintStreamDemo { public static void main(String[] args) throws IOException { PrintStream ps=new PrintStream("D:\\Ultimate JavaCode\\src\\test8\\ps");
ps.println(97); ps.println(98); ps.close(); } }
|
字符打印流类似,不再赘述
除系统流、打印流外,还有节点流,处理流
节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。
二、字符编码
1、查看系统默认编码
1 2 3 4 5 6 7
| public class Bianma { public static void main(String[] args){ System.out.println("系统默认编码:"+System.getProperty("file.encoding")); } }
|
2、创建文件与乱码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets;
public class Bianma { public static void main(String[] args) throws Exception { File f=new File("C:\\Users\\ASUS\\Desktop\\project1\\src"+File.separator+"BianmaTest.txt"); OutputStream out=new FileOutputStream(f); byte b[]="你好,张三!".getBytes(StandardCharsets.UTF_8); byte b1[]="你好,李四!".getBytes(StandardCharsets.ISO_8859_1); out.write(b); out.write(b1); out.close(); } }
|
运行结果(会生成一个BianmaTest.txt文件,打开查看内容如下,出现乱码)
三、字符缓冲流 & 集合
1、集合到文件
需求:把ArrayList集合中的字符数据写入到文本文件。
要求:每一个字符串元素作为文件中的一行数据(newLine方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList;
public class ArrayListDemo { public static void main(String[] args) throws IOException { ArrayList<String> arr=new ArrayList<>(); arr.add("hello"); arr.add("javase"); arr.add("javaee"); BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\ASUS\\Desktop\\project1\\src\\bw.txt")); for(String s:arr){ bw.write(s); bw.newLine(); bw.flush(); } bw.close(); } }
|
运行结果(会生成一个bw.txt文件,打开查看内容如下)
集合到文件改进版(自主练习)
1 2 3 4 5 6 7 8 9 10 11 12 13
| 步骤: 1)创建一个Student学生类(完整javabean) 2)创建ArrayList集合,泛型约束为Student类型 3)创建学生对象并将学生对象添加到集合(add()方法) 4)创建字符缓冲输出流对象BufferedWriter 5)遍历集合(增强for循环),得到每一个学生对象 6)把学生对象的数据拼接成指定的字符串(使用StringBuilder,并调用其append()方法实现拼接) 7)调用字符缓冲输出流对象的方法写数据(3步) bw.write(sb.toString()); bw.newLine(); bw.flush() 8)释放资源 bw.close()
|
2、文件到集合
需求:将文本文件中的数据读取到集合中,并遍历集合。
要求:文件中每一行数据是一个集合元素(readLine方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.AbstractList; import java.util.ArrayList;
public class TxtToArrayListDemo { public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new FileReader("C:\\Users\\ASUS\\Desktop\\project1\\src\\bw.txt")); AbstractList<String> arr=new ArrayList<>(); String line; while((line=br.readLine())!=null){ arr.add(line); } br.close(); for(String s:arr){ System.out.println(s); } } }
|
运行结果(输出在控制台)
文件到集合的改进版(类似,自主练习)