JAVA I/O使用方法(转)

下面四张图表明了类之间的继承关系,其中红色、加粗的类名是常用的类。

常用转换

 FileReader——>BufferedReader

BufferedReader in= new BufferedReader(new FileReader("Text.java"));

InputStream——>InputStreamReader——>BufferedReader

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

String——>byte[]——>ByteArrayInputStream——>DataInputStream

DataInputStream in= new DataInputStream(new ByteArrayInputStream(str.getBytes()));

FileInputStream——>BufferedInputStream——>DataInputStream

DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream("Data.txt")));

FileWriter——>BufferedWriter——>PrintWriter

PrintWriter pw=new PrintWriter(new BufferedWriter("text.out"));

System.out(PrintStream)——>PrintWriter

PrintWriter pw=new PrintWriter(System.out,true);

FileOutputStream——>BufferedOutputStream——>PrintStream

PrintStream ps= new PrintStream(new BufferedOutputStream(new FileOutputStream("text.out")));

FileOutputStream——>BufferedOutputStream——>DataOutputStream

DataOutputStream dos= new DataOutputStream(new BufferedOutputStream(new FileOutputStream("Data.txt")));

 

程序举例

import java.io.*;

public class IOStreamDemo {

    public static void main(String[] args) throws IOException {

    /* 1.要想打开文件读取字符,你得先用String或File对象创建一个FileReader。
    为了提高速度,你应该对这个文件作缓冲,因此你得把FileReader的reference 交给BufferedReader。
    BufferedReader提供了readLine()方法,当你读到文件的末尾时readLine()会返回一个null,于是就退出while()循环了。
    String sb是用来累加文件内容的,(再加一个换行符“\n”因为readLine()会把它们都剥掉).
    最后用close()来清空缓冲区。*/
        String s = "test";
        StringBuilder source = new StringBuilder();
        source.append(s);
        source.append(System.getProperty("line.separator"));

     /*  2. 用System.in生成一个能读取控制台输入的流。System.in是一个InputStream,
    而BufferedReader需要一个Reader作参数,所以要先通过InputStreamReader来转转手。
    Java遵循标准I/O的模型,提供了Syetem.in,System.out,以及System.err。
    System.out是一个已经预先处理过的,被包装成PrintStream的对象。
    System.err也是一个PrintStream;
    System.in是一个未经处理的InputStream。
    也就是说,虽然你可以直接往System.out和System.err上写,但是要想读System.in的话,就必须先做处理了。*/
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter a line:");
        System.out.println(reader.readLine());

     /* 3. 用String s2作参数创建一个StringReader。然后用StringReader的read()方法把字符读出来,再送到控制台上去。
    read()会把读出来的byte当作int,所以要想正常打印的话,你得先把它们转成char。*/
        StringReader stringReader = new StringReader(source.toString());
        int c;
        while ((c = stringReader.read()) != -1)
            System.out.print((char) c);

     /*
     4. 要想读取"格式化"的数据,你就得用DataInputStream了,DataInputStream是一个面向byte的I/O类,不是面向char的。
      因此你只能从头到底一直用InputStream了。
      当然你可以把所有的东西都当成byte。
      然后用InputStream读出来。
      但这里是String。要想把String当成byte数组。可以用String的getBytes()方法。而ByteArrayInputStream是可以处理byte数组的。
     */

        System.out.println("===============ByteArrayInputStream begin===============");
        DataInputStream byteArrayInputStream = new DataInputStream(
                new ByteArrayInputStream(source.toString().getBytes()));
        byte[] bytes = new byte[100];
        while ((byteArrayInputStream.read(bytes)) != -1) {
            System.out.print(new String(bytes));
        }
        System.out.println(System.getProperty("line.separator"));
        System.out.println("===============ByteArrayInputStream end===============");

       /* 5.向文件中写数据。先创建一个FileWriter,BufferedWriter是免不掉的。
      然后再让PrintWriter去排版。这样就能得出能够读得懂的,普通的文本文件了。
      输入流用完之后,readLine()会返回null。
      最后调用close()方法清空缓冲区。*/

        BufferedReader bufferedReader = new BufferedReader(new StringReader(source.toString()));
        PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
        int lineCount = 1;
        while ((s = bufferedReader.readLine()) != null)
            printWriter.println(lineCount++ + ": " + s);
        printWriter.close();

        DataOutputStream dataOutputStream = new DataOutputStream(
                new BufferedOutputStream(new FileOutputStream("Data.txt")));

    /*6. 存储和恢复数据
     PrintWriter会对数据进行格式化,这样人就能读懂了。
     但是如果数据输出之后,还要恢复出来供其它流用,那你就必须用DataOutputStream来写数据,再用DataInputStream来读数据了。
     当然,它们可以是任何流,不过我们这里用的是一个经缓冲的文件。
     DataOutputStream和DataInputStream是面向byte的,因此这些流必须都是InputStream和OutputStream。
     如果数据是用DataOutputStream写的,那么不管在哪个平台上,DataInputStream都能准确地把它还原出来。
     这一点真是太有用了,因为没人知道谁在为平台专属的数据操心。如果你在两个平台上都用Java,那这个问题就根本不存在了。
     用DataOutputStream写String的时候,要想确保将来能用DataInputStream恢复出来,唯一的办法就是使用UTF-8编码。
     UTF-8是Unicode的一种变形。Unicode用两个字节来表示一个字符。
     但是,如果你处理的全部,或主要是ASCII字符(只有7位),那么无论从存储空间还是从带宽上看,就都显得太浪费了,
     所以UTF-8 用一个字节表示ASCII字符,用两或三个字节表示非ASCII的字符。
     此外,字符串的长度信息存在(字符串)的头两个字节里。writeUTF( )和readUTF( )用的是Java自己的UTF-8版本(JDK文档里有关于这个字符集的完整讲解,
     就在这两个方法的文档里),
     所以如果你要用一个Java程序读取writeUTF( )写的字符串的话,就必须进行一些特殊处理了。
     有了writeUTF( )和readUTF( ),你就能放心地把String和其它数据混在一起交给DataOutputStream了,
     因为你知道String是以Unicode的形式存储的,而且可以很方便地用DataOutputStream恢复出来。
     writeDouble( )会往流里写double,而它"影子"readDouble( )则负责把它恢复出来(其它数据也有类似的读写方法)。
     但是要想让读取方法能正常工作,你就必须知道流的各个位置上都放了些什么数据。因为你完全可以把double读成byte,char,或其它什么东西。
     所以要么以固定的格式写文件,要么在文件里提供额外的解释信息,然后一边读数据一边找数据。先提一下,对于复杂数据的存储和恢复,对象的序列化可能会比较简单。*/
        dataOutputStream.writeDouble(3.14159);
        dataOutputStream.writeUTF("That was pi");
        dataOutputStream.writeDouble(1.41413);
        dataOutputStream.writeUTF("Square root of 2");
        dataOutputStream.close();
        DataInputStream dataInputStream = new DataInputStream(
                new BufferedInputStream(new FileInputStream("Data.txt")));
        System.out.println(dataInputStream.readDouble());
        System.out.println(dataInputStream.readUTF());
        System.out.println(dataInputStream.readDouble());
        System.out.println(dataInputStream.readUTF());

    }
}

 

http://blog.sina.com.cn/s/blog_4cc16fc50100bvyb.html

InputStream/OutputStream: 
1)抽象类,2)面向字节形式的I/O操作(8 位字节流) 。 
Reader/Writer: 
1)抽象类,2)面向字符的 I/O操作(16 位的Unicode字符) 。 
InputStreamReader: 
可以将InputStream转换为 Reader。 
OutputStreamWriter: 
可以将OutputStream转换为Writer。 

Java I/O的核心采用了Decorator(装饰)模式。 

 

 

http://wentao365.iteye.com/blog/1183951

 

时间: 2024-08-31 10:16:14

JAVA I/O使用方法(转)的相关文章

java中关于dismiss方法的使用

问题描述 java中关于dismiss方法的使用 myDialog.dismiss( )比如这条语句中是关闭一个对话框的意思吗dismiss还有哪些方面的应用 解决方案 看下这个函数的源码上面的注释信息,jdk源码上的英文注释就是很好的参考文档的. 解决方案二: 这和java语言没有关系,这只是dialog对象定义的方法罢了.你也可以写一个类,定义一个叫dismiss的方法. 在英文字面看来,dismiss就是消失的意思. 解决方案三: java中waitnotifynotifyAll的使用方法

java-关于Java的默认运行方法的机制问题。

问题描述 关于Java的默认运行方法的机制问题. timer.schedule(new MyTask()01000);这一句代码中,new了一个MyTask()的类,怎么就自动调用了里面的run()函数?新手勿喷. 解决方案 timer在到了那个指定时刻,它会反过来调用run,这是约定好的. 解决方案二: 这是类似于回调的机制吗?

java中this作为方法名的时候的问题,不知道我把它看成方法名正步正确

问题描述 java中this作为方法名的时候的问题,不知道我把它看成方法名正步正确 如下代码所示, public MyView(Context context) { this(context null); } //this在这里是方法吗,this是一个方法名吗? 解决方案 this用来调用你这个类中定义的一个构造方法 解决方案二: this不是方法名,而是Java中对当前对象的引用.例如当前对象的引用用this,父类对象的引用用super 解决方案三: 一个类中定义两个构造函数,在一个构造函数中

java的抽象类和方法

在我们所有乐器(Instrument)例子中,基础类Instrument内的方法都肯定是"伪"方法.若去调用这些方法,就会出现错误.那是由于Instrument的意图是为从它衍生出去的所有类都创建一个通用接口. 之所以要建立这个通用接口,唯一的原因就是它能为不同的子类型作出不同的表示.它为我们建立了一种基本形式,使我们能定义在所有衍生类里"通用"的一些东西.为阐述这个观念,另一个方法是把Instrument称为"抽象基础类"(简称"抽象

Java 库的建立方法及其实例

作者 ariesram 电子邮件地址 ariesram@linuxaid.com.cn, 或 ariesram@may10.ca 本文及本人所有文章均收集在bambi.may10.ca/~ariesram/articles/中. 本文授权给www.linuxaid.com.cn. 正文: 任何一种面向对象语言都有它的库.任何一种面向对象的语言也都离不开库的支持.用我们熟悉的 面向对象语言为例子,C++有STL,Java有API函数,具体到开发工具,Visual C++提供了MFC, Borlan

创建Java ME Math.pow()方法

使用 Java 开发移动设备应用程序时,可能需要用到特定 Java VM 所没有的数学方法.本文将专门解决 Java ME 没有"幂"方法 Math.pow() 的问题.我们将演示使用三种不同的方法开发同一个 ME 应用程序,并从中选出最佳的编程解决方案. 要讨论此问题,我们先考察整数和分数幂参数,将我们的分析限于正实数.我们将演示求整数问题和小数问题的解集相对而言比较容易(而 不考虑指数的符号).在大多数情况下,我们将使用示例问题 n = 82/3,其中我们会求出 n 的良好估计或实

JAVA基础培训(10),方法的Overload介绍

今天在项目里做事,中午休息时间,补上这个教程吧.这次我们看看Overload 的内容 . 测试代码 package lession10; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * 老紫竹JAVA基础培训(10),方法的Overload介绍.<br> * 匹配方式为最特殊匹配,或者叫最准确匹配<br> * 如果发现多个都有相同的匹配度,则编译报错. * *

如何在Java中避免equals方法的隐藏陷阱

译者注 :你可能会觉得Java很简单,Object的equals实现也会非常简单,但是事实并不是你想象的这样,耐心的读完本文,你会发现你对Java了解的是如此的少.如果这篇文章是一份Java程序员的入职笔试,那么不知道有多少人会掉落到这样的陷阱中. 摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继承类作为面向对象语言中的等价关系的基础问题,要保证派生类的e

Java截取字符串的方法

  本文实例讲述了Java截取字符串的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 public static void main(String args[]) { //以该字符第一次出现,开始截取 //String str="abc.def"; //String str="abc.def.sdfsdf.fsdfd.ddddd.ggggg.ttttt"; //String str1=str.subst

java生成随机数的方法

  本文实例讲述了java生成随机数的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 package com.tool.code; import java