1、JAVA之旅三十JAVA之旅(三十)一.打印流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;publi
2、c 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)
3、; oWriter.close(); bufr.close(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); 要想存到文件里,也是可以直接把文件给放进去的二.合并流我们来看看什么是合并流,在API文档上说,他可以串联流package com.lgl.hellojava;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import jav
4、a.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 v = new Vector(); v.add(new FileInputStream(1.txt); v.add(new FileInputStream(2.txt); Enumeration elements = v.elements();
5、SequenceInputStream sis = new SequenceInputStream(elements); FileOutputStream fos = new FileOutputStream(3.txt); byte buf = new byte1024; 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 block
6、 e.printStackTrace(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); 把1.txt和2.txt乃至add更多的内容合并到3.txt文件中,这就是流的合并三.切割文件合并文件可以,那肯定可以切割了,我们来看下具体是怎么去制作的/ 切割文件 public static void splitFile() try FileInputStream fis = new FileInputStream(1.jpg); FileOutputStream fos = null; byt
7、e buf = new byte1024 * 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 block e.printStackTrace(); catch (IOException e) / TO
8、DO Auto-generated catch block e.printStackTrace(); 当运行结束之后,我们可以看到已经成功切割了切割完我们可以合并了/ 合并文件 public static void merge() ArrayList al = new ArrayList(); for (int i = 1; i = 2; i+) try al.add(new FileInputStream(i + .patch); catch (FileNotFoundException e) / TODO Auto-generated catch block e.printStackTra
9、ce(); Iterator iterator = al.iterator(); Enumeration en = new Enumeration() Override public boolean hasMoreElements() / TODO Auto-generated method stub return iterator.hasNext(); Override public FileInputStream nextElement() / TODO Auto-generated method stub return iterator.next(); ; try SequenceInp
10、utStream seq = new SequenceInputStream(en); FileOutputStream fos = new FileOutputStream(2.jpg); byte buf = new byte1024; 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 block e.printStackTrac
11、e(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); 这样我们就把图片拷贝出来了,可以看到这段代码是非常帮的,我们一定会用到的,希望能用的上四.对象的序列化Serializable其实就是可以直接操作对象的流,他会实现一个Serializable()接口,我们用代码来看下他是怎么用的,我们直接写读取对象的类了package com.lgl.hellojava;import java.io.FileInputStream;import java.io.FileOutputStream;i
12、mport 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 FileInput
13、Stream( obj.txt); Person p = (Person) ois.readObject(); System.out.println(p); ois.close(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); catch (ClassNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); private static void writeObj() try ObjectOu
14、tputStream oos = new ObjectOutputStream( new FileOutputStream(obj.txt); oos.writeObject(new Person(zhangsan, 20); oos.close(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); class Person implements Serializable String name; int age; public Person(String name, int age) t
15、his.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(); PipedO
16、utputStream po = new PipedOutputStream(); try pi.connect(po); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); Read read = new Read(pi); Write write = new Write(po); new Thread(read).start(); new Thread(write).start(); class Read implements Runnable private PipedInputStre
17、am in; public Read(PipedInputStream in) this.in = in; Override public void run() try byte buf = new byte1024; 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 block e.printStackTrace(); class Write implem
18、ents Runnable private PipedOutputStream out; public Write(PipedOutputStream out) this.out = out; Override public void run() try out.write(yes.getBytes(); out.close(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); 现在就可以联通了六.RandomAccessFile这是一个很特别的家伙,他继承的是Object该类不是IO体系
19、中的子类但是他是IO包中的成员,他同时具备读写功能内部封装了一个数组,而且通过指针对数组中的元素进行操作可以通过getFilePointer或者指针位置同时可以通过seek改变指针的位置其实完成读写的原理就是内部封装了字节输入,输出流,通过构造函数可以看出该类具备操作文件的能力,而且操作文件还有模式package com.lgl.hellojava;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;public class HelloJJAVA publ
20、ic 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 block e.printStackTrace(); catch (IOExce
21、ption e) / TODO Auto-generated catch block e.printStackTrace(); 这只是一个写的过程,我们的特性还没有体现出来,我们来看下他是怎么读的private static void ReadFile() try RandomAccessFile raf = new RandomAccessFile(1.txt, r); / 调整对象指针 raf.seek(8 * 0); byte buf = new byte1024; raf.read(buf); String s = new String(buf); System.out.println
22、(s); raf.close(); catch (FileNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); 如果操作的文件不存在,就会自动创建,如果存在,直接覆盖七.IO其他类IO其他包里,还有一些其他的使用操作基本数据类型字节数组字符数组1.基本数据类型我们先来看下基本数据类型的,我直接读写都写出来 public static void r
23、eadData() 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 block e.printStackTce(); catch (IOException e) /
24、TODO Auto-generated catch block e.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 block e.pr
25、intStackTrace(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); 读取基本数据类型二.字节数组这个偶尔用下,但是我们还是要去学习一下的ByteArrayInputStream: 在构造的时候,需要接收数据源,而且数据源是一个字节数组ByteArrayOutputStream:在构造的时候,不用定义数据的目的,因为该对象中已经内部封装了可变程度的字节数组因为这两个流的对象都操作的数组,并且没有使用系统资源,所以,不用进行close关闭!package com.lgl.hell
26、ojava;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
27、= 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.pr
28、intln(Arrays.toString(b1);他得到的是什么?现在我换一个编码byte b1 = s.getBytes(GBK);11我设置成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(Stri
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1