I/O:(输入/输出)指的是计算机与外部世界,或者一个与计算机其余部分的接口。它对任何计算机系统都非常关键。

Java类库中有大量的类,帮助我们从不同的设备读取数据并保存或输出到不同的设备中。

这些类统一放在java.io包java.nio包中,统称JavaI/O系统。(I:Input输入;O:Output输出)

流(Stream):

流是java I/O的基础,java语言对I/O的一个最基本的抽象

基本特性:含有流质,有方向(流质是数据,方向就是读或写)。

对流的读或写就是针对设备进行信息的输入输出。

流按方向分:

输入流:(继承自InputStream或Reader);

输出流:(继承自OutputStream或Writer);

处理数据的最小单位分:

字节流:以byte为最小单位进行数据传送(继承自InputStream或OutputStream);

字符流:以char为最小单位进行数据传送(继承自Reader或Writer);

按功能分:

节点流:(低级流)节点流是可以直接从/向一个特定的数据源(磁盘文件、内存、网络等)读/写数据的流。

处理流:(高级流)不直接连接到设备,而是连接在已存在的流(节点流或处理流之上)通过对数据的处理为程序提供更强大的读写功能;

InputStream类层次

OutputStream类层次

Reader类层次

Writer类层次

1.创建File类对象:
File f;
f = new File("Test.java");
f = new File("E:\\ex\\","Test.java");

2.将目录也当作文件处理File类中提供了实现目录管理功能的方法:
File path = new File("E:\\ex\\");
File f = new File(path, "Test.java");

方法:
f.getName():返回文件名 temp.dat
f.getParent():返回文件所在目录名 data
f.getPath():返回文件路径 data\temp.dat
f.getAbsolutePath():返回绝对路径 …\data\temp.dat
f.exists():文件是否存在
f.canWrite(), f.canRead():文件是否可写、读
f.isFile(), f.isDirectory():是否为文件或目录
f.lastModified(), f.length(), f.delete():文件的最后修改日期、长度;删除文件
f.mkdir(), f.list():创建一个目录;列出目录下所有的文件

一些方法使用:

package com.lovo;

import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
 * File类测试
 *
 */
public class FileTest {

public static void main(String[] args) {
        // 创建File对象
        File file = new File("E:\\jg\\exercise_bak.txt");

// 能否读
        System.out.println("能否读:" + file.canRead());

// 删除
        System.out.println("删除成功:" + file.delete());

// 重新创建文件对象
        file = new File("E:\\jg\\exercise_bak.txt");

// 判断文件是否存在
        System.out.println("是否存在:" + file.exists());

// 目录或文件名称
        System.out.println("名称:" + file.getName());

// 是否目录、文件
        System.out.println("是否目录:" + file.isDirectory());
        System.out.println("是否文件:" + file.isFile());

// 最后一次修改时间
        System.out.println("最后一次修改时间:"
                + new Date(file.lastModified()));

// 文件大小
        System.out.println("文件大小:" + file.length());

// 重新创建File对象
        file = new File("E:\\jg");

System.out.println("文件目录列表:");
        // 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
        String[] list = file.list();
        for (String string : list) {
            System.out.println(string);
        }
        System.out.println("*******************************");

// 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件对象
        File[] files = file.listFiles();
        for (File item : files) {
            if (item.isDirectory()) { // 当前File对象为目录,则遍历该目录下所有子目录与文件
                System.out.println(item.getName() + " 目录下子目录与文件:");
                String[] it = item.list();
                for (String i : it) {
                    System.out.println(i);
                }
                System.out.println("*******************************");
                continue;
            }

System.out.println(item.getName() + "  文件");
        }

// 重新创建File对象
        file = new File("E:\\jg\\test\\demo\\test.txt");
        if (!file.exists()) { // 文件不存在
            // 获取文件路径
            File dir = file.getParentFile();
            if (!dir.exists()) { // 目录不存在,则创建路径中所有不存在的目录
                dir.mkdirs();
            }

try {
                // 创建空文件
                System.out.println("文件是否创建成功:" + file.createNewFile());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

}
}

package com.lovo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 字节输入输出流测试
 *
 */
public class IOTest {

public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer(); // 字符串缓冲
        
        /* 输入流 */
        InputStream in = null;

try {
            // 1. 打开输入流
            in = new FileInputStream("E:\\jg\\exercise.txt");
            // 2. 读取
//            byte[] b = new byte[128];
            byte[] b = new byte[1024 * 4];
            int len = in.read(b); // 返回读取到的字节数,返回-1表示读取到流结尾
            while(len != -1){
                buffer.append(new String(b, 0, len)); // 将读取到的字节解析为String追加到缓冲
                len = in.read(b);
            }
//            System.out.println("读到" + len + "字节的数据");
            System.out.println(buffer.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3. 释放资源,关闭输入流
            if (in != null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        /* 输出流 */
        OutputStream out = null;
        
        try {
            File file = new File("D:\\test\\demo\\test.txt");
            if (!file.getParentFile().exists()){ // 文件路径不存在,则创建路径中所有不存在的目录
                file.getParentFile().mkdirs();
            }
            // 1. 打开输出流
            out = new FileOutputStream(file);
            // 2. 写
            out.write(buffer.toString().getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3. 释放输出流资源
            if (out != null){
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

package com.lovo;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

/**
 * 字符输入输出流测试
 *
 */
public class IOTest2 {

public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer();

/* 输入流 */
        Reader reader = null;

try {
            // 1. 打开流
            reader = new FileReader("E:\\jg\\exercise.txt");
            // 2. 读取
            char[] ch = new char[128]; // 缓冲区
            int len;
            do {
                len = reader.read(ch);
                if (len == -1)
                    break;
                buffer.append(new String(ch, 0, len));
            } while (len != -1);
            System.out.println(buffer.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3. 释放资源
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

/* 输出流 */

Writer writer = null;

try {
            // 1. 打开流
            writer = new FileWriter("d:\\test.txt");
            // 2. 写入
            writer.write(buffer.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3. 释放资源
            if (writer != null) {
                try {
                    writer.flush();
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

ex:

import java.io.*;
public class FileTest{
    public static void main(String[] str){
        File f = new File("E:\\Workspace\\aaa.txt");
        //判断是否存在该文件
        if (!f.exists()){
            System.out.println("file is not exist");
            try {
                f.createNewFile();//不存在就创建新的文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        File f1 = new File("E:\\Workspace\\aaa1\\sdfsdf\\asdf");
        if (f1.mkdir()){ //创建目录
            System.out.println("yes");
        }
        else{
            System.out.println("errors ");
        }
    }
}

ex2:

import java.io.*;

//浏览当前目录下的所有文件和目录
class FileDirectory{
public static void main( String[] args ) {
try {
File f1 = new File("");
String ss = f1.getAbsolutePath();
System.out.println("ss= " + ss);
File f = new File(ss); if( f.isDirectory() ) {
//获取目录下所有的文件列表
File[] files = f.listFiles();
for( int i=0; i<files.length; i++ ) {
if( files[ i ].isDirectory() ) {
System.out.println( "<dir> " + files[ i ].getName() );
}
else {
System.out.println( files[ i ].getName() );
}
}
}
}
catch( Exception e ) {
e.printStackTrace();
}
}
}
ex3:
import java.io.*;

class SuperTest{
public static void main(String args[]) {
File dir = new File("E:\\Workspace\\Java\\test20111108"); // 用File 对象表示一个目录
Filter filter = new Filter("txt"); // 生成一个名为java的过滤器
System.out.println("list java files in directory " + dir); String[] files = dir.list(filter); // 列出目录dir下,文件后缀名为txt的所有文件 for (int i = 0; i < files.length; i++) {
File f = new File(dir, files[i]); // 为目录dir 下的文件或目录创建一个File 对象
if (f.isFile()) // 如果该对象为后缀为java的文件,则打印文件名
System.out.println("file: " + f);
else
System.out.println("sub directory " + f); // 如果是目录则打印目录名
}
}
} class Filter implements FilenameFilter {
String extent;
Filter(String extent) {
this.extent = extent;
} public boolean accept(File dir, String name) {
return name.endsWith("." + extent); //返回文件的后缀名
}
} ex4:
import java.io.*;

/**
*把一个文件的所有内容写到另外一个文件中
*/
class FileStreamTest{
public static void main(String args[]) {
try {
File inFile=new File("test1.txt");
File outFile=new File("test2.txt");
FileInputStream fis=new FileInputStream(inFile);
FileOutputStream fos=new FileOutputStream(outFile); int c;
while((c=fis.read())!=-1) //读取一个字节
{
fos.write(c);
} fis.close();
fos.close();
}catch(FileNotFoundException e) {
System.out.println("FileStreamsTest: "+e);
}catch(IOException e) {
System.err.println("FileStreamsTest: "+e);
}
}
}
 
import java.io.*;

class CopyFileTest{
public static void main(String args[]) {
CopyFileTest cf = new CopyFileTest ();
cf.copyFile("test1.txt","test3.txt");
} public boolean copyFile(String src,String des){
File srcFile,desFile;
srcFile = new File(src);
desFile = new File(des);
FileInputStream fis = null;
FileOutputStream fos = null; try{
desFile.createNewFile();
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(desFile);//覆盖
// fos = new FileOutputStream(desFile,true);//追加 int bytesRead;
byte[] buf = new byte[4 * 1024]; // 4K buffer
while((bytesRead=fis.read(buf))!=-1){
fos.write(buf,0,bytesRead);
}
fos.flush();
fos.close();
fis.close();
}catch(IOException e){
System.out.println(e);
return false;
}
return true;
}
}

如果只是在尾部追加,而不是覆盖需要调用FileOutputStream(“file”,true)就Ok了,对于字符流文件就是FileWriter(“file”,true)就OK乐。

父类过滤流:
FilterInputStream(InputStream in);
FilterOutputStream(OutputStream out);

过滤流—缓冲流

类BufferedInputStream和BufferedOutputStream继承FilterInputStream和FilterOutputStream,实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高该I/O流的读取效率,在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。
在读写的同时对数据缓存,这样避免每次读写数据都要进行实际的物理读写操作,在用BufferdOutputStream输出时,数据先输入缓冲区,当缓冲区满的时再写入连接的输出流,可以调用flush()来清空缓冲区。

 
import java.io.*;

class SuperTest{
public static void main(String args[]) {
try {
File inFile = new File("test1.txt");
File outFile = new File("test4.txt"); BufferedInputStream bufFis=new BufferedInputStream(new FileInputStream(inFile),256);
BufferedOutputStream bufFos=new BufferedOutputStream(new FileOutputStream(outFile),256); int len;
byte bArray[]=new byte[256]; do{
System.out.println("while");
len = bufFis.read(bArray);
bufFos.write(bArray,0,len);
System.out.println("len: " +len);
}while (len==256); bufFis.close();
bufFos.close();
} catch (FileNotFoundException e) {
System.out.println("FileStreamsTest: " + e);
} catch (IOException e) {
System.err.println("FileStreamsTest: " + e);
}
}
}

过滤流—数据流

DataInputStream和DataOutputStream, 继承FilterInputStream和FilterOutputStream,可以用来与计算机无关的格式读写JAVA的基本数据类型以及String对象。
readBoolean() 读一字节,非零为真
readByte() 以8位读字节
readChar() 读Unicode字符
readInt() 读整数值
writeChar(int v) 把字符写进输出流
writeLong(long v) 把长整写进输出流
writeInt(int v) 把整数写进输出流

数据输出流可以是一个已经建立好的输入数据流对象,例如网络的连结,文件等。数据流可通过如下方式建立。
FileInputStream fis = new FileInputStream("file1.txt");
FileOutputStream fos = new FileOutputStream("file2.txt");
DataInputStream dis = new DataInputStream(fis);
DataOutputStream dos = new DataOutputStream(fos);

 
import java.io.*;

class DataStreamIOTest{
public static void main(String args[]) throws IOException
{
FileOutputStream fos = new FileOutputStream("a.txt");
DataOutputStream dos = new DataOutputStream(fos);
try {
dos.writeBoolean(true);
dos.writeByte((byte) 123);
dos.writeChar('J');
dos.writeDouble(3.141592654);
dos.writeFloat(2.7182f);
dos.writeInt(1234567890);
dos.writeLong(998877665544332211L);
dos.writeShort((short) 11223);
} finally {
dos.close();
} FileInputStream fis = new FileInputStream("a.txt");
DataInputStream dis = new DataInputStream(fis);
try {
System.out.println("\t " + dis.readBoolean());
System.out.println("\t " + dis.readByte());
System.out.println("\t " + dis.readChar());
System.out.println("\t " + dis.readDouble());
System.out.println("\t " + dis.readFloat());
System.out.println("\t " + dis.readInt());
System.out.println("\t " + dis.readLong());
System.out.println("\t " + dis.readShort());
} finally {
dis.close();
}
}
}//需要注意的是必须throws IOException才可以编译通过。

字符流

 
例子:利用FileWriter来写文件
try
{
FileWriter fw = new FileWriter("mydata.txt");
PrintWriter out = new PrintWriter(fw);
out.print("面朝大海,");
out.println("春暖花开!");
out.println("环境美好!!");
out.close();
fw.close();
}catch(IOException e)
{
e.printStackTrace();
}
例子:字符缓冲流BufferedReader
import java.io.*;
class SuperTest{
public static void main(String args[]) throws IOException
{
File file = new File("mydata.txt"); try {
BufferedReader in = new BufferedReader(new FileReader(file));
String s;
s = in.readLine();
while ( s != null ) {
System.out.println("Read: " + s);
s = in.readLine();
}
in.close();
} catch (FileNotFoundException e1) {
System.err.println("File not found: " + file);
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
 
例子:拷贝(FileReader和FileWriter)
try {
FileReader input = new FileReader(args[0]);
FileWriter output = new FileWriter(args[1]); char[] buffer = new char[128];
int charsRead;
charsRead = input.read(buffer); while ( charsRead != -1 )
{
output.write(buffer, 0, charsRead);
charsRead = input.read(buffer);
} input.close();
output.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
 
例子:拷贝(BufferedWriter)
try {
FileReader input = new FileReader(args[0]);
BufferedReader bufInput = new BufferedReader(input);
FileWriter output = new FileWriter(args[1]);
BufferedWriter bufOutput = new BufferedWriter(output);
String line; line = bufInput.readLine();
while ( line != null )
{
bufOutput.write(line, 0, line.length());
bufOutput.newLine();
line = bufInput.readLine();
} bufInput.close();
bufOutput.close();
}
catch (IOException e)
{
e.printStackTrace();
}

随机存取文件流--RandomAccessFile
1 RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或者插入数据
2 RandomAccessFile同时实现了DataInput和DataOutput接口,所以可以用它来读/写文件
3构造器:
RandomAccessFile(java.io.File f,String mode)
RandomAccessFile(String file,String mode)
4 mode可以为”r”或”rw”

方法:
1 readXXX()或writeXXX():
如ReadInt(), ReadLine(), WriteChar(), WriteDouble()等
2 int skipBytes(int n):将指针向下移动若干字节
3 length():返回文件长度
4 long getFilePointer():返回指针当前位置
5 void seek(long pos):将指针调到所需位置

import java.io.*;
import java.util.*; class RandomAccessFileTest{
public static void main(String args[])
{
try{
File logfile=new File("mydata.txt"); if(logfile.exists())
{
RandomAccessFile raf=new RandomAccessFile(logfile,"rw");
System.out.println("leghth = " + raf.length());
raf.seek(raf.length()); for(int i=0;i<5;i++)
{
raf.writeBytes("Write "+new Date()+ "\r\n");
} raf.seek(0);
String x=raf.readLine(); while(x!=null)
{
System.out.println(x);
x=raf.readLine();
} raf.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}

JavaI/O系统的更多相关文章

  1. JavaI/O 系统

    1.JavaI/O 系统概述 A.  输入输出(I/O):指的是计算机与外部世界,或者一个程序与计算机的其余部分之间的接口 B. 流的概念(流:Stream) 流的基本特性:有数据.有方向 2. 流的 ...

  2. JavaI/O系统2

    数据流: DataInputStream,DataOutputStream.可以用于与计算机无关的格式读写java的基本数据类型以及String对象 对象流: ObjectInputStream,Ob ...

  3. Lucene的入门

    Lucene准备 Lucene可以在官网上下载,我这里已经下载好了,用的是4.10.3版本的, 解压以后的文件为: 如果没有使用maven管理的话,就需要引入这三个jar包,实现lucene功能. 我 ...

  4. JAVA编程不得不看的几本经典书籍

    为了帮助对java编程感兴趣的同学更好.更快的提高编程技术,武汉北大青鸟光谷校区专业老师在此推荐几本学习编程非常有用的书籍,以供大家参考. 入门类 1.<java从入门到精通>(第3版) ...

  5. 学习Java的书籍资料

    对于程序员来说,编程技术至关重要,然而技术的提高不是一蹴而就的,它需要时间的积累和经验的沉淀.因此本文为大家推荐Java学习的书籍,学虽容易,学好不易,且学且珍惜. 基础类.<Java从入门到精 ...

  6. 2012高校GIS论坛

    江苏省会议中心 南京·钟山宾馆(2012年4月21-22日) 以"突破与提升"为主题的"2012高校GIS论坛"将于4月在南京举行,由南京大学和工程中心共同承办 ...

  7. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  8. 数据库优化案例——————某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  9. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

随机推荐

  1. 图的存储,搜索,遍历,广度优先算法和深度优先算法,最小生成树-Java实现

    1)用邻接矩阵方式进行图的存储.如果一个图有n个节点,则可以用n*n的二维数组来存储图中的各个节点关系. 对上面图中各个节点分别编号,ABCDEF分别设置为012345.那么AB AC AD 关系可以 ...

  2. java io 输入输出流

    数据流分类: 流序列中的数据既可以是未经加工的原始二进制数据, 也可以是经一定编码处理后符合某种格式规定的特定数据. 因此Java中的流分为两种: 1) 字节流:数据流中最小的数据单元是字节 2) 字 ...

  3. 11.tftp和nfs服务器

    宿主机产生嵌入式软件的机器 运行程序的是目标机上运行 基于网络的下载 目标机通过tftp下载到目标机 1. 安装tftp依赖xinetd [root@cfm880 Packages]# rpm -iv ...

  4. openStack镜像制作

    参考链接: https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/OpenStack/page/Creating ...

  5. x265编译

    x265 HEVC Encoder Mission Statement Online documentation Mailing list x265-devel@videolan.org HOWTO  ...

  6. Regularization on GBDT

    之前一篇文章简单地讲了XGBoost的实现与普通GBDT实现的不同之处,本文尝试总结一下GBDT运用的正则化技巧. Early Stopping Early Stopping是机器学习迭代式训练模型中 ...

  7. 【228】◀▶ Excel 函数说明

    官方帮助:Excel 函数(按字母顺序列出) 官方帮助:Excel 函数(按类别列出) 参考:EXCEL常用函数大全 01   N_ELEMENTS 表达式或者变量的元素个数. 02   DEFSYS ...

  8. JAXB 2.0 API is being loaded from the bootstrap classloader

    在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个 ...

  9. 一段防盗连的PHP代码

    $ADMIN[defaulturl] = http://www.163.com/404.htm;  //盗链返回的地址  $okaysites = array("http://www.163 ...

  10. CentOS 安装 chrome 浏览器

    安装 google-chrome 浏览器,由于众所周知的原因,一直安装不了,下面介绍一种新方法. cd 到 /etc/yum.repos.d 创建一个yum新源 vi chromium-el6.rep ...