黑马程序员-切割流和合并流

 

----------- android培训java培训java学习型技术博客、期待与您交流! ------------ 

 

XML封装

java获取非常麻烦  用很多方法
所以有牛人写了
dom4j  (dom for java)

 

PrintWriter
IO包中的其他类

打印流:
 PrintWriter和PrintStream
        可以直接操作输入流和文件

序列流:
 SequenceInputStream
 对多个流进行合并

操作对象:
 ObjectInputStream与ObjectOutputStream
 被操作的对象需要实现Serializeble(标记接口)

练习:文件分割程序

 

 

打印流:
可以将各种数据类型的数据都原样打印
int只输出最低8位

PrintStream(字节打印流)
构造时能直接操作文件

构造函数可以接收的参数类型:
1、file对象
2、字符串路径
3、字节输出流

 

 

PrintWriter(字符打印流)


1、file对象
2、字符串路径
3、字节输出流
4、字符输出流


main
{
 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
 //读取键盘输入的字符流,背也要背下来
 PrintWriter out = new PrintWriter(System.out,true);
        //输出换行就刷新
 /*写入文件中 “a.txt”,无法刷新,要文件也刷新? 将文件封装成流就可以了 :(new FileWriter("a,txt"),true);  提高效率? 再加一个new BufferedWriter(...)   */

 

 String line = null;
 while((line = bufr.readLine())!=null)
 {
  if("over".equals(line))
   break;
  out.println(line.toUpperCase()); 
  //out.flush();
 }
 out.close();
 bufr.close();
 }

 


合并流

SequnceInputStream
没有对应的OutputStream
表示其他输入流的逻辑串联,从输入流的有序集合开始,从第一个输入流开始读取,直到文件末尾,接着从第二个输入流读取,依此类推,指导包含的最后一个输入流的文件末尾为止。

 

SequenceInputStream(InputStream s1,InputStream s2);

SequenceInputStream(Enumeration);
通过记住参数来初始化新创建的SequenceInputStream

 

public static void main(String[] args)
{
 Vector v = new Vector();
 v.add(new FileInputStream("c:\\1.txt"));
 v.add.........
 v.add.........
 Enumetation en = v.elements();
 SequenceInputStream sis = new SequenceInputStream(en);
 FileOutputStream fos = new FileOutputStream("c:\\4.txt");
 byte[] buf = new byte[1024];
 int len=0;
 while((len=sis.read(buf))!=-1)
 {
  fos.write(buf,0,len);
 } 
 fos.close();
 sis.close();
}

 

多个读取流合并成一个读取流

 

 


切割文件
public static void splitFile()throws  IOException
{
 FileInputStream fis = new FileInputStream("c:\\1.bmp");
 FileOutputStream fos = null;
 byte[] buf = new byte[1024*1024];
 int len = 0;
 int count = 1;
 while((len=fis.read(buf))!=-1)
 {
  fos = new FileOutputStream("c:\\splitfiles\\"+(count++)+".part");
  fos.write(buf,0,len);
  fos.close();
 }
 fis.close();
}

 


合并碎片文件:
public static void merge()
{
 ArrayList al = new ArrayList();
 for(int x=1;x<=3;x++)
 {
  al.add(new FileInputStream("c:\\aplitfiles\\"+x+".part"));
 }
 final Iterator it = al.iterator();//匿名内部类final修饰??

 Enumeration en = new Enumeration()
 {
  public boolean hasMoreElements()
  {
   return it.hasNext();
  }
  public FileInputStream nextElement()
  {
   return it.next();
  }
 };


 SequenceInputStream sis = new SequenceInputStream(en);

 //偷懒就不加缓冲区了


 FileOutputStream fos = new FileOutputStream("c:\\splitfiles\\0.bmp");
 byte[] buf = new byte[1024];
 int len=0;
 while((len=sis.read(buf))!=-1)
 {
  fos.write(buf,0,len);
 }
 fos.close();
 sis.close();
}

 


若想分割成100M一个的碎片
计数器,100次之后重新创建一个输出流对象
不要直接定义100M的数组,内存会挂掉的 - -


 

 

----------- android培训java培训java学习型技术博客、期待与您交流! ------------ 

 

 

你可能感兴趣的:(java技术学习)