黑马程序员-IO流(打印流、管道流、合并流)
2013-08-05 17:05
246 查看
-----------android培训、java培训、java学习型技术博客、期待与您交流!
------------
(1)打印流包括:PrintStream和PrintWriter
(2)该流提供了打印方法,可将各种类型的数据都原样打印
(1)file对象:File
(2)字符串路径:String
(3)字符输出流:OutputStream
(1)file对象:File
(2)字符串路径:String
(3)字节输出流:OutputStream
(4)字符输出流:Writer
管道流主要用于连接两个线程间的通信,输入输出可以直接进行连接,通过结合线程使用。
字节流:PipedInputStream,PipedOutputStream
字符流:PipedReader,PipedWriter
(1)要先创建一个读和写的两个类,实现Runnable接口,因为是两个不同的线程,覆盖run方法,注意,需要在内部抛异常
(2)创建两个管道流,并用connect()方法将两个流连接
(3)创建读写对象,并传入两个线程内,并start执行
(2)构造函数:SequenceInputStream(Enumeration<? extends FileInputStream> e)
(2)创建Enumeration对象,将集合元素加入。
(3)创建SequenceInputStream对象,合并流对象
(4)创建写入流对象,FileOutputStream,将数据写入流资源
(5)定义数组,将读取流数据存入数组,并将数组中元素写入文件中。
思路:
合并文件的时候,要用到集合,而Vector的效率太低,所以选择用ArrayList。
读取要用序列流SequenceInputStream。但该序列流要传入枚举类型的参数。
而枚举是Vector中的方法,ArrayList 中没有枚举方法,只有相似的Iterator迭代器。
故可建立枚举的匿名类,复写类中的方法以返回调用Iterator的方法即可。
注:匿名内部类访问的局部变量要用final修饰。
代码示例:假设有三个文件,将三者合并到一个新文件中
2、定义写入流变量:FileOutputStream
3、创建数组,并定义切割所需的大小|
4、循环读写数据,并每次创建一个新写入流,创建完后并写入文件中
5、关闭流资源
代码示例:
------------
一、 打印流
1、概述:
(1)打印流包括:PrintStream和PrintWriter
(2)该流提供了打印方法,可将各种类型的数据都原样打印
2、字节打印流:PrintStream
构造方法中可接收的参数类型:(1)file对象:File
(2)字符串路径:String
(3)字符输出流:OutputStream
3、字符串打印流:PrintWriter
构造方法中可接受的参数类型(1)file对象:File
(2)字符串路径:String
(3)字节输出流:OutputStream
(4)字符输出流:Writer
4、代码示例:
import java.io.*; class PrintDemo { public static void main(String[] args) throws IOException { // 键盘录入,创建读取流对象 BufferedReader bufr = new BufferedReader(new InputStreamReader( System.in)); // 使用打印流,将文件输出 // 输出到屏幕 PrintWriter out = new PrintWriter(new FileWriter("a.txt"), true); String line = null; while ((line = bufr.readLine()) != null) { if ("over".equals(line)) break; out.println(line.toUpperCase()); // out.flush(); } bufr.close(); out.close(); } }
二、管道流
1、概述:
管道流主要用于连接两个线程间的通信,输入输出可以直接进行连接,通过结合线程使用。字节流:PipedInputStream,PipedOutputStream
字符流:PipedReader,PipedWriter
2、使用步骤:
(1)要先创建一个读和写的两个类,实现Runnable接口,因为是两个不同的线程,覆盖run方法,注意,需要在内部抛异常(2)创建两个管道流,并用connect()方法将两个流连接
(3)创建读写对象,并传入两个线程内,并start执行
3、代码示例:
import java.io.*; class Read implements Runnable { private PipedInputStream in;// 建立输入管道 Read(PipedInputStream in) { this.in = in; } public void run()// 覆盖run方法,不能throw,只能try。 { try { // 读取写入的数据 System.out.println("开始写入数据,等待时间");// 测试用 Thread.sleep(3000); byte[] buf = new byte[1024]; System.out.println("读取前。。没有数据阻塞"); int len = in.read(buf); System.out.println("读到数据。。阻塞结束"); String s = new String(buf, 0, len);// 变成字符串 System.out.println(s); in.close(); } catch (Exception e) { throw new RuntimeException("管道读取流失败"); } } } class Write implements Runnable { private PipedOutputStream out;// 建立输出管道 // Write构造函数 Write(PipedOutputStream out) { this.out = out; } public void run() { try { System.out.println("开始写入数据,等待6秒后。");// 测试用 Thread.sleep(6000); out.write("管道流来喽~~~~".getBytes());// 字节流 out.close(); } catch (Exception e) { throw new RuntimeException("管道输出流失败"); } } } class PipedStreamDemo { public static void main(String[] args) throws IOException { PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream();// 创建管道流 // 将读取流(输入流)和写入流(输出流)关联起来 in.connect(out);// 连接管道输入流和输出流 // 创建读写对象,并创建线程对象 Read r = new Read(in); Write w = new Write(out);// 创建Runnable子类对象 new Thread(r).start(); new Thread(w).start();// 开启线程 } } /*output: 开始写入数据,等待时间 开始写入数据,等待6秒后。 读取前。。没有数据阻塞 读到数据。。阻塞结束 管道流来喽~~~~ */
三、合并流
1、概述:
(1)SequenceInputStream可以将多个流连接成一个源(2)构造函数:SequenceInputStream(Enumeration<? extends FileInputStream> e)
2、如何合并多个文件:
(1)创建集合,并将流对象添加进集合(2)创建Enumeration对象,将集合元素加入。
(3)创建SequenceInputStream对象,合并流对象
(4)创建写入流对象,FileOutputStream,将数据写入流资源
(5)定义数组,将读取流数据存入数组,并将数组中元素写入文件中。
思路:
合并文件的时候,要用到集合,而Vector的效率太低,所以选择用ArrayList。
读取要用序列流SequenceInputStream。但该序列流要传入枚举类型的参数。
而枚举是Vector中的方法,ArrayList 中没有枚举方法,只有相似的Iterator迭代器。
故可建立枚举的匿名类,复写类中的方法以返回调用Iterator的方法即可。
注:匿名内部类访问的局部变量要用final修饰。
代码示例:假设有三个文件,将三者合并到一个新文件中
import java.io.*; import java.util.*; class SequenceDemo { // 合并流对象 public static void sequenceFile() throws IOException { FileOutputStream fos = null; SequenceInputStream sis = null; try { // 创建集合,存储多个文件 ArrayList<FileInputStream> al = new ArrayList<FileInputStream>(); for (int i = 1; i <= 3; i++) { al.add(new FileInputStream(i + ".txt")); } // 匿名内部类访问局部变量要final final Iterator<FileInputStream> it = al.iterator(); // 创建Enumeration匿名对象 Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() { public boolean hasMoreElements() { return it.hasNext(); } public FileInputStream nextElement() { return it.next(); } }; // 合并流对象,将集合元素加入。 sis = new SequenceInputStream(en); // 创建写入流对象,FileOutputStream fos = new FileOutputStream("7.bmp"); byte[] b = new byte[1024 * 1024]; int len = 0; // 循环,将数据写入流资源 while ((len = sis.read(b)) != -1) { fos.write(b); } } catch (IOException e) { throw new RuntimeException("文件操作失败"); } // 关闭流资源 finally { try { if (fos != null) fos.close(); } catch (IOException e) { throw new RuntimeException("关闭流资源操作失败"); } try { if (sis != null) sis.close(); } catch (IOException e) { throw new RuntimeException("关闭流资源操作失败"); } } } public static void main(String[] args) throws IOException { sequenceFile(); } }
3、切割流资源:
1、先关联文件FileInputStream2、定义写入流变量:FileOutputStream
3、创建数组,并定义切割所需的大小|
4、循环读写数据,并每次创建一个新写入流,创建完后并写入文件中
5、关闭流资源
代码示例:
import java.io.*; public class SplitFile { // 切割流对象 public static void splitFile() throws IOException { // 创建全局变量 FileInputStream fis = null; FileOutputStream fos = null; try { // 创建文件读取流 fis = new FileInputStream("11.jpg"); // 创建数组 byte[] b = new byte[1024 * 1024]; int len = 0; // 计数器 int count = 1; // 循环写入数据 while ((len = fis.read(b)) != -1) { // 每次创建一个新写入流,写入后关闭流资源 fos = new FileOutputStream((count++) + ".part"); fos.write(b, 0, len); fos.close(); } } catch (IOException e) { throw new RuntimeException("关闭流资源操作失败"); } // 关闭流资源 finally { try { if (fis != null) fis.close(); } catch (IOException e) { throw new RuntimeException("关闭流资源操作失败"); } } } public static void main(String[] args) throws Exception { splitFile(); } }
相关文章推荐
- 黑马程序员_Java基础_IO流_打印流,合并流,分割文件,对象持久化,管道流...其他常用流
- 黑马程序员-基础-IO流-(Properties,打印流,合并流)
- 黑马程序员——25,打印流,合并流,对象序列化,管道流,RandomAccessFile
- 黑马程序员——41,打印流,合并流,对象序列化,管道流,RandomAccessFile
- 黑马程序员------IO流 操作字节数组的流对象,对象序列化,打印流,随机存储文件,合并流,管道流,操作基本数据类型的流对象
- 黑马程序员-----IO流(3)File类、打印流、序列化、管道流、字符编码等
- 黑马程序员 Java面向对象——IO流 总结应用(打印流)
- 黑马程序员_IO流——管道流
- 黑马程序员——IO流——IO转换流,打印流,序列化流,properties以及其他流
- 黑马程序员之IO流(管道流)
- 黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile
- 黑马程序员——IO流(File类、Properties类、打印流、序列流)
- 黑马程序员——Java基础IO流概述、字符流、字节流、流操作规律、File类、Properties类、打印流、序列流
- 黑马程序员_<<properties,打印流,合并流,分割流>>
- 黑马程序员_IO流四(对象的序列化,管道流,RandomAccessFile,DataStream,ByteArrayStream)
- 黑马程序员—异常+IO流File类+Properties+PrinWriter+合并流+切割文件+对象序列化+管道流+RandomAccessFile+操作基本数据类型的DataStre
- Java基础-打印流和合并流、分割与管道流、RandomAccessFile及其它流
- 黑马程序员《java基础总结(十二)》(IO流<File类、打印流>)
- 黑马程序员_<<properties,打印流,合并流,分割流>>
- java--io流-打印流,序列流,操作对象,管道流,RandomAccessFile,操作字节数组