黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile

------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!

-------

黑马程序猿——25。打印流。合并流。对象序列化,管道流,RandomAccessFile

/*

IO流的打印流:专门用于打印的流

字节打印流PrintStream

PrintStream的构造函数能够接收file对象,String型字符串路径,字节输出流

字符打印流PrintWriter

PrintWriter的构造函数能够接收file对象,字符串路径。字节输出流,字符输出流

PrintWriter有刷新方法。写的时候记得刷新。

*/

import java.io.*;
class Ioliou25
{
         public   static  void   main(String[] args)throws  IOException
         {
                   File   f=new File("f:\\yyyyyyyk.txt");
                   BufferedReader    bufr=new BufferedReader(new InputStreamReader(System.in));
         //      PrintWriter  pw=new PrintWriter(System.out,true);//这个带true的就自己主动刷新,不用写flush方法了
       //InputStreamReader是字节与字符的桥梁
                   //PrintWriter   pw=new PrintWriter(f,true);//这样的写法编译错误,PrintWriter类没有这样的构造函数
                   /*
                   PrintWriter构造函数里面能够带true的仅仅有
                   PrintWriter(OutputStream   out,boolean  autoFlush)
                   PrintWriter(Writerout, boolean autoFlush)
                   */
         //      PrintWriter   pw=new PrintWriter(System.out);
             PrintWriter   pw=new PrintWriter(new FileWriter(f),true);//使用FileWriter嵌套f的话就能够带true
                   String   s=null;
                   while((s=bufr.readLine())!=null)
                   {
           if(s.equals("over"))//设置结束语句
                                     break;

                       // pw.write(s.toUpperCase()); //没有换行
                             pw.println(s.toUpperCase());//这个使用println方法更为常见
                             //pw.flush();
                   }
                   bufr.close();
                   pw.close();

         }
         public  static void  soc(Object  obj)
         {
             System.out.println(obj);
         }
}

——————切割线————

/*
分割文件

*/
import java.io.*;
import java.util.*;

class  Ioliou27
{
         public  static void  main(String[] args)throws  IOException
         {
        //qiege();
                    //hebing();
                     hebing2();

         }
         publicstatic  void  qiege()/*分割文件*/throws  IOException
         {
                   File   f=new  File("f:\\8.11\\8.11练习.png");//建立文件对象
                   FileInputStream     fis=new  FileInputStream(f);//关联目的文件
                   FileOutputStream    fos=null;
                   int  i=0,k=0;
                   byte[]    by=new byte[1024*10];
                   while((i=fis.read(by))!=-1)
                   {
                               k++;
                          fos=new FileOutputStream("f:\\8.11\\8.11练习"+k+".part");
                               //每一次循环k值都不同所以相应有不同的关联的碎片文件
                               fos.write(by,0,i);

                   }
                   fis.close();
                   fos.close();
         }
         public  static void  hebing()/*合并文件*/throws  IOException
         {
              ArrayList<FileInputStream>     al=new  ArrayList<FileInputStream>();
                    //这里採用的是ArrayList集合
                    for(int x=1;x<=4;x++)
                    {
                        al.add(new FileInputStream("f:\\8.11\\8.11练习"+x+".part"));
                             //把与文件相关联的流装进集合中
                    }
                   final  Iterator<FileInputStream>    it=  al.iterator();
                   //被匿名内部类訪问的局部成员要被final修饰
                   Enumeration<FileInputStream>      en=new   Enumeration<FileInputStream>()
                   {
                   public   boolean  hasMoreElements()
                   {
                       return    it.hasNext();

                   }
                   public   FileInputStream   nextElement()
                   {
                       return   it.next();
                   }

                   };
                   SequenceInputStream   sis=new SequenceInputStream(en);
                   FileOutputStream   fos=new FileOutputStream("f:\\8.11\\8.11练习合并.png");
                   int  i=0;
                   byte[]    by= new  byte[1024];
                   while((i=sis.read(by))!=-1)
                   {
                        fos.write(by,0,i);
                   }
                   sis.close();
                   fos.close();

         }
         public  static void  hebing2()/*另外一种合并方法*/throws  IOException
         {
                   Vector<FileInputStream>   v=new  Vector<FileInputStream>();
                   for(int   x=1;x<=4;x++)
                   {
                        v.add(new FileInputStream("f:\\8.11\\8.11练习"+x+".part"));

                   }
                   Enumeration<FileInputStream>    en=v.elements();
             SequenceInputStream    sis=new SequenceInputStream(en);
                   FileOutputStream   fos=new FileOutputStream("f:\\8.11\\8.11练习合并2.png");
                   int   i=0;
                   byte[]    by=new byte[1024*10];
                   while((i=sis.read(by))!=-1)
                   {
                         fos.write(by,0,i);
                   }
             sis.close();
                   fos.close();

         }
         public  static void  soc(Object  obj)
         {

               System.out.println(obj);
         }
}

——————切割线——————

/*

对象的序列化

ObjectInputStream和ObjectOutputStream的使用。

序列化就是把对象储存在硬盘上。

*/

/*

实现了Serializable接口,那么该类会用uid号标识。

uid号与成员有关。

假设类中的成员发生变化,uid就会对应的发生变化。

当然也能够自己主动指定该类的固定uid

办法是在该类中加入:

public static  final  long serializableUID=42L;

当中举一个样例说明uid的作用:

第一次编译Per类所在java文件而产生的.class文件,

然后再编译执行主函数所在的java文件,把对象存储在硬盘上。

此时java会给Per类自己主动生成uid,由Per类生成的对象则是相应

也会有同样的uid

接着增删改Per类的成员。第二次编译Per类所在的java文件

而产生的.class文件相应的uid会变化的!第二次编译执行主函数

所在的java文件须要读取对象的时候就会报出执行异常。由于。

已经储存在硬盘里面的对象的uid号是第一次的uid号,Per类所在的

java文件第二次产生的.class文件的uid号与对象的uid号不同,所以

就会出现异常。

为了解决问题,在Per类中加入

public  static final  long  serializableUID=42L;

就使得不管Per类怎么修改都仅仅有相应一个uid号。

Per类的对象uid号也是这个,Per类编译产生的.class文件uid号也是这个。

对象在硬盘上的写入和读取都相应同一个uid号。就不会发生异常了。

*/

import java.io.*;
import java.util.*;

class Ioliou28
{
         public   static  void   main(String[] args)throws  Exception
         {
      //  xieru();
            duqu() ;
         }
         public  static  void   xieru() throws  Exception
         {
                   File   f=new File("f:\\北方.txt");
                   FileOutputStream   fos=new  FileOutputStream(f);
                   ObjectOutputStream   oops=new ObjectOutputStream(fos);
                   oops.writeObject(new  Per("呼呼呼",26,"jkl"));
                   //写入对象,写入的对象所属的类必须是实现了Serializable借口
                  oops.close();
         }
         public  static  void  duqu() throws  Exception
         {
                      File f=new  File("f:\\北方.txt");
                    FileInputStream   fos=new  FileInputStream(f);
                    ObjectInputStream   oips=new  ObjectInputStream(fos);
                    Object  obj=oips.readObject();//readObject方法返回的是Object类型的对象
                    //readObject方法会抛出一个ClassNotFoundException,为了简便。抛出都是Exception
                    Per    p =(Per)obj;
                  oips.close();
                  soc(p);                        

         }
         public  static  void  soc(Object  obj)
         {
            System.out.println(obj);
         }

}
import java.io.*;
import java.util.*;
class Per   implements  Serializable
{
//public static  final  long serializableUID=42L;

   static   String   name="无名";//静态成员不能被序列化
         private   int    age;
         transient   String  country="cn";//transient修饰的成员也不能被序列化
         Per(String   name, int    age,String   country)
         {
              this.name=name;
                    this.age=age;
                    this.country=country  ;
         }
         public   String  toString()
         {
               return  name+":"+age+":"+country;
         }
}

——————切割线——————

/*

管道流:

PipedInputStream     PipedOutputStream

管道输入流和管道输出流能够连接,与多线程密切相关。

通常是一条线程负责管道输入流,一条线程负责管道输出流。

*/

class  Read()   implements   Runnable throws  IOException
{
         private   PipedInputStream   pis=null;

         Read(PipedInputStream   pis)
         {
             this.pis=pis;
         }
     public   void   run()
           {
                int i=0;
                      byte[]  by=new  byte[1024];
                      while((i=pis.read(by))!=-1)
                      {
                         //填写内容
                      }
           }
}
class  Write()  implements   Runnable throws  IOException
{
         private   PipedOutputStream    pos=null;
         Write(PipedOutputStream   pos)
         {
             this.pos=pos;
         }
     public   void   run( )
           {
                // int i=0;
                      // byte[]  by=new   byte[1024];
                            pos.write("huhuhu".getBytes());
           }
}
import  java.io.*;
class  Ioliou29
{
         public   static void   main(String[] args)throws  IOException
         {
                   PipedInputStream    pis=new  PipedInputStream();
                   PipedOutputStream    pos=new  PipedOutputStream();
                   pis.connect(pos);//管道输入流和管道输出流连接
                   Read    r=new Read(pis);
                   Write    w=new Write(pos);
                   Thread    t1=new  Thread(r);
                   Thread    t2=new  Thread(w);
                    t1.start();
                    t2.start();
         }
         public   static  void   soc(Object   obj)
         {
             System.out.println(obj);
         }
}

——————切割线——————

/*

RandomAccessFile类是IO包的成员

随机訪问,这个类应用的非常广。

里面封装了字节写入流和字节读取流,

所以具备了读写的功能,

可是仅仅是针对文件才干够进行操作,不能对路径进行操作。

操作文件还须要模式:

经常使用的两种模式:"r"仅仅读。"rw"读写。

该类里面还封装了很大的数组。另一个指针指示数组。

通过getFilePointer方法获得指针位置。

通过seek方法指定指针位置

*/

import java.io.*;
class  Ioliou30
{
         publicstatic void main(String[] args) throws IOException
         {
          write();
          read();     

         }
         public  static void  write()throws  IOException
         {
                   File    f=new  File("f:\\学习.txt");
                   RandomAccessFile    raf=new RandomAccessFile(f,"rw");//关联文件并确定操作模式
                   //假设文件不存在会自己主动创建
                   raf.write("一二三".getBytes());
                   raf.writeInt(56);//写入数字时最好用writeInt,以32位形式写入
                   raf.write("四五六".getBytes());
                   raf.writeInt(85);//写入数字时最好用writeInt,以32位形式写入

         }
         public  static void  read()throws  IOException
         {
                   File   f=new   File("f:\\学习.txt");
                   RandomAccessFile    raf=new RandomAccessFile(f,"rw");//关联文件并确定操作模式
                   soc("raf.getFilePointer()="+raf.getFilePointer());//getFilePointer方法返回内部数组指针位置

                   //raf.seek(2);//调整内部数组的指针指向第2位
                   byte[]   by=new byte[4];
                   raf.read(by);//依照字节数组读取
                   String   s=new  String(by);//依照字节数组转成字符串
                   int  i=  raf.readInt();//依照32位读取数据

                   soc(s);
                   soc(i);

         }
         public  static void  soc(Object  obj)
         {
             System.out.println(obj);
         }
}
 
时间: 2024-08-24 22:22:46

黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile的相关文章

IO包中的其他类 打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组

打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组 一.打印流: 该流提供了打印方法,可以将各种数据类型的数据都原样打印. 字节打印流PrintStream构造函数可以接收的参数类型1.File对象 File2.字符串路径 String3.字节输出流 OutputStream 字符打印流PrintWriter(更常用)1.File对象 File2.字符串路径 String3.字节输出流 OutputStream4.字符输出流 Writer publ

黑马程序猿——26,基本数据操作流,字节数组操作流,转换流,编码表

-----------android培训.java培训.java学习型技术博客.期待与您交流! ------------ 黑马程序猿--26, DataInputStream,DataOutputStream, ByteArrayInputStream,ByteArrayOutputStream, InputStreamReader,OutputStreamWriter,编码表 /* DataInputStream和DataOutputStream 能够更加操作基本数据类型的流 注意这里是Dat

飞鸽传书官方站点 创立黑马程序猿训练营

张孝祥于2001年创办锐信科技有限公司,2005年创办传智播客科技有限公司,飞鸽传书官方站点 创立黑马程序猿训练营,一直致力于陶瓷的飞鸽传书软件开发教育事业,张孝祥老师善于解剖和分析问题,善于使用生动形象的比喻,能将复杂的.难于理解的问题与知识简单化解说,其人生格言是为千万人少走弯路而著书.为中华软件之崛起而讲课,从锐信科技到传智播客,十几年来,张孝祥一直在践行着这一格言,亲身培养了上万名优秀的软件开发者. 这个理由也许为很多人不耻,但确实是依据自己的飞鸽传书情况来选的.要知道这么多年没踫过数学

黑马程序员——Java I/O基础知识之I/O流

I/O流基础知识--字节流和字符流 文件存储在硬盘中,是以二进制表示的,只有内存中才能形成字符.数据的来源可以有硬盘,内存,控制台,网络,Java把数据从一个地方转到另一个地方的现象称为流,用InputStream和OutputStream接口来表示,这两个流里面的都是以字节为单位的,后来加入了Reader和Writer,里面操作的是字符,是两个字节为单位的. 字节流 字节流将数据写入文件 try { File file =new File("d:" +File .separator+

黑马程序猿-面向对象-多态

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一多态的前提:(1)要有继承关系(或

黑马程序员_JavaScript变量转换和Jquery对象的转换

在实际编程过程中,有很多对字符串进行判断.拆分.比较.转换类型.校验等操作,下面我会总结下JavaScript变量转换和Jquery对象的转换. 1.JavaScript 变量转换及字符串操作 1.字符串变成int类型 使用函数:parseInt(); 使用此函数,可将string类型变量转换为int类型.而且只能够对string类型变量使用.如果待转换string类型变量无发转换为int类型时,函数会返回NaN. 实例如下: var v_Num = parseInt('256ok'); //

黑马程序员——25,打印流,合并流,对象序列化,管道流,RandomAccessFile

------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- /* IO流的打印流:专门用于打印的流 字节打印流PrintStream PrintStream的构造函数可以接收file对象,String型字符串路径,字节输出流 字符打印流PrintWriter PrintWriter的构造函数可以接收

Java API —— IO流(数据操作流 &amp; 内存操作流 &amp; 打印流 &amp; 标准输入输出流 &amp; 随机访问流 &amp; 合并流 &amp; 序列化流 &amp; Properties &amp; NIO)

1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出流写入稍后由数据输入流读取的数据. · DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. package datastreamdemos; import java.io.*; /** * Created b

一、javaSE (二十二)登录注册IO版本案例、数据操作流、内存操作流、打印流、标准输入输出流、随机访问流、合并流、序列化流、Properties、NIO

1:登录注册Io版本案例(掌握) 要求,对着写一遍 cn.itcast.pojo User cn.itcast.dao UserDao cn.itcast.dao.impl UserDaoImp1(实现我不管) cn.itcast.game GuessNumber cn.itcast.test UserTest 2:数据操作流(操作基本类型数据的流)(理解) (1)可以操作基本类型的数据 (2)流对象名称 DataInputStream DataOutputStream 3:内存操作流(理解)