JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码


三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧!

一.打印流PrintWriter

打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件

  • 该流提供了打印方法,可以将各种数据类型原样打印

    • file对象 File
    • 字符串路径 String
    • 字节打印流
    • 字符打印流

我们演示一遍大家就对此有所了解了

package com.lgl.hellojava;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;public class HelloJJAVA {public static void main(String[] args) {try {BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));PrintWriter oWriter = new PrintWriter(System.out, true);String line = null;while ((line = bufr.readLine()) != null) {if (line.equals("over")) {break;}oWriter.write(line);}oWriter.close();bufr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

要想存到文件里,也是可以直接把文件给放进去的

二.合并流

我们来看看什么是合并流,在API文档上说,他可以串联流

package com.lgl.hellojava;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;public class HelloJJAVA {public static void main(String[] args) {try {Vector<FileInputStream> v = new Vector<FileInputStream>();v.add(new FileInputStream("1.txt"));v.add(new FileInputStream("2.txt"));Enumeration<FileInputStream> elements = v.elements();SequenceInputStream sis = new SequenceInputStream(elements);FileOutputStream fos = new FileOutputStream("3.txt");byte[] buf = new byte[1024];int len = 0;while ((len = sis.read(buf)) != -1) {fos.write(buf, 0, len);}   fos.close();sis.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

把1.txt和2.txt乃至add更多的内容合并到3.txt文件中,这就是流的合并

三.切割文件

合并文件可以,那肯定可以切割了,我们来看下具体是怎么去制作的

// 切割文件public static void splitFile() {try {FileInputStream fis = new FileInputStream("1.jpg");FileOutputStream fos = null;byte[] buf = new byte[1024 * 1024];int len = 0;int count = 1;while ((len = fis.read(buf)) != -1) {fos = new FileOutputStream((count++) + ".patch");fos.write(buf, 0, len);fos.close();}fis.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

当运行结束之后,我们可以看到

已经成功切割了

切割完我们可以合并了

// 合并文件public static void merge() {ArrayList<FileInputStream> al = new ArrayList<>();for (int i = 1; i <= 2; i++) {try {al.add(new FileInputStream(i + ".patch"));} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Iterator<FileInputStream> iterator = al.iterator();Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {@Overridepublic boolean hasMoreElements() {// TODO Auto-generated method stubreturn iterator.hasNext();}@Overridepublic FileInputStream nextElement() {// TODO Auto-generated method stubreturn iterator.next();}};try {SequenceInputStream seq = new SequenceInputStream(en);FileOutputStream fos = new FileOutputStream("2.jpg");byte[] buf = new byte[1024];int len = 0;while ((len = seq.read(buf)) != -1) {fos.write(buf, 0, len);}fos.close();seq.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

这样我们就把图片拷贝出来了,可以看到

这段代码是非常帮的,我们一定会用到的,希望能用的上

四.对象的序列化Serializable

其实就是可以直接操作对象的流,他会实现一个Serializable()接口,我们用代码来看下他是怎么用的,我们直接写读取对象的类了

package com.lgl.hellojava;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class HelloJJAVA {public static void main(String[] args) {// writeObj();readObj();}private static void readObj() {try {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));Person p = (Person) ois.readObject();System.out.println(p);ois.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private static void writeObj() {try {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));oos.writeObject(new Person("zhangsan", 20));oos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}class Person implements Serializable {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}}

OK,自己去验证一下

五.管道流

输入输出可以直接进行连接,通常结合线程使用

package com.lgl.hellojava;import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;public class HelloJJAVA {public static void main(String[] args) {PipedInputStream pi = new PipedInputStream();PipedOutputStream po = new PipedOutputStream();try {pi.connect(po);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}Read read = new Read(pi);Write write = new Write(po);new Thread(read).start();new Thread(write).start();}
}class Read implements Runnable {private PipedInputStream in;public Read(PipedInputStream in) {this.in = in;}@Overridepublic void run() {try {byte[] buf = new byte[1024];int len = in.read(buf);String s = new String(buf, 0, len);System.out.println(s);in.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}class Write implements Runnable {private PipedOutputStream out;public Write(PipedOutputStream out) {this.out = out;}@Overridepublic void run() {try {out.write("yes".getBytes());out.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

现在就可以联通了

六.RandomAccessFile

这是一个很特别的家伙,他继承的是Object

  • 该类不是IO体系中的子类
  • 但是他是IO包中的成员,他同时具备读写功能
  • 内部封装了一个数组,而且通过指针对数组中的元素进行操作
  • 可以通过getFilePointer或者指针位置同时可以通过seek改变指针的位置

其实完成读写的原理就是内部封装了字节输入,输出流,通过构造函数可以看出该类具备操作文件的能力,而且操作文件还有模式

package com.lgl.hellojava;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class HelloJJAVA {public static void main(String[] args) {writeFile();}public static void writeFile() {try {RandomAccessFile raf = new RandomAccessFile("1.txt", "rw");raf.write("zhangssan".getBytes());raf.writeInt(99);raf.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

这只是一个写的过程,我们的特性还没有体现出来,我们来看下他是怎么读的

private static void ReadFile() {try {RandomAccessFile raf = new RandomAccessFile("1.txt", "r");// 调整对象指针raf.seek(8 * 0);byte[] buf = new byte[1024];raf.read(buf);String s = new String(buf);System.out.println(s);raf.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

如果操作的文件不存在,就会自动创建,如果存在,直接覆盖

七.IO其他类

IO其他包里,还有一些其他的使用

  • 操作基本数据类型
  • 字节数组
  • 字符数组

1.基本数据类型

我们先来看下基本数据类型的,我直接读写都写出来

public static void readData() {try {DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));int num = dis.readInt();boolean d = dis.readBoolean();System.out.println(num + "" + d + "");dis.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 基本数据类型public static void writeDatea() {try {DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));dos.writeInt(55);dos.writeBoolean(true);dos.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

读取基本数据类型

二.字节数组

这个偶尔用下,但是我们还是要去学习一下的

  • ByteArrayInputStream: 在构造的时候,需要接收数据源,而且数据源是一个字节数组

  • ByteArrayOutputStream:在构造的时候,不用定义数据的目的,因为该对象中已经内部封装了可变程度的字节数组

因为这两个流的对象都操作的数组,并且没有使用系统资源,所以,不用进行close关闭!

package com.lgl.hellojava;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;public class HelloJJAVA {public static void main(String[] args) {// 数据源ByteArrayInputStream bis = new ByteArrayInputStream("123".getBytes());// 数据目的ByteArrayOutputStream bos = new ByteArrayOutputStream();int ch = 0;while ((ch = bis.read()) != -1) {bos.write(ch);}System.out.println(bos.size());System.out.println(bos.toString());}
}

是不是比较简单,字符流我就不说了,和字节流是类似的,但是他会衍生出一个新的内容就是字符编码

八.字符编码

这些乱七八糟的编码说真的,东西还是挺多的,但是我并不想讲那么多,因为本身我也不是很清楚,其次这玩意大致的知道一点就可以了(个人觉得),什么ASCLL,GBK,UTF-8之类的

        String s = "hello java";byte [] b1 = s.getBytes();System.out.println(Arrays.toString(b1));

他得到的是什么?

现在我换一个编码

byte [] b1 = s.getBytes("GBK");

我设置成GBK,他的值是一样的,说明默认的是GBK

九.练习

写完这个练习,我们的I/O流就GG了,感慨颇多,写I/O写了很多篇,但是仍然晕乎乎的,应该继续加深印象的,我们来看下需求

  • 有五个学生,每个学生有三门课程,从键盘输入以下数据(包括姓名,三门课成绩),输入的格式,如zhangsan,30,60,96计算出总成绩,并把学生的信息和计算出的总分数高低顺序存入文件student.txt中去;

好了,开始撸代码了

package com.lgl.hellojava;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Set;
import java.util.TreeSet;public class HelloJJAVA {public static void main(String[] args) {/*** 逻辑: * 1.通过获取键盘录入一行数据,然后取出数据封装成学生对象 * 2.需要从高到低排列,需要排序,使用集合TreeSet就可以了* 3.写入文件*/try {Set<Student> stus = StudentInfoTool.getStudents();StudentInfoTool.writeFile(stus);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}// 比较数据,Comparable接口
class Student implements Comparable<Student> {// 姓名private String name;// 三科分数private int n1, n2, n3;// 总分private int sum;// 构造函数public Student(String name, int n1, int n2, int n3) {this.name = name;this.n1 = n1;this.n2 = n2;this.n3 = n3;sum = n1 + n2 + n3;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSum() {return sum;}public void setSum(int sum) {this.sum = sum;}@Overridepublic int compareTo(Student o) {int num = new Integer(this.sum).compareTo(new Integer(o.sum));if (num == 0) {return this.name.compareTo(o.name);}return num;}@Overridepublic int hashCode() {// TODO Auto-generated method stubreturn name.hashCode() + sum * 78;}@Overridepublic boolean equals(Object obj) {if (!(obj instanceof Student)) {throw new ClassCastException("Type Error");}Student s = (Student) obj;return this.name.equals(s.name) && this.sum == s.sum;}}// 工具类
class StudentInfoTool {public static Set<Student> getStudents() throws IOException {BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;// 集合Set<Student> stus = new TreeSet<>();while ((line = bufr.readLine()) != null) {if (line.equals("over")) {break;}String[] info = line.split(",");Student student = new Student(info[0], Integer.parseInt(info[1]),Integer.parseInt(info[2]), Integer.parseInt(info[3]));stus.add(student);}bufr.close();return stus;}// 写入文件public static void writeFile(Set<Student> stus) {try {BufferedWriter bufw = new BufferedWriter(new FileWriter("student.txt"));for (Student stu : stus) {bufw.write(stu.getName());bufw.write(stu.getSum() + "");bufw.newLine();bufw.flush();}bufw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

输出的结果,可以看到

总数,从小到大,如果你想从高到低的话,自己去实现下排序,看看你们学的怎么样了

好的,我们本篇到这里就结束了,这篇也是憋了挺久的才别出来的,终于把IO写完了

有兴趣的可以加群:555974449

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码相关推荐

  1. Java Review(三十八、网络编程)

    文章目录 网络基础 IP地址 端口 域名 网络模型 常用协议 Java 的基本网络支持 使用 InetAddress URL. URLConnection 和 URLPermission 基于TCP协 ...

  2. Java Review(三十六、IO)

    文章目录 File 类 访问文件和目录 1.访问文件名相关的方法 2. 文件检测相关的方法 3. 获取常规文件信息 4. 文件操作相关的方法 5. 目录操作相关的方法 文件过滤器 IO流概览 流的分类 ...

  3. IO流--文件切割合并对象的序列化

    [阶段一目标:文件的分割]1,切割文件的原理:一个源对应多个目的:切割文件的两种方式.2,碎片文件的命名和编号.3,程序代码体现.4,如何记录源文件的类型以及碎片的个数(建立配置信息文件)(其实也可以 ...

  4. java 快速合并文件_java 实现切割文件和合并文件的功能

    java 实现切割文件和合并文件的功能 一.切割文件代码如下: 需求:将一个媒体文件切割成多个碎片(每个碎片的大小为1M),并添加配置说明文件 1.创建(指定)一个文件夹,用于保存切割出来的碎片 2. ...

  5. Java从零开始学三十六(JAVA IO- 字符流)

    一.字符流 BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中 BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的 ...

  6. python123 io平台-Java Review(三十六、IO)

    Java 的 IO 通过 java.io 包下的类和接口来支持, 在 java.io 包下主要包括输入. 输出两种 10 流, 每种输入. 输出流又可分为字节流和字符流两大类. 其中字节流以字节为单位 ...

  7. Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类

    一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用"="或者使用"new String(...)" String aStr = " ...

  8. Java入门(三十五)

    Map集合概述和特点 map由两部分组成,k是map集合里面存储键的类型,v是map里面存储值的类型. map集合是一个接口,将键映射到值的对象,他不能包含重复的键,每个键可以映射到一个值. 举例,比 ...

  9. IO知识点整理(序列化,管道流,数据流,字节数组流,与编码)

    一:序列化的问题 1.序列号的使用问题 关于在序列化中的序列号的使用问题,一般要是使用. 因为,每次要序列化的类产生都会产生一个一个新的序列号,如果将这个类的程序修改后,就会产生新的序列号,以前序列化 ...

  10. idea 文件流读取web-inf下的文件_C#初学者教程系列20:Stream流读写

    本文是C#初学者简单教程,这是第20篇.感谢观看,记得关注我,后续还有更多教程文章,谢谢. 本文环境为Visual Studio 2019. 一.介绍 在C#文件操作中,通常使用流来读取和写入文件.流 ...

最新文章

  1. 基于fpga的数码管动态扫描电路设计_【至简设计案例系列】基于FPGA的密码锁设计(altera版)...
  2. 一些不是很常用的SQL语句
  3. HTML5 实现手机拍照上传
  4. tcpdump使用实例——基于ip统计流量
  5. python return用法_Python 为什么没有 void 关键字?
  6. excel appliacation 不能分配角色_用了5年Excel,换了这个神奇的报表工具,不禁感叹:国产真香...
  7. qt鼠标进入窗体后,窗体自动置顶
  8. stm32f407网页服务器,STM32F407单片机通过USR-LTE-7S4模块和服务器进行4G通信
  9. SSH框架整合截图总结(三)
  10. 五子棋java百度贴吧_五子棋单机版
  11. php最新版本6,PHP实用函数6
  12. 系统运维包括哪些内容_UI设计内容包括哪些?
  13. 分布式与集群的联系与区别
  14. MACD神器 通达信指标公式 副图 源码 无加密 无未来
  15. kali教程--破解wifi密码
  16. 图像识别距离算法matlab
  17. 苹果库乐队怎么玩_学会这个,自己给苹果手机换来电铃声
  18. vscode 程序员鼓励师_把软萌程序猿鼓励师装进VScode里?最强交互彩虹屁,GitHub2.5k星标,爱上写代码...
  19. 设置笔记本为无线wifi发射器
  20. 大数字加法运算(超过1000位)

热门文章

  1. oracle10rac asm hpux,oracle 10g rac asm上面的控制文件损坏既增加方法
  2. 基于JavaWeb的企业出差费用报销管理系统设计与实现
  3. java程序流程图_跟我学java编程—绘制流程图其实很简单
  4. 破解含语序问题的点击验证码
  5. MySql 数据类型 - 整型
  6. 如何使用百度云人脸识别服务(V3版接口python语言) (七)开始应用人脸库
  7. 链表插入排序和冒泡排序c语言
  8. C语言约瑟夫环(简单版)
  9. 操作系统概念第九版编程项目:Linux内核模块
  10. 我们需要什么样的应急手册(佐岸)