`
afunti
  • 浏览: 105743 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

No.10 输入输出流

阅读更多

Java中的流分为两种分别由四个抽象类来表示:
一、字节流  InputStream  OutputStream
二、字符流   Reader,Writer









在这四个抽象类中,InputStream和Reader定义了完全相同的接口:

int read()
int read(char cbuf[])
int read(char cbuf[], int offset, int length)



  而OutputStream和Writer也是如此:

int write(int c)
int write(char cbuf[])
int write(char cbuf[], int offset, int length)



  这六个方法都是最基本的,read()和write()通过方法的重载来读写一个字节,或者一个字节数组。

import java.io.*;

      public class IOStreamDemo {

            public void samples() throws IOException {

                 //1. 这是从键盘读入一行数据,返回的是一个字符串
                 BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));
                 System.out.print("Enter a line:");
                 System.out.println(stdin.readLine());

                 //2. 这是从文件中逐行读入数据

                 BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));
                 String s, s2 = new String();
                 while((s = in.readLine())!= null)
                            s2 += s + "\n";
                 in.close();

                 //3. 这是从一个字符串中逐个读入字节
                 StringReader in1 = new StringReader(s2);
                 int c;
                 while((c = in1.read()) != -1)
                            System.out.print((char)c);

                 //4. 这是将一个字符串写入文件
                 try {
                            BufferedReader in2 = new BufferedReader(new StringReader(s2));
                            PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
                            int lineCount = 1;
                            while((s = in2.readLine()) != null )
                                       out1.println(lineCount++ + ": " + s);
                            out1.close();
                 } catch(EOFException e) {
                            System.err.println("End of stream");
                 }
            }
      } 


对于上面的例子,需要说明的有以下几点:

  1. BufferedReader是Reader的一个子类,它具有缓冲的作用,避免了频繁的从物理设备中读取信息。它有以下两个构造函数:

BufferedReader(Reader in)
BufferedReader(Reader in, int sz)



  这里的sz是指定缓冲区的大小
 2. InputStreamReader是InputStream和Reader之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给             BufferedReader使用。

  3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

  这句话体现了Java输入输出系统的一个特点,为了达到某个目的,需要包装好几层。首先,输出目的地是文件IODemo.out,所以最内层包装的是FileWriter,建立一个输出文件流,接下来,我们希望这个流是缓冲的,所以用BufferedWriter来包装它以达到目的,最后,我们需要格式化输出结果,于是将PrintWriter包在最外层。

  Java提供了这样一个功能,将标准的输入输出流转向,也就是说,我们可以将某个其他的流设为标准输入或输出流,看下面这个例子:

引用
import java.io.*;

public class Redirecting {

       public static void main(String[] args) throws IOException {
              PrintStream console = System.out;
              BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java"));
              PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out")));
              System.setIn(in);
              System.setOut(out);

              BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
              String s;
              while((s = br.readLine()) != null)
                     System.out.println(s);
              out.close();
              System.setOut(console);
      }
}



  在这里java.lang.System的静态方法

static void setIn(InputStream in)
static void setOut(PrintStream out)



  提供了重新定义标准输入输出流的方法,这样做是很方便的,比如一个程序的结果有很多,有时候甚至要翻页显示,这样不便于观看结果,这是你就可以将标准输出流定义为一个文件流,程序运行完之后打开相应的文件观看结果,就直观了许多。

  Java流有着另一个重要的用途,那就是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。

  在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。

  所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:

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

public class Logon implements Serializable {

       private Date date = new Date();
       private String username;
       private transient String password;


       Logon(String name, String pwd) {
              username = name;
              password = pwd;
       }


       public String toString() {
              String pwd = (password == null) ? "(n/a)" : password;
              return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd;
       }


       public static void main(String[] args) throws IOException, ClassNotFoundException {
              Logon a = new Logon("Morgan", "morgan83");
              System.out.println( "logon a = " + a);
              ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));
              o.writeObject(a);
              o.close();

              int seconds = 5;
              long t = System.currentTimeMillis() + seconds * 1000;
              while(System.currentTimeMillis() < t) ;

              ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));
              System.out.println( "Recovering object at " + new Date());
              a = (Logon)in.readObject();
              System.out.println("logon a = " + a);
       }
}



  类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这就标志着它可以被序列化。之后再main方法里ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject开始写入。想要还原的时候也很简单ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法就可以了。

  需要说明一点,对象序列化有一个神奇之处就是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝






 

  • 大小: 7.8 KB
  • 大小: 6 KB
  • 大小: 6.3 KB
  • 大小: 6.4 KB
分享到:
评论

相关推荐

    C++实验:输入输出流

    内容1:标准输入输出流重定向 (1) 新建一个工程demo1,设计一个类Time,成员变量为时(h)、分(m)、秒(s)。 (2) 分别为类Time重载提取运算符(&gt;&gt;)和插入运算符(&gt;&gt;)。 a. 输入格式:14 30 15 b. 输出格式:14.5042 (3) ...

    c++输入输出流实验报告.doc

    C++输入输出流实验报告 本实验报告的主要目的是掌握C++语言中的输入输出流,了解类和对象的概念,掌握声明类和定义对象的方法,以及掌握构造函数和析构函数的实现方法。实验中,我们将使用C++语言编写一个简单的...

    No.Starch.Linux.Programming.Interface.Oct.2010

    2. **C标准库**:C语言的标准库在Linux编程中扮演着重要角色,如`stdio.h`中的输入输出函数,`stdlib.h`中的内存管理和进程控制函数,`string.h`中的字符串处理函数等。 3. **进程和线程管理**:书中会讲解如何使用...

    JAVA39NO.1.zip

    5. **IO流**:学习输入输出操作,包括文件读写、对象序列化以及网络数据传输。 6. **多线程**:了解并发编程,如何创建和管理线程,以及同步机制如synchronized关键字和Lock接口。 7. **反射API**:允许在运行时...

    2021-2022计算机二级等级考试试题及答案No.19567.docx

    5. 标准输入输出流:在编程中,System.In和System.Out是标准输入输出流,InputStream和OutputStream则是Java中的输入输出流类,但不是标准输入输出流。 6. JavaScript弹窗:在JavaScript中,使用`alert("Hello ...

    2021-2022计算机二级等级考试试题及答案No.14279.docx

    3. 标准输入输出流:在Java中,System.in代表标准输入流,System.out代表标准输出流,InputStream和OutputStream是Java的IO流类,但不是标准输入输出流的直接表示。 4. Excel2003中的#N/A错误:当单元格显示#N/A时...

    2021-2022计算机二级等级考试试题及答案No.10453.docx

    2. 标准输入输出流:在Java中,System类提供了标准输入输出流,包括System.in代表标准输入流,System.out代表标准输出流。InputStream和OutputStream是Java中的输入输出流的基类,但在这里不是标准输入输出流的实例...

    display_yesno.rar_yes

    在C语言中,创建用户界面(UI)通常是通过标准输入/输出流(如`stdin`和`stdout`)来实现的,这意味着程序可能会使用`printf`函数来显示问题,并使用`scanf`或`fgets`来获取用户的“是”或“否”响应。在处理用户...

    2021-2022计算机二级等级考试试题及答案No.15506.docx

    21. 标准输入输出流:在Java中,`System.in`和`System.out`是标准输入输出流。 22. 算法特征:算法应具有确定性、可行性、有限性和足够的信息。 23. Internet起源:最初创建用于军事通信。 24. 数据的含义:数据是...

    2021-2022计算机二级等级考试试题及答案No.3033.docx

    12. 标准输入输出流:在编程中,System.In和System.Out是标准输入输出流,InputStream和OutputStream是输入输出流接口,但不是标准流。 13. E-mail 地址格式:E-mail地址通常由用户名@域名组成,中间以@符号分隔。 ...

    2021-2022计算机二级等级考试试题及答案No.1529.docx

    22. 标准输入输出流:Java中,`System.in`和`System.out`是标准输入输出流,而`InputStream`和`OutputStream`是输入输出流的基类。 23. 表结构修改:在Access中,表结构的修改通常在表设计器中完成。 24. 文本字段...

    2021-2022计算机二级等级考试试题及答案No.16823.docx

    23. 标准输入输出流在Java中是System.in(输入)和System.out(输出)。 24. Access提供了关系运算符、逻辑运算符和特殊运算符作为查询准则。 25. 给表指定主索引属于实体完整性,确保每条记录的唯一性。 这些...

    2021-2022计算机二级等级考试试题及答案No.17075.docx

    23. 关于输入输出流的知识点未给出完整题目,但通常涉及如何读取和写入数据到文件或其他数据源。 这些题目覆盖了计算机科学的基础知识,包括编程语言、数据库管理、操作系统、网络和数据处理。了解并掌握这些知识点...

    2021-2022计算机二级等级考试试题及答案No.2663.docx

    2. 标准输入输出流:在编程中,System.In和System.Out是Java的标准输入输出流,用于读取用户输入和打印输出信息。InputStream和OutputStream是Java的I/O流类,用于处理字节流,但它们不是标准输入输出流。 3. ...

    2021-2022计算机二级等级考试试题及答案No.5267.docx

    5. 标准输入输出流:在编程中,System.in和System.out是标准输入输出流,用于程序与用户的交互。 6. 运算器功能:运算器不仅进行算术运算,也进行逻辑运算,是CPU的重要组成部分。 7. Access数据库对象:Access的...

    2021-2022计算机二级等级考试试题及答案No.18247.docx

    21. 标准输入输出流在Java中包括System.in(输入)和System.out(输出)。 22. 数据库系统由硬件环境、软件环境、数据库以及相关人员组成。 23. 高级语言程序设计涉及到编译、解释、调试等多个环节,编译器和解释...

    2021-2022计算机二级等级考试试题及答案No.523.docx

    1. **标准输入输出流**:在编程中,标准输入输出流通常指的是程序与用户交互的默认通道。`System.in`代表标准输入流,用于读取用户输入;`System.out`代表标准输出流,用于向控制台输出信息。在Java中,`InputStream...

    2021-2022计算机二级等级考试试题及答案No.11210.docx

    1. 标准输入输出流是编程语言中的基本概念,通常指的是System.in(标准输入)和System.out(标准输出),用于程序与用户的交互。 2. 外模式是数据库系统的组成部分,它是单个用户或应用程序看到的数据视图,反映了...

    2021-2022计算机二级等级考试试题及答案No.3406.docx

    9. 标准输入输出流:在Java中,System.in代表标准输入,System.out代表标准输出,InputStream和OutputStream是处理输入输出流的基类。 10. 继承的概念:继承是面向对象编程中的特性,表示一个类可以从另一个类派生...

    2021-2022计算机二级等级考试试题及答案No.2495.docx

    10. 标准输入输出流:System.In和System.Out是Java中的标准输入输出流,InputStream和OutputStream则是更基础的输入输出流类。 11. 程序调试:程序调试的主要任务是发现并改正程序中的错误。 12. ActionEvent处理...

Global site tag (gtag.js) - Google Analytics