Java 流(Stream)、文件(File)和IO

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。


读取控制台输入

为了获得一个绑定到控制台的字符流,你可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流。

下面是创建 BufferedReader 的基本语法:

BufferedReader br =new BufferedReader(new

        InputStreamReader(System.in));

BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。


从控制台读取多字符输入  read() 方法

下面的程序示范了用 read() 方法从控制台不断读取字符直到用户输入 "q"。

//使用 BufferedReader 在控制台读取字符

import java.io.*;

public class BRRead {

public static void main(String args[])throws IOException {

char c;

        // 使用 System.in 创建BufferedReader

        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));

        System.out.println("输入字符, 按下 'q' 键退出。");

        // 读取字符

        do {

c = (char) br.read();

            System.out.println(c);

        }while (c !='q');

    }

}

运行结果如下:

输入字符, 按下 'q' 键退出。

run

r

u

q

q


从控制台读取字符串 readLine() 方法

下面的程序读取和显示字符行直到你输入了单词"end"。

//使用 BufferedReader 在控制台读取字符

import java.io.*;

public class BRReadLines {

public static void main(String args[])throws IOException {

// 使用 System.in 创建BufferedReader

        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));

        String str;

        System.out.println("Enter lines of text.");

        System.out.println("Enter 'end' to quit.");

        do {

str = br.readLine();

            System.out.println(str);

        }while (!str.equals("end"));

    }

}

以上实例编译运行结果如下:

Enter lines of text.

Enter 'end' to quit.

This is line one

This is line one

This is line two

This is line two

end

end


读写文件

一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。

下图是一个描述输入流和输出流的类层次图。



FileInputStream

该流用于从文件读取数据

两种构造方法:

InputStream f = new FileInputStream("C:/java/hello");

File f = new File("C:/java/hello");

InputStream out = new FileInputStream(f);


常用方法

FileOutputStream

该类用来创建一个文件并向文件中写数据。

如果该目标文件不存在,那么该流会创建该文件。

两个构造方法:

OutputStream f = new FileOutputStream("C:/java/hello")

File f = new File("C:/java/hello");

OutputStream f = new FileOutputStream(f);


常用方法

实例

InputStream 和 OutputStream 用法的例子:

二进制写入,可能存在乱码:

import java.io.*;

public class fileStreamTest {

public static void main(String args[]) {

try {

byte bWrite[] = {11, 21, 3, 40, 5 };

            OutputStream os =new FileOutputStream("test.txt");

            for (int x =0; x < bWrite.length; x++) {

os.write(bWrite[x]); // writes the bytes

            }

os.close();

            InputStream is =new FileInputStream("test.txt");

            int size = is.available();

            for (int i =0; i < size; i++) {

System.out.print((char) is.read() +"  ");

            }

is.close();

        }catch (IOException e) {

System.out.print("Exception");

        }

}

}

解决乱码示例:

//文件名:fileStreamTest2.java

import java.io.*;

public class fileStreamTest2 {

public static void main(String[] args)throws IOException {

File f =new File("a.txt");

        FileOutputStream fop =new FileOutputStream(f);

        // 构建FileOutputStream对象,文件不存在会自动新建

        OutputStreamWriter writer =new OutputStreamWriter(fop, "UTF-8");

        // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk

        writer.append("中文输入");

        // 写入到缓冲区

        writer.append("\r\n");

        // 换行

        writer.append("English");

        // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入

        writer.close();

        // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉

        fop.close();

        // 关闭输出流,释放系统资源

        FileInputStream fip =new FileInputStream(f);

        // 构建FileInputStream对象

        InputStreamReader reader =new InputStreamReader(fip, "UTF-8");

        // 构建InputStreamReader对象,编码与写入相同

        StringBuffer sb =new StringBuffer();

        while (reader.ready()) {

sb.append((char) reader.read());

            // 转成char加到StringBuffer对象中

        }

System.out.println(sb.toString());

        reader.close();

        // 关闭读取流

        fip.close();

        // 关闭输入流,释放系统资源

    }

}


Java中的目录


创建目录:

File类中有两个方法创建文件夹:

mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。

mkdirs()方法创建一个文件夹和它的所有父文件夹。

读取目录:

一个目录其实就是一个 File 对象,它包含其他文件和文件夹。

如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。

可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。

String s[] = f1.list();



删除目录或文件

当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。

测试目录结构:

/tmp/java/

|-- 1.log

|-- test

import java.io.File;

public class DeleteFileDemo {

public static void main(String args[]) {

// 这里修改为自己的测试目录

        File folder =new File("/tmp/java/");

        deleteFolder(folder);

    }

// 删除文件及目录

    public static void deleteFolder(File folder) {

File[] files = folder.listFiles();

        if (files !=null) {

for (File f : files) {

if (f.isDirectory()) {

deleteFolder(f);

                }else {

f.delete();

                }

}

}

folder.delete();

    }

}





        本文参考  菜鸟教程Java IO  

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容