博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的I/O系统
阅读量:6251 次
发布时间:2019-06-22

本文共 8815 字,大约阅读时间需要 29 分钟。

1.File类

File类既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。

如果我们调用不带参数的list()方法,便可以获得此File对象包含的全部列表。然而,如果我们想获得一个受限列表,例如,想得到所有扩展名为.java的文件,那么我们就要用到“目录过滤器”,这个类告诉我们怎样显示符合条件的File对象。

import java.util.regex.*;import java.io.*;import java.util.*;public class DirList3 {    public static void main(final String[] args) {        File path = new File(".");        String[] list;        if(args.length == 0){            list = path.list();        }else{            list = path.list(new FilenameFilter() {                private Pattern pattern = Pattern.compile(args[0]);                public boolean accept(File dir, String name) {                    return pattern.matcher(name).matches();                }            });        }        Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);        for(String dirItem : list){            System.out.println(dirItem);        }    }}

File类不仅仅只代表存在的文件或目录。也可以用File对象来创建新的目录或尚不存在的整个目录路径。我们还可以查看文件的特性(例如,大小、最后修改日期、读/写),检查某个File对象代表的是一个文件还是一个目录,并可以删除文件。

import java.io.*;public class MakeDirectories {    private static void usage() {        System.err.println(          "Usage:MakeDirectories path1 ...\n" +          "Creates each path\n" +          "Usage:MakeDirectories -d path1 ...\n" +          "Deletes each path\n" +          "Usage:MakeDirectories -r path1 path2\n" +          "Renames from path1 to path2");        System.exit(1);    }        private static void fileData(File f) {        System.out.println(            "Absolute path: " + f.getAbsolutePath() +            "\n Can read: " + f.canRead() +            "\n Can write: " + f.canWrite() +            "\n getName: " + f.getName() +            "\n getParent: " + f.getParent() +            "\n getPath: " + f.getPath() +            "\n length: " + f.length() +            "\n lastModified: " + f.lastModified());        if(f.isFile()){            System.out.println("It's a file");        }else if(f.isDirectory()){            System.out.println("It's a directory");        }    }        public static void main(String[] args) {        if(args.length < 1){            usage();        }        if(args[0].equals("-r")) {            if(args.length != 3){                usage();            }            File old = new File(args[1]),rname = new File(args[2]);            old.renameTo(rname);            fileData(old);            fileData(rname);            return; // Exit main        }        int count = 0;        boolean del = false;        if(args[0].equals("-d")) {            count++;            del = true;        }        count--;        while(++count < args.length) {            File f = new File(args[count]);            if(f.exists()) {                System.out.println(f + " exists");                if(del) {                    System.out.println("deleting..." + f);                    f.delete();                }            }else { // Doesn't exist                if(!del) {                    f.mkdirs();                    System.out.println("created " + f);                }            }            fileData(f);        }    }}

2.字节流

编程语言的I/O类库中常使用这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。

Java类库中的I/O类分成输入和输出两部分。
与输入有关的所有类都应该从InputStream继承,而与输出有关的所有类都应该从OutputStream继承。
1393432-20180531235011534-1090394875.png

1393432-20180531235147931-1757376677.png

3.字符流

ReaderWriter提供兼容Unicode与面向字符的I/O功能。

1393432-20180531235450513-1781045284.png

1393432-20180531235510527-2146608135.png

有时我们必须把来自于“字节”层次结构中的类和“字符”层次结构中的类结合起来使用。为了实现这个目的,要用到适配器类:InputStreamReader可以把InputStream转换为Reader,而OutputStreamWriter可以把OututStream转换为Writer

4.I/O流的典型使用方式

4.1 缓冲输入文件

import java.io.*;public class BufferedInputFile {    // Throw exceptions to console:    public static String read(String filename) throws IOException {        // Reading input by lines:        BufferedReader in = new BufferedReader(new FileReader(filename));        String s;        StringBuilder sb = new StringBuilder();        while((s = in.readLine())!= null){            sb.append(s + "\n");        }        in.close();        return sb.toString();    }        public static void main(String[] args) throws IOException {        System.out.print(read("BufferedInputFile.java"));    }}

4.2 从内存输入

public class MemoryInput {    public static void main(String[] args) throws IOException {        StringReader in = new StringReader(BufferedInputFile.read("MemoryInput.java"));        int c;        while((c = in.read()) != -1){            System.out.print((char)c);        }    }}

4.3 格式化的内存输入

public class FormattedMemoryInput {    public static void main(String[] args) throws IOException {        try {            DataInputStream in = new DataInputStream(new ByteArrayInputStream(BufferedInputFile.read("FormattedMemoryInput.java").getBytes()));            while(true){                System.out.print((char)in.readByte());            }        }catch(EOFException e) {            System.err.println("End of stream");        }    }}
public class TestEOF {    public static void main(String[] args) throws IOException {        DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("TestEOF.java")));        while(in.available() != 0){            System.out.print((char)in.readByte());        }    }}

4.4 基本的文件输入

import java.io.*;public class BasicFileOutput {    static String file = "BasicFileOutput.out";    public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new StringReader(BufferedInputFile.read("BasicFileOutput.java")));        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)));        // Here's the shortcut:        //PrintWriter out = new PrintWriter(file);        int lineCount = 1;        String s;        while((s = in.readLine()) != null ){            out.println(lineCount++ + ": " + s);        }        out.close();        // Show the stored file:        System.out.println(BufferedInputFile.read(file));    }}

4.5 存储和恢复数据

import java.io.*;public class StoringAndRecoveringData {    public static void main(String[] args) throws IOException {        DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("Data.txt")));        out.writeDouble(3.14159);        out.writeUTF("That was pi");        out.writeDouble(1.41413);        out.writeUTF("Square root of 2");        out.close();        DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("Data.txt")));        System.out.println(in.readDouble());        // Only readUTF() will recover the        // Java-UTF String properly:        System.out.println(in.readUTF());        System.out.println(in.readDouble());        System.out.println(in.readUTF());    }}

4.6 读写随机访问文件

import java.io.*;public class UsingRandomAccessFile {    static String file = "rtest.dat";    static void display() throws IOException {        RandomAccessFile rf = new RandomAccessFile(file, "r");        for(int i = 0; i < 7; i++){            System.out.println("Value " + i + ": " + rf.readDouble());        }        System.out.println(rf.readUTF());        rf.close();    }        public static void main(String[] args) throws IOException {        RandomAccessFile rf = new RandomAccessFile(file, "rw");        for(int i = 0; i < 7; i++){            rf.writeDouble(i*1.414);        }        rf.writeUTF("The end of the file");        rf.close();        display();        rf = new RandomAccessFile(file, "rw");        rf.seek(5*8);        rf.writeDouble(47.0001);        rf.close();        display();    }}

5.标准I/O

从标准输入中读取

按照标准I/O模型,Java提供了System.inSystem.outSystem.err

import java.io.*;public class Echo {    public static void main(String[] args) throws IOException {        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));        String s;        while((s = stdin.readLine()) != null && s.length()!= 0){            System.out.println(s);        }        // An empty line or Ctrl-Z terminates the program    }}

System.out转换成PrintWriter

import java.io.*;public class ChangeSystemOut {    public static void main(String[] args) {        PrintWriter out = new PrintWriter(System.out, true);        out.println("Hello, world");    }}

标准I/O重定向

import java.io.*;public class Redirecting {    public static void main(String[] args) throws IOException {        PrintStream console = System.out;        BufferedInputStream in = new BufferedInputStream(new FileInputStream("Redirecting.java"));        PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream("test.out")));        //setIn(InputStream)、setOut(PrintStream)和setErr(PrintStream)对标准输入、输出和错误I/O流进行重定向。        System.setIn(in);        System.setOut(out);        System.setErr(out);        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        String s;        while((s = br.readLine()) != null){            System.out.println(s);        }        out.close(); // Remember this!        System.setOut(console);    }}

6.NIO

相关阅读:

转载于:https://www.cnblogs.com/gzhjj/p/9119539.html

你可能感兴趣的文章
android onPause OnSavedInstance
查看>>
[PHP] - Laravel - CSRF token禁用方法
查看>>
python的序列类
查看>>
分享在MVC3.0中使用jQue“.NET研究”ry DataTable 插件
查看>>
使用Lombok插件需要注意的问题
查看>>
2018-2019-2 20165232 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
查看>>
Visual Studio中“后期生成事件命令行” 中使用XCopy命令
查看>>
代码导读
查看>>
Atlas读写分离[高可用]
查看>>
shell实现rpm -e 一键卸载所有相关包以及依赖
查看>>
坦克大战中摄像机的设置
查看>>
ros:出现:error: ros/ros.h: No such file or directory
查看>>
Java坦克大战 (四) 之子弹的产生
查看>>
web 中常用的两种上传文件的方法总结
查看>>
SCVMM 2012 简体中文正式版部署手册
查看>>
BZOJ 3097: Hash Killer I【构造题,思维题】
查看>>
C/C++中int128的那点事
查看>>
ios多线程学习笔记(2)
查看>>
Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)...
查看>>
黄聪:windowss7显示桌面图标设置在任务栏的解决办法
查看>>