`
wjm901215
  • 浏览: 154121 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用java的输入/输出类

    博客分类:
  • java
阅读更多

 

1. 什么是IO

 

 I:input 输入 通常做读取操作(将不同数据源的数据读入到内存中,也叫读取流)

 O:output 输出通常做写入操作(将内存中的数据写入到不同的数据源,也叫写入流)

 

 

2. 理解流的概念。

想像一下自来水公司要把水输到用户家里,应该先把自来水公司到用户家里的连接水管建好,再将水输出去。管道里输送的是水,但IO里输送的是字节。

 

u流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接.

u类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中动一样

 

我们使用JAVA的IO操作,必须要使用java.io里的类,所以在使用之前先要导入这个包

 

3.了解java.io包下的整体结构层次

按层次高低划分 由低---高

3-1.字节流

              •抽象父类是 InputStream OutputStream

3-2.字符流

              抽象父类是 Reader Writer

3-3.对象流

流的命名很有规律,一般是数据源加上流的名字,如:文件读取流就是FileInputStream,对象流就是ObjectInputStream

 

需要注意的是字节流和字符流的区别

3-4..字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串(比如对图片文件的操作就只能用字节流)

3-5.一个字符可以是1个字节,也可以是2个或多个字节  一个字节就是8个位,也就是对同一数据源的操作用字符流可能效率更高

3-6.字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以(使用用字节流来传输字符文件会产生乱码)

 

注意,不管是哪一种流,在数据传输的底层,还是以字节方式传输。

 

 

 

4、操作流的步骤:

1、   建立流

2、   执行操作

3、   关闭流

 

5.掌握常用的输入流读取操作方法

–     int read()   //读取一个字节,返回字节的ASC

–    
int read(char cbuf[])  //
读取字节进入chuf字符数组,返回读取的字节数

–    
int read(char cbuf[], int offset, int length) //
读取字节进入chuf字符数组,返回读取的字节数,offset为数据起始位置,length读入字节长度

–      

–     int available( );//获得读入流的字节长度

–      

–     close( );//关闭流

 

对于读入流,在建立流的时候,要求数据源必须存在。如建一个文件流:

FileInputStream fin = new FileInputStream("c:/2.mp3");

这时候,如果c盘下的2.mp3不存在的话会抛出一个FileNotFoundException异常。表示文件未找到。

 

 

6.掌握常用的输出流写入操作方法

–     void write(int b)//写入一个字节进输出流。注意int  b是这个字节的ASC码。

–      void close()//关闭流

–      void flush()//刷新流。

        对于写入流,在建立流的时候,如果数据源不存在,系统会自动创建。如建立一个写入流。

             FileOutputStream fout = new FileOutputStream("c:/2.mp3");

             这时候,如果文件c:/2.mp3不存在的话,系统会自动创建一个2.mp3的文件,而不会抛出异常。

 

             在操作写入流时要注意:写入流里的数据必须经过flush刷新或关闭流之后,数据才能写入目标数据源。如果不关闭或刷新流,则可能写不进数据源。如建立了一个文件写入流,如果在写入时不关闭或刷新流,则文件里的内容可能是空的。

 

            

 

7、流的操作

             需求:将一个文件复制到另一个文件

            

 

 

 

 

 

代码示例:

       public class IOTest {

    public static void main(String[] args) {

      

       FileInputStream fin=null;//申明一个读入流对象

       FileOutputStream fout=null; //申明一个写入流对象

       //注意申明时必须这样写,这是因为在建立流时要抛出一个FileNotFoundException异常,这是编译期异常,必须捕获。如果在try块里申明流对象,那么最后在关闭流时就访问不到了。

 

       try {

    //建立读入流,要求c:/2.mp3必须存在,如果不存在,会抛出文件找不到的异常

           fin = new FileInputStream("c:/2.mp3");

    //建立写入流,如果c:/2.mp3不存在,那么系统会自动创建,不会抛出异常

           fout=new FileOutputStream("c:/3t3t.mp3");

       } catch (FileNotFoundException e) {//捕捉文件找不到异常,这是编译期异常

           e.printStackTrace();

       }

      

      

       try {

      

//         byte[] info=new byte[fin.available()];//建立和读入流一样大小的字节数组

//         fin.read(info);//读入流读取文件所有的字节进字节数组。

//         fout.write(info);//将字节数组里的数据放入写入流

          

          

      

//         int x=0;

//         while((x=fin.read())!=-1){//利用读入流读取字节,返回的x为字节的ASC码,当x为-1时,文件读取完毕

//            fout.write(x);//将这个字节写入输出流

//         }

          

 

 

 

      

          

          

           byte[] info=new byte[512];//创建一个大小为512的字节数组

          

           int x=0;

 

           while((x=fin.read(info))!=-1){//将字节读入到数组中,返回的x表示读入了多少个字节,当x是-1的时候,文件读取完毕

              fout.write(info); //将字节数组里的数据放入写入流

           }

          

       } catch (IOException e) {//文件操作会抛出IO异常,这是编译期异常,必须捕捉

           e.printStackTrace();

       }

       finally{

           try {

              fin.close();//关闭读入流

              fout.close();//关闭写入流,如果不关闭,则文件可能是空的。

           } catch (IOException e) {

              e.printStackTrace();

           }

          

       }

    }

}

 

 

 

8、File

u提供定位本地文件系统、描述文件和目录的功能

 

掌据常见的文件操作方法

//文件处理

String getName( ); //获得当前文件对象的文件名,不包括路径

String getParent(); //获得当前文件对象的路径,不包括文件名

String getAbsolutePath();//获得当前文件对象的绝对路径,包括文件名和路径

String renameTo(File newName);//将当前文件重命名,利用这个方法可以实现文件的移动

 

 

//文件属性测试

              boolean exists( ); //判断当前文件对象对应的文件是否存在

boolean isFile( ); //判断当前文件对象是否是文件

boolean isDirectory( );//判断当前文件对象是否是目录

 

 

//文件信息 目录操作

              long lastModified( );//返回文件最后修改时间

       long length( ); //返回文件长度,即文件有多少个字节

       boolean delete( );//删除当前文件对象对应的文件

             boolean mkdir( ); //创建当前文件对象对应的目录

       String[ ] list( );//返回当前文件对象对应目录所有的文件对应的信息

       File[]  listFiles();//返回当前文件对象对应目录所有的文件对应的文件对象

 

 

 

9、字符流

              我们很多时候操作的对象都是字符和字符串,字符流可以让我们更有效的访问我们所需的字符和字符串,而不用再将字节转化成我们想要的字符串,从而简化我们的操作。

             

              字符流抽象父类是Reader和writer。记的时候注意规律性,

              对于字符流,我们需要掌握最常用的BufferedReader和BufferedWriter

 

字符读入流代码示例:

FileReader read=null;//申明文件字符读入流对象

       BufferedReader br=null;//申明缓冲字符读流对象

       try {

           read=new FileReader("c:/e.txt");//创建文件字符读入流对象

          

           br=new BufferedReader(read);//创建缓冲字符读流对象

          

           String temp=null;//申明字符串临时变量

          

           //循环行读取文件字符串,当临时字符串变量为null时,读取结束

           while((temp=br.readLine())!=null){

              System.out.println(temp);

           }

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

 

 

 

字符写入流代码示例:

     //申明字符输出流对象,这个对象介于字符流和字节流之间

       OutputStreamWriter fout=null;

       BufferedWriter bw=null;//申明缓冲字符输出流对象

       try {

          

           fout = new OutputStreamWriter(

                  new FileOutputStream("c:/e.txt",true));

          

           //创建缓冲字符输出流对象

           bw=new BufferedWriter(fout);

 

           bw.write("abc");//向流写入字符

           bw.newLine();//换一新行

           bw.write("23");

       } catch (IOException e) {

           e.printStackTrace();

       }finally{

           try {

              bw.close();

              fout.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

       }

 

 

10、对象流

 

   对象序列化:

u所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象

 

    想象一下电脑城买电脑桌,为了方便运输,事先将电脑桌拆成木块,到家里时再进行组装,这时候需要一张图低,告诉我们怎样把木块组装成桌子。

       不管是哪一种流,在传输时都是以字节方式进行传输,对象流也不例外,先将对象变成字节以方便传输,到达目地的的时候再还原成对象。这样的话,对象序列化极为重要,利用它可以实现我们把字节以一定的方式重新还原成对象。对于远程对象传输和对象的文件操作都必须将对象序列化。

 

       如何实现序列化:

       u所有需要实现对象序列化的对象必须首先实现Serializable接口

 

 

       代码示例:

       public class Logon implements Serializable

 

       在对象序列时,属性的修饰符可以为transient,它表示在对象进行传输时,该属性不做传输

 

 

       对象流代码示例:

 

 

class Test implements Serializable {

 

    transient int age;//transient表示在对象传输时,该属性不被传输

 

    String name;

 

    String sex;

 

    Test(int age, String name, String sex) {

       this.age = age;

       this.name = name;

       this.sex = sex;

    }

}

 

//对象流操作示例:

       Test test = new Test(2, "3333", "男");// 创建Test对象

 

       ObjectOutputStream objOut = null;// 申明对象写入流对象

       ObjectInputStream objIn = null;// 申明对象读取流对象

       try {

objOut = new ObjectOutputStream(new FileOutputStream("c:/obj.txt"));// 创建对象写入流对象

           objOut.writeObject(test);// 将对象写入文件

          

       }catch(IOException e){

           e.printStackTrace();

       }

       finally{

           try{

              objOut.close();

           }catch(IOException e){

              e.printStackTrace();

           }

       }

       try{

           objIn = new ObjectInputStream(new FileInputStream("c:/obj.txt"));// 创建对象读取流对象

 

           Object obj = null;// 申明对象

 

           try {

              obj = objIn.readObject();// 从对象读取流对象中获得对象

           } catch (ClassNotFoundException e) {

              // TODO 自动生成 catch 块

              e.printStackTrace();

           }

           Test temp = (Test) obj;// 将对象强转为Test类型

          

           System.out.println(temp.age);

           // 输出姓名,打印"3333"

           System.out.println(temp.name);

           // 输出性别,打印"男"

           System.out.println(temp.sex);

 

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       } finally {// 关闭流

           try {

              objIn.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

       }

    }

 

}

分享到:
评论

相关推荐

    Java 输入/输出

    使用Java 实现 编程 输入/输出

    实验9 Java输入输出流.doc

    Java输入输出流是Java编程中一个非常重要的概念,主要用于数据的读取和写入操作,包括文本文件和二进制文件。在实验9中,主要目的是理解和掌握I/O流的分类,以及如何进行文本和二进制文件的读写。 I/O流在Java中被...

    Java程序使用字符界面与系统输入/输出界面进行数据通信

    Java程序设计中,与系统输入/输出界面进行数据通信是通过输入输出流(I/O流)实现的。I/O流是Java的核心特性之一,允许程序读取数据源(如键盘、文件)并写入数据目标(如显示器、文件)。在Java 2中,这个过程尤其...

    Java输入输出 Java输入输出

    java java输入输出 java输入流 java输出流 java java输入输出 java输入流 java输出流 java java输入输出 java输入流 java输出流

    java I/O类的使用

    Java I/O类库是Java平台的核心部分,它提供了丰富的类用于处理...开发者可以根据具体需求选择合适的类和装饰器,构建出满足特定场景的输入输出系统。理解并熟练运用这些类和模式对于任何Java开发者来说都是至关重要的。

    Java输入/输出流体系详解

    Java的输入输出流体系可以分为两大类:输入流和输出流。输入流用于读取数据,而输出流用于写入数据。 输入流的基类是InputStream,它提供了基本的读取操作。输出流的基类是OutputStream,它提供了基本的写入操作。 ...

    JAVA范例 七)输入/输出流---字符流

    在Java编程语言中,输入/输出流(Input/Output Stream,简称I/O流)是处理数据传输的基础。本文将深入探讨字符流的概念,包括它的作用、类型以及如何在实际编程中应用。首先,我们理解一下标题中的“字符流”:在...

    JAVA实验报告三java输入输出.docx

    实验报告三:Java输入输出 本实验主要涵盖了Java中输入输出的基本操作,旨在让学生深入理解数据流的概念,熟悉Java流的层次结构,并掌握文件的读写操作。实验内容包括从键盘接收用户输入并在屏幕上显示,读取并显示...

    java基础- IO(输入/输出)的使用

    Java中的IO(输入/输出)是一种用于与外部资源(如文件、网络连接、数据库等)进行数据交互的机制。在Java中,主要使用java.io包提供的类和接口来进行IO操作。

    JAVA输入输出流实验报告

    在Java中,输入输出流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。本次实验主要探讨了这两类流的使用,并通过实例代码展示了如何进行基本的输入输出操作。 首先,字节流主要用于处理二进制...

    Java输入与输出(I、O).

    Java输入与输出(I/O)是Java编程语言中不可或缺的一部分,它允许程序与外部资源进行数据交换,如文件系统、网络、硬件设备等。在Java中,I/O操作被封装在许多类和接口中,形成了丰富的API。以下将详细介绍几个重要...

    Java 输入与输出流操作

    下面将详细阐述Java输入与输出流的相关知识点。 1. **流的概念**: 流是Java I/O的核心概念,它代表数据的源或目的地。流可以是向文件、内存、网络连接等地方读写数据。Java中的流分为字节流和字符流,字节流处理...

    java 输入输出流

    Java中的输入输出流是Java I/O(Input/Output)系统的核心组成部分,允许程序与外部数据源进行交互。在Java中,所有的I/O操作都基于流的概念,流是数据的序列,可以是字节流或字符流。Java I/O库提供了一系列的类来...

    java输入输出操作

    Java输入输出操作是Java编程中的基础且重要的一部分,它涵盖了数据的读取、写入以及文件和流的管理。在Java中,输入输出主要通过I/O流(Input/Output Stream)来实现,这些流用于在程序和外部资源之间传输数据。Java...

    Java学习资料-输入输出流

    Java 输入/输出流是Java程序进行数据传输的关键机制,它允许程序从源(如键盘、文件)接收数据或将数据发送到目的地(如显示器、文件)。Java中的I/O流分为四类:字节流(Byte Streams)和字符流(Character Streams...

    java i/o包流式输入输出和文件操作

    Java I/O 包是Java平台的核心部分,它提供了丰富的类和接口用于处理输入输出操作,包括文件操作和流式输入输出。在这个主题中,我们将深入探讨如何使用Java进行文件管理和流处理。 首先,我们来看看`java.io`包中的...

    Java的输入与输出.ppt )

    流是在输入输出之间流动的数据缓冲区,传送是串行的。 流一般分为输入流(Input Stream)和输出流(Output Stream)两类。流和物理文件是有区别的,流是一个动态的概念。比如一个文件,当向其中写数据时,它就是一个...

    java代码输入 输出

    - 在Java中,标准输入输出是通过`java.lang.System`类实现的,其中`System.in`用于获取标准输入,而`System.out`用于输出数据。 - `System.in`是一个`InputStream`对象,可以用来读取用户从键盘输入的数据。 #### ...

    java输入输出代码

    学习Java输入输出,需要理解流的概念,熟悉各类流的使用,并结合实际场景选择合适的流类型。同时,掌握文件操作、对象序列化、NIO等相关知识,能让你在处理数据交换时更加得心应手。在实践中不断尝试和调试,你会...

Global site tag (gtag.js) - Google Analytics