java输入输出(二)

来源:互联网 发布:方便面怎么煮好吃知乎 编辑:程序博客网 时间:2024/06/12 07:25

   6.写文本(字符)

     抽象类Writer定义了用于写字符的流。OutputStreamWriter是Writer的一个子类,它为使用一个字符集将字符转换为字节流提供了便利。而如果想要把字符写入文件,java提供了OutputStreamWriter的子类FileWriter,但是它有一个问题就是,使用FileWriter时只能用计算机的编码输出字符,所以当前字符集之外的字符无法正确的转换为字节流,FileWriter的一个更好的替代是PrintWriter。

     6.1  Writer类

      同OutputStream一样,Writer也有一下几种writer方法的重载:

      

      注意他们传入参数的变化。

    6.2   OutputStreamWriter

        通过该类可以使用指定的字符集将字符编码为字节。它的构造方法包括一个OutputStream参数,写入到该类的字符经过转换后的字节再写入OutputStream。

         下面是该类的一个示例;

       char[] chars = new char[2];

      char[0] = '\u4F60';

      char[1] = '\u597D';

      Path path= Paths.get(...);

      Charset charset = Charset.forName("GB2312");

      try(OutputStream outputstream = Files.newOutputStream(path,StandardOpenOption.CREATE);

             OutputStreamWriter writer= new OutputStreamWriter(outputstream,charset)){

            writer.write(chars);

      }catch(....){...}

      代码中传入了两个字符,使用GB2312编码就是‘你’,‘好’。

    6.3  PrintWriter

       使用PrintWriter同样可以替代OutputStreamWriter,PrintWriter同样可以传入指定编码。PrintWrite有两个构造方法,参数分别是OutputStream和Writer,有九个重载的print方法和九个println方法。将Writer作为参数传入BufferedWriter可以包装writer,提高性能和稳定性。所以声明一个PrintWriter可以使用下面的格式;

        PrintWirter pw= new PrintWriter(new BufferedWriter(writer));

      下面展示一个使用PrintWriter写字符到文件的范例:

       Path path = ...

       Charset cahrset = Charset.forName("US-ASCII");

       try(BufferedWriter bufferedWriter = Files.newBufferedWriter(path,charset,StandardOpenOPtion.CREATE)){

            PrintWriter printwriter = new PrintWriter(bufferedWriter);

            printwriter.println("PrintWriter is easy to use");

       }catch...

       使用PrintWriter写文件的好处是当打开文件是,内容都是可读的。

      7.读文本(字符)

    常使用Reader来读文本,该类的层级图如下所示;

         

         InputStreamReader同样可以使用指定的编码,将读取的字节转化为字符,由此可见很适合使用从一个OupPutStreamWriter或者PrintWriter的输出来读取。同样,每一个该类的构造方法也需要一个InputStream作为参数之一。

         承接6.2,下面是一个范例:

          try(InputStream inputstream = Files.newInputStream(path,StandardOpenOption.READ);InputStreamReader reader =new InputStreamReader(inputstream,charset)){

          char[] chars2 = new char[2];

         reader.read(chars2);

         ...//打印一下加深印象

           }catch...

          类比输出同样有一个BufferedReader,他的readLine方法可以一次读取一行文本。

          展示一个读取文本文件的范例:

          BufferedReader bufferedreader = Files.newBufferedReader(path,charset);

          String line = bufferedrader.readLine();

          while(line!=null){

                   ...//输出line;

                  line = bufferreader.readLine();

          }

          

        8. 随机访问文件

    假如需要读写第1000个字符,但考虑效率顺序访问显然不可取,就需要随机访问了。Java提供了两个解决方案,RandomAccessFile和SeekableByeChannel,前者出现比较早,有点过时了,但使用相对容易点。

        下面是一个范例:

        ByteBuffer buffer = ByteBuffer.allocate(12);//先分配12个字节的缓存

        System.out.println(buffer.posotion);//ByteBuffer是使用一个byte数组实现的

         buffer.putInt(10);//int类型4个字节长

         buffer.putLong(12345679L);//long类型8字节长

         try(SeekableByteChannel bytechannel = File.newByteChannel

(path,StandardOpenOption.CREATE,StandardOpenOption.READ,StandardOpenOption.Write)){

         //也可以使用EnumSet.of(...)声明权限

          bytechannel.write(buffer);//写入

          //读回

          ByteBuffer buffer2 = ByteBuffer.allocate(40);

          bytechannel.position(0);//修改指针位置

          bytechannel.read(buffer2);

          buffer2.rewind();

          System.out.println(buffer2.getInt()+buffer2.getLong());//int读取4字节,long都8字节

         }catch...



      

  

0 0
原创粉丝点击