Java学习IO篇

Java学习IO篇Posted on

        来吧,同志们,为复习网络编程做准备……

一.理论准备

        流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行,设备可以是文件、网络、内存等。流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序(小马哥说的是机器)为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流,可以将流想象成一个“水流管道”(很多资料都这么讲的),自然就出现了方向的概念。

        流把I/O设备内部的具体操作给隐藏起来了。所有InputStream和Reader的派生类都有一个基本的,继承下来的,能读取单个或byte数组的read( )方法。

        Java分为字节流(Stream结尾)和字符流(Reader、Write结尾),再分为输入流(InputStream、Reader)和输出流(OutputStream、Write),输入输出相对于内存而言。在读字符的时候用字符流,如文本文件、XML(我想xml明明是字母字符组成的,属于ASCII文件,为何不用stream读取呢?)等。在读二进制文件时候用字节流,如RAR、EXE等不是文本以外的文件(图片)。Buffered开头的流只是加了缓冲区,为了读写提高效率。字符流不能直接输出,需要转换成字节流才能输出(这个确实是刚知道的)!

        Java 2 SDK中有三种基本类型的节点:文件(file)、内存(memory)、管道(pipe)。

下面来看郑莉教材上IO章节的那个经典图片。

        继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据,且数据的单位都是字节(byte=8bit),如图,深色的为节点流,浅色的为处理流。

          继承自Reader/Writer的流都是用于向程序中输入/输出数据,且数据的单位都是字符(2byte=16bit),如图,深色的为节点流,浅色的为处理流。

二.用法分析

        Java IO的一般使用原则(部分来自百度文库):        (1) 按数据来源(去向)分类:

       (4) 按数据格式分:

       (7) 决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):考虑最原始的数据格式是什么:是否为文本?是输入还是输出?是否需要转换流:InputStreamReader, OutputStreamWriter?数据来源(去向)是什么:文件?内存?网络?是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)是否要格式化输出:print。

三.若干实例

         还是寒假时候写的,权当复习了,折叠代码的插件找不到了,先看着吧。

         1.System.in

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/* * System.in是InputStream static final的,包含了多态,叫同步式或者阻塞式 * 读取ASCII和二进制文件(图片),而字母就是ASCII字符(个人理解)。 */public class TestSystemIn {main(String[] args) {InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(isr);//有readlineString s = null;try {s = br.readLine();while(s!=null) {if(s.equalsIgnoreCase("exit")) {break;}System.out.println(s.toUpperCase());s = br.readLine();}br.close();}catch (IOException e) {e.printStackTrace();}}}

           2.buffer

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class TestBuffer {main(String[] args) {try {//查看修改日就可以判断文件是否是新建的了BufferedWriter bw = new BufferedWriter(new FileWriter("d:/java.txt"));BufferedReader br = new BufferedReader(new FileReader("d:/java.txt"));String s = null;for(int i=1; i<100; i++) {s = String.valueOf(Math.random());bw.write(s);bw.newLine();//换行}//刷新该流的缓冲,br没有该方法bw.flush();while((s=br.readLine())!=null) {System.out.println(s);}bw.close();br.close();}catch (IOException e) {e.printStackTrace();}}}

             3.FileInputStream

import java.io.*;public class TestFileInputStream {main(String[] args) {FileInputStream in = null;try {in = new FileInputStream("e:/1.txt");}catch(FileNotFoundException e) {System.out.println("找不到文件");System.exit(-1);}//下面表示找到了文件int tag = 0;try {long num = 0;while((tag = in.read())!=-1) {//read是字节流,若是有汉字就显示不正常了,使用reader就解决了System.out.print((char)tag);num++;}in.close();System.out.println();System.out.println("共读取了" + num + "字符");}catch(IOException e1) {//read和close都会抛出IOExceptionSystem.out.println("文件读取错误");System.exit(-1);}}}记录沿途的心情。那样的生活才是我想要的。

Java学习IO篇

相关文章:

你感兴趣的文章:

标签云: