作者——bobo
学习java时,关于I/O流这一块的内容学了个一知半解,一年过去了,做过一些项目后才发现,这种囫囵吞枣试的学习方式真的不可取,由于这些基础知识掌握不够牢固,项目中也难免会遇到各种磕磕绊绊,于是重新拿起当时学java的那本书再系统性的把这些基础知识再巩固一番,做一个总结,今天主要把IO流又复习了一遍,下面是我关于java输入输出流的总结,看的人别喷,因为我现在刚大二结束,还有很多需要像前辈们学习的。
什么是流?看到“流”,我们一般会想到水,对!就像是水,水在管道中流动,这就是流。水流一定会有源头和目的地,IO流也不例外,“源头”我们称它为输入流(InputStream),“目的地”我们称它为输出流(OutputStream)。程序是从指向源的输入流中读取源中的数据,通过向输出流写入数据到把数据传送到目的地。(注:我们通常用到的输入输出流都是跟文件存取有关,但程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口等)
关于对流的知识了解一定要建立在对文件操作比较熟悉的基础上的,但文件操作的知识笔者就不在此处泼墨了,所以如果你还不懂关于文件的基本操作,先去了解一下再接着读本篇文章。java的java.io包提供了大量的流类,java把InputStream抽象类的子类创建的流对象称作字节输入流,OutputStream抽象类的子类创建的对象称作字节输出流,把Reader抽象类的子类创建的流对象称作字符输入流、Writer抽象类的子类创建的对象称作字符输出流 ,当然java中还有很多种流,如随机流(RandomAccessFile),数组流(ByteArrayOutputStream),数据流(DataInputStream和DataOutputStream),带进度条的输入流(ProgressMonitorInputStream),对象流(ObjectInputStream和ObjectOutputStream)等,笔者也不再一一介绍,只介绍这些常用的,基础的流操作。
1、文件字节流
FileInputStream类创建的对象被称作文件字节输入流。FileInputStream是从InputStream中派生出来的 简单的输入流类,为了创建FileInputStream类的对象,用户可以调用它的构造方法。下面显示了两个构造方法:
FileInputStream(String name);
FileInputStream(File file);
第一个构造方法里面的参数表示文件名,使用该构造方法创建一个给定的文件名为name的FileInputStream对象。
第二个构造方法里面的参数表示一个文件对象,使用该构造方法创建一个指定文件file的FileInputStream对象。
以字节为单位读取文件:
FileinputStream继承了InputStream的read方法,read方法的格式有这么三种:
int read();
该方法顺序地读取源中的单个字节数据,返回字节值(0~255之间的一个整数),如果到达源的末尾,该方法 返回-1。
int read(byte b[]);
该方法试图从文件中读取b.length()个字节,然后将读取的字节放在b数组中。返回实际读取的字节个数,如果 到达文件末尾,返回-1
int read(byte b[] , int off , int len);
该放放试图从文件中读取len个字节,并将读取的字节存放在b数组中。off是首字节在数组中的存放位置。返回 实际读取的字节个数,如果到达文件的末尾,方法返回-1.
public class Test {
public static void main(String args[]){
int a;
byte b[] = new byte[512];
try{
File f = new File("test.txt");
FileInputStream fis = new FileInputStream(f);//文件流指向f对象
while((a = fis.read(b,0,512)) != -1){//如果没读到文件末尾则继续
String s = new String(b,0,a);
System.out.println(s);
}
fis.close();//不要忘记关闭哦
}catch(IOException e){
e.printStackTrace();//打印栈追踪
}
}
}
FileOutputStream类与FileInputStream类是相对应的类。它创建 的对象被称作文件字节输出流,文件字节输出流提供了基本的文件写入能 力。FileOutputStream类也有两个构造方法:
FileOutputStream(String name);
FileOutputStream(File file);
第一个构造方法里面的参数表示文件名,使用该构造方法创建一个给 定的文件名为name的FileOutputStream对象。
第二个构造方法里面的参数表示一个文件对象,使用该构造方法创建 一个指定文件file的FileOutputStream对象。
FileOutputStream继承了OutputStream的write方法,write方法 的格式有这么两种:
public void write(byte b[]);
该方法的功能是写b.length个字节到文件
public void write(byte b[],int off,int len);
该放放的功能是从给定字节数组中起始于偏移量off处写len个字节到文 件,参数b是存放了数据的字节数组、off是数据的起始偏移量、len是要写出 的 字节数。
FileOutStream流顺序地写文件,只要不关闭流,每次调用write方法 就顺序地向文件写入内容,直到流被关闭。(注:如果要写入的文件不存 在,该流将首先创建要写的文件,然后再向文件写入内容,如果文件已存 在,则刷新文件的内容,然后再顺序地向文件写入内容。)下面是一个实 例:
public class Test {
public static void main(String args[]){
byte b[] = "hello world!".getBytes();
try{
File f = new File("E://test.txt");
FileOutputStream fos = new FileOutputStream(f);//文件输出流指向f对象
fos.write(b);
fos.write(b, 0, b.length);
fos.close();
}catch(IOException e){
e.printStackTrace();//打印栈追踪
}
}
}
关于FileInputStream和FileOutputStream的介绍就以上这些,但可能 大 家跟我一样,用这种方式进行文件的读写往往会出现乱码现象,那是因为字 节输入输出流使用字节数组读写数据,即以字节为基本单位处理数据。因 此,字节流不能很好地操作Unicode字符,比如一个汉字在文件中占用两个 字节,如果使用字节流,就会因为读取不当出现“乱码”现象。不过sun早就 为我们考虑到了这一点,为了方便开发者,java还提供了文件字符流。与 FileInputStream和FileOutputStream字节流相对应的是FileReader、 FileWriter字符流,FileReader和FileWriter分别是Reader和Wirter的子 类,其构造方法分别是:
FileReader(String filename);FileReader(File file);
FileWriter(String filename);FileWriter(File file);
FileReader中主要有这几个方法int read();int read(char c[]);int read(char c[] , int off , int len);
FileWriter中主要有这几个方法void write(char c[]);void write(char c[] , int off , int length); void write(int n);
注意这几个方法的格式跟刚才字节流的那几个方法几乎雷同,所以用法也基本一致,只是有点不同的是write中多了一个wirte(int n)这个方法, 该方法是向文件写入一个字符,n表示字符的ASCII值。
可大家还会发现一个问题,用这些方法写入文件时,都是将文件本来的内容清空后重写的,但很多时候我们想要在原有的基础上追加一段内容,这个时候不妨试试FileWriter的构造方法FileWriter(File file , boolean flag);第二个参数就表示要不要在原有的基础上追加。
接下来再介绍种特殊的流——缓冲流(BufferedReader/
BufferedWriter)。BufferedReader和BufferedWriter类创建的对象称作
缓冲输入、输出流,二者增强了读写文件的能力。比如有时候我们想要按行 读取文件的内容,这个时候用缓冲流就会大大方便 了。BufferedReader和BufferedWriter二者的源和目的地必须是字符输
入流和字符输出流。所以如果把字符输入流作为BufferedReader流的源,把字符输出流作为BufferedWriter的目的地,
那么BufferedReader类和BufferedWriter类创建的流将比字符输入输出
流有更强的读写能力,例如BufferedReader流
就可以按行读取文件。
BufferedReader类和BufferedWriter类的构造方法分别为:
BufferedReader(Reader in);
BufferedWriter(Writer out);
用BufferedReader的readLine()方法可以读取一行的。关于缓冲流的使用还有很多,请大家参阅API文档
好了,第一次写博客,竟然写了一下午,希望能对java初学者有帮助!
分享到:
相关推荐
流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输 ...Java IO流对象 1.输入字节流InputStreamIO 中输入字节流的继承图可见上图,可以看出:
java数据流总结,java io流总结,节点流和处理流 java数据流总结,java io流总结,节点流和处理流 java数据流总结,java io流总结,节点流和处理流
Java io流的总结
JAVA_IO流学习总结
有关Java输入输出流的总结有关Java输入输出流的总结有关Java输入输出流的总结
Java IO流总结 Java IO流是Java语言中最基本和最重要的输入/输出机制,负责将数据从外部世界输入到Java应用程序中或将数据从Java应用程序输出到外部世界。IO流可以分为两大类:字节流和字符流。 1. 节点流:离数据...
java I/O流的总结 1.操作数据单位:字节流、字符流 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,...),使用字节流处理 2.数据的流向:输入流、输出流 ...
总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...
### Java IO流详解 #### 一、概述 Java的I/O操作主要涉及使用Java语言进行输入和输出操作。Java的所有I/O机制都是基于数据流来进行输入输出,这些数据流表示了字符或字节数据的流动序列。理解Java的I/O模型对于...
下面是对Java IO流的详细总结: 1. 流的概念: 流是一种抽象的数据传输方式,可以将数据从一个地方传输到另一个地方。Java中的流分为输入流和输出流,分别用于读取和写入数据。流按照处理数据的不同类型,又可以...
### Java 数据流编程详解 #### 一、引言 在Java编程中,数据流是处理文件输入输出的基础技术之一。本文将重点介绍几种常见的数据流操作方式:单字节流复制、字节数组流复制以及缓冲流复制,并通过具体的代码示例来...
java的IO流总结:包含Inputstream,OutputStream,writer和reader
Java的I/O库提供了丰富的类和方法用于文件操作、流处理和网络通信。Socket编程是Java进行网络通信的主要方式,支持TCP/IP协议。 六、多线程 Java内置了对多线程的支持,通过Thread类和Runnable接口可以创建并管理多...
### Java流详细介绍 在Java编程语言中,流(Stream)是一种用于处理输入输出(I/O)操作的基础概念。Java中的流主要分为两大类:字节流(如InputStream和OutputStream)和字符流(如Reader和Writer)。这两种类型的...
这是别人总结的很有实用价值的javaIO流教程。
9. **IO流**:Java的IO流处理能力强大,包括字符流和字节流,支持读写文件、网络通信等操作。 10. **多线程**:Java支持多线程编程,通过`Thread`类或者实现`Runnable`接口创建线程。同步机制(如`synchronized`...
Java IO流是Java平台中处理输入输出操作的核心组件,它允许程序与各种数据源(如文件、设备、网络连接)进行交互。IO流系统由多个类和接口组成,它们位于java.io包中,为开发者提供了读写数据的丰富功能。在Java中,...
在这个大总结中,我们将深入探讨Java IO流的基本概念、分类、常用类以及实践应用。 1. **基本概念** - **流(Stream)**:在Java中,流是一个抽象的概念,代表数据的有序序列。它可以是字节流或字符流,流向可以是...
在本文中,我们将深入探讨Java流和文件处理的一些关键知识点。 首先,流是Java中的一个抽象概念,它代表了数据的有序传输。流可以是字节流(处理原始字节数据)或字符流(处理Unicode字符)。Java提供了许多类来...