IO流学习之字符流(一)
IO流(Input/Output)
简介:
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
IO技术实际上就是让数据在电脑内存或程序系统和硬件(硬盘,内存卡)之间转换的技术。
分类:
1、按流向
输入流:读取数据,把持久设备的数据读取到内存中。
输出流:写出数据,把内存的数据写出到持久设备。
2、按种类
字节流:传输过程中,传输数据的最基本单位是字节的流,常用的文件(txt、图片、mp3、mp4等)都可以用字节流来进行IO操作。
字符流:传输过程中,传输数据的最基本单位是字符的流,一般只能用于文本文件进行IO操作。
字节流转换:字节流+编码 =》字符流 ;字符流 =》字节流 + 解码 。
IO流之字符流
1、FileWriter类
常用方法:
输出流写数据步骤:
- 指定文件位置
- 创建输出流对象
- 调用方法写数据
- 将数据刷新到文件中
- 关闭资源
代码案例:
代码:
package InputOutput; import java.io.FileWriter; import java.io.IOException; public class FileWriterDemo1 { public static void main(String[] args) { // 指定文件位置 // 两个“\\”,因为一个“\”会被编译成特殊符号,也可以只用一个“/” // 文档不存在系统会创建文件,但文件夹缺少会报错! // String path = "E:\\JavaCodeDemo\\InputOutput\\filewriter\\demo1.txt"; String path = "E:/JavaCodeDemo/InputOutput/filewriter/demo1.txt"; // 相对路径会根据当前项目的位置创建文档 // String path = "demo1.txt"; // 不带文件后缀也会创建成功,但本质还是字符流 // String path = "demo"; try { // FileWriter类(字符流输出) FileWriter writer = new FileWriter(path); // 也可以直接写成 : FileWriter writer = new FileWriter("E:/JavaCodeDemo/InputOutput/filewriter/demo1.txt"); // 获取此流使用的字符编码的名称 String name = writer.getEncoding(); System.out.println("编码名称 :"+name); /* * 创建输出流对象做了哪些事情: A:调用系统资源创建了一个文件 B:创建输出流对象 C:把输出流对象指向文件 */ // 调用输出流对象的写数据的方法 // 写一个字符串数据 writer.write("helloworld!"); // 写一个字符串中的一部分数据 // 结果:hel (0:起始下标;3:长度) // writer.write("helloworld", 0, 3); // 写一个字符数组数据 // 結果:A0中(如果打开有乱码应该是文档和编译器的编码不同,设置一下编码格式即可) // char[] demo = { 'A', '0', '中' }; // writer.write(demo); // 写一个字符数组的一部分数据 // 結果:A (0:起始下标;1:长度) // char[] demo = { 'A', '0', '中' }; // writer.write(demo, 0, 1); // 调用flush,将内容写道文档中 writer.flush(); // 释放资源 writer.close(); // 流程没问题输出“Success” System.out.println("Success"); } catch (IOException e) { e.printStackTrace(); // 流程出错输出“failed” System.out.println("failed"); } // close()和flush()方法的区别: // flush():刷新缓冲区。流对象还可以继续使用。 // close():先刷新缓冲区調用flush,然后通知系统释放资源。流对象不可以再被使用了。 } }
结果:
上面只是简单的写入数据,每次都会把数据删除再重新写入,下面尝试一下不删除原有数据,而是直接在文本内追加数据:
代码:
package InputOutput; import java.io.FileWriter; import java.io.IOException; public class FileWriterDemo2 { public static void main(String[] args) { // 换行写入字符 // 不同的操作系统换行符是不一样的,常见系统换行符如下所示: // windows:\r\n // linux:\n // mac:\r String path = "E:\\JavaCodeDemo\\InputOutput\\filewriter\\demo2.txt"; try { // true表示追加写入,默认是false FileWriter writer = new FileWriter(path, true); for (int i = 0; i < 2; i++) { writer.write("测试 :" + i + "\r\n"); writer.flush(); } writer.close(); // 流程没问题输出“Success” System.out.println("Success"); } catch (IOException e) { e.printStackTrace(); // 流程出错输出“failed” System.out.println("failed"); } } }
结果:
2、FileReader类
常用方法:
输入流读数据步骤:
- 指定文件位置
- 创建输入流对象
- 调用方法读数据
- 关闭资源
代码案例:
文档内容:
代码:
package InputOutput; import java.io.FileReader; import java.io.IOException; public class FileReaderDemo1 { public static void main(String[] args) throws IOException { // 读取文件位置 // 文件路径需要准确不然报错 String path = "E:\\JavaCodeDemo\\InputOutput\\filewriter\\demo3.txt"; // 创建FileReader类(字符输入流) FileReader reader = new FileReader(path); // int result1 = reader.read(); // System.out.println(result1);//49 // result1 = reader.read(); // System.out.println(result1);//50 // result1 = reader.read(); // System.out.println(result1);//51 // result1 = reader.read(); // System.out.println(result1);//52 // result1 = reader.read(); // System.out.println(result1);//53 // result1 = reader.read(); // System.out.println(result1);//54 // 读取完以后读取到“-1” // result1 = reader.read(); // System.out.println(result1);//-1 //读取方法优化 int flag = 0; while ((flag = reader.read()) != -1) { System.out.println(flag); } reader.close(); // 流程成功输出Success System.out.println("Success"); } }
此处会把文档中的“123456”转化为字符‘1’、‘2’、‘3’、‘4’、‘5’、‘6’,所以输出结果是字符‘1’、‘2’、‘3’、‘4’、‘5’、‘6’根据ASCII码转换后的十进制数字。