博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有了这些,java IO就不愁了
阅读量:5320 次
发布时间:2019-06-14

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

IO的总结:

  • java中相对路径和绝对路径的问题:
    • 在web项目中,如果生成的文件前面没有 / 开头的话,表示的是生成的文件在当前项目的根目录下如student.txt在项目中刷新就能看到。
    • 如果是以/开头的话,如/student.txt则表示文件存放在磁盘根目录下(D://student.txt)。(好像也有可能在eclipse的根目录下)
    • 也可以将文件写在绝对路径下,如C://user/student.txt则表示文件在C盘的user目录下。

1. 基本流: InputStream、OutputStream、Reader、Writer等基本的输入输出,在使用的时候通过这些抽象方法的实现类(FileInputStream、FileOutputStream、FileReader、FileWriter)等来进行读取的读取和写入主要是通过 int b = fis.read()fos.write(b) 这种方式来读取或者写入的。

2. BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter等带有Buffer关键字的,通常情况下是在1的情况下再套一层Buffer流,原理就是先将数据写入到缓存中,再从缓存中将数据取出来。

  • Buffer读取流的时候,使用的是bis.Reader()来读取的而BufferedReader则是使用br.readLine()来读取一行。
  • 当使用BufferedWriter来写入数据的时候有一个bw.flush()方法,主要目的是将缓存中的数据强制写出去。

3. Data流: 主要是可以对基本数据类型进行写入写出等操作

  • Data流写数据:
    创建一个字节数组输出流 ByteArrayOutputStream。
    创建 DataOutputStream 对象来对ByteArrayOutputStream进行数据的写入操作。
    可通过 dos.writeBoolean() writeString() writeDouble() ... 。
  • Data流读数据:
    创建一个字节数组输入流 ByteArrayInputStream();
    创建 DataInputStream对象来对上述字节流读取。
    可以通过dis.readBoolean() readString() ....

4. Print流: 常见的是System.out.print()来输出

  • PrintStream可以指定输出对象,并不一定要输出在控制台,可以输出在文件中等。
    创建输出文件(FileOutputStream fos = new FileOutputStream("txt/unicode.txt");)、设置输出位置(System.setOut(ps);)、打印输出对象(System.out.println(i);)即可完成指定输出。
  • PrintWriter对象,可以指定将数据输出到文件中。
  • 使用PrintStream读取文件数据。

5. ObjectOutputStream/ObjectInputStream 利用这两个对象可以存放序列化的数据。

6. 随机读取File文件:RandomAccessFile提供了seek()方法,用来定位将要读写文件的指针位置,我们也可以通过调用getFilePointer()方法来获取当前指针的位置。

7. 管道:管道主要用来实现同一个虚拟机中的两个线程进行交流。因此,一个管道既可以作为数据源媒介也可作为目标媒介。需要注意的是java中的管道和Unix/Linux中的管道含义并不一样,在Unix/Linux中管道可以作为两个位于不同空间进程通信的媒介,而在java中,管道只能为同一个JVM进程中的不同线程进行通信。和管道相关的IO类为:PipedInputStream和PipedOutputStream。

1.文件输入输出流

/* 使用文件输入输出流的方式将sa图片输出到另一个位置*/    public class Test1FileInputStream {        private static FileInputStream in = null;        private static FileOutputStream out = null;            public static void main(String[] args) {                int b = 0;                try {                in = new FileInputStream("pic/sa.jpg");                out = new FileOutputStream("output/pic/sb.jpg");                    while ((b = in.read()) != -1) {                    System.out.print((char) b);                    out.write(b);                }                    in.close();                out.close();            } catch (FileNotFoundException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            } finally {                System.out.println("over");            }            }    }

2.文件读取类

/*从文件中读取数据*/    public class Test3FileReader {            public static void main(String[] args) {                int c = 0;            try {                FileReader reader = new FileReader("a.txt");                while ((c = reader.read()) != -1) {                    System.out.print((char) c);                }            } catch (Exception e) {                e.printStackTrace();            }            }        }

3.文件写入类

/* 将数据写入文本中*/    public class Test4FileWriter {            public static void main(String[] args) {            try {                FileWriter writer = new FileWriter("a.txt");                for (int i = 0; i < 65535; i++) {                    writer.write((char) i);                }                writer.close();                System.out.println("success");            } catch (IOException e) {                e.printStackTrace();                System.out.println("err");                System.exit(-1);            }            }        }

4.使用流的方式读取文件

/*读取并输出文件内容*/    public class Test5BufferStream {        public static void main(String[] args) {                try {                FileInputStream inputStream = new FileInputStream("mark.log");                BufferedInputStream bis = new BufferedInputStream(inputStream);                // System.out.println(bis.read());                // System.out.println(bis.read());                int c = 0;                while ((c = bis.read()) != -1) {                    System.out.print((char) c);                }                bis.close();            } catch (Exception e) {                e.printStackTrace();            }            }    }

5.使用缓存的方式读取和写入文件

/*向一个文件中写入缓存数据并读取出来*/    public class Test6BufferStream1 {            public static void main(String[] args) {                try {                // 通过缓存区向文件中写入数据                BufferedWriter bw = new BufferedWriter(new FileWriter("txt/a.txt"));                String s = null;                for (int i = 0; i < 100; i++) {                    s = String.valueOf(Math.random());                    bw.write(s);                    bw.newLine();                }                bw.flush();                    // 从文件中将数据读取到缓冲区在读取出来                BufferedReader br = new BufferedReader(new FileReader("txt/a.txt"));                while ((s = br.readLine()) != null) {                    System.out.println(s);                }                bw.close();                br.close();                } catch (IOException e) {                e.printStackTrace();            }            }        }

6.将输入的内容打印出来

/*将数据从console中读出*/    public class Test7TransForm {        public static void main(String[] args) {                InputStreamReader reader = new InputStreamReader(System.in);            BufferedReader reader2 = new BufferedReader(reader);                String s = null;                try {                s = reader2.readLine();                while (s != null) {                    if (s.equalsIgnoreCase("exit")) {                        System.exit(0);                    }                    System.out.println(s);                    s = reader2.readLine();                }                reader2.close();                reader.close();            } catch (IOException e) {                e.printStackTrace();            }            }    }

7.使用OutputStreamWriter类将数据写入到文件中

/*OutputStreamWriter类*/    public class Test8TransForm1 {            public static void main(String[] args) {            try {                // 如果为true表示在原来的基础上追加 数据而不是覆盖                OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("txt/b.txt", true), "utf-8");                osw.write("abcdefghijklmnopqrst ");                osw.flush();// 将缓存中的数据强制发送出去                System.out.println(osw.getEncoding());                    osw.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }

8.ByteArrayOutputStream类

/*利用dataStream可以向文件中写入各种类型的数据*/    public class Test9DataStream {            public static void main(String[] args) throws IOException {                // 创建字节数组            ByteArrayOutputStream baos = new ByteArrayOutputStream();            // 创建数据输出流            DataOutputStream dos = new DataOutputStream(baos);                dos.writeDouble(Math.random());            dos.writeBoolean(true);            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());            System.out.println(bais.available());// 八个字节            DataInputStream dis = new DataInputStream(bais);            System.out.println(dis.readDouble());            System.out.println(dis.readBoolean());            dos.close();            dis.close();            }        }

9.使用PrintStream将数据输出到文件中

/*将输出输出到文件中*/    public class TestPrintStream1 {            private static PrintStream ps = null;            public static void main(String[] args) throws Exception {            // 创建输出的文件            FileOutputStream fos = new FileOutputStream("txt/unicode.txt");            // 创建输出流            ps = new PrintStream(fos);                if (ps != null) {                // 指定输出的位置                System.setOut(ps);            }            int in = 0;            // 将数据输出            for (char i = 0; i < 60000; i++) {                System.out.print(i + " ");                in++;                if (in >= 50) {                    System.out.println();                    in = 0;                }            }            System.out.println("over");        }        }

10.日志的基本原理

/*将输入的内容记录到日志中*/    public class TestPrintStream2 {            public static void main(String[] args) throws Exception {                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));            String s = null;                FileWriter writer = new FileWriter("mark.log", true);                PrintWriter log = new PrintWriter(writer);            while ((s = br.readLine()) != null) {                if (s.equalsIgnoreCase("exit")) {                    break;                }                System.out.println(s);                log.println("--------------");                log.println(s);                log.flush();            }            log.print("==" + new Date() + "==");            log.flush();            log.close();        }        }

11.使用缓存区文件读取

/*使用输出流读取文件内容,显示在console中*/    public class TestPrintStream3 {            public static void main(String[] args) {            String fileName = "mark.log";            if (fileName != null) {                list(fileName, System.out);            }        }            private static void list(String file, PrintStream ps) {                try {                // 创建缓冲区读取对象                BufferedReader br = new BufferedReader(new FileReader(file));                String s = null;                // 循环读取缓冲区的内容                while ((s = br.readLine()) != null) {                    // 将数据读取到控制台上                    ps.println(s);                }                br.close();            } catch (Exception e) {                e.printStackTrace();                ps.print("读取错误");            }        }        }

12.对象输入输出流

/* transient 修饰的成员变量在序列化的时候不予考虑*/    public class TestObjectIO {        public static void main(String[] args) {            T t = new T();            t.i = 6;            try {                // 将对象写到文本中                FileOutputStream fos = new FileOutputStream("txt/object.io");                ObjectOutputStream oos = new ObjectOutputStream(fos);                oos.writeObject(t);                oos.flush();                oos.close();                    // 将对象从文本中读出来                FileInputStream fis = new FileInputStream("txt/object.io");                ObjectInputStream ois = new ObjectInputStream(fis);                T t1 = (T) ois.readObject();                System.out.println(t1.d + " " + t1.i + " " + t1.j + " " + t1.k);                } catch (Exception e) {                e.printStackTrace();            }            }    }        class T implements Serializable {        double d = 2.3;        int i = 10;        int j = 9;        transient int k = 2;    }

13. 随机读写

/*随机读写文件*/    public class TestAccessFile {            public static void randomAccessFileWrite() throws IOException {            // 创建一个RandomAccessFile对象            RandomAccessFile file = new RandomAccessFile("d:/test.txt", "rw");            // 通过seek方法来移动读写位置的指针            file.seek(10);            // 获取当前指针            long pointerBegin = file.getFilePointer();            // 从当前指针位置开始写            file.write("hehe 你好牛鞭".getBytes());            long pointerEnd = file.getFilePointer();            System.out.println("pointerBegin:" + pointerBegin + "\n" + "pointerEnd:" + pointerEnd + "\n");            file.close();        }            public static void randomAccessFileRead() throws IOException {            // 创建一个RandomAccessFile对象            RandomAccessFile file = new RandomAccessFile("d:/test.txt", "rw");            // 通过seek方法来移动读写位置的指针            file.seek(10);            // 获取当前指针            long pointerBegin = file.getFilePointer();            // 从当前指针开始读            byte[] contents = new byte[1024];            file.read(contents);            long pointerEnd = file.getFilePointer();            System.out.println(                    "pointerBegin:" + pointerBegin + "\n" + "pointerEnd:" + pointerEnd + "\n" + new String(contents));            file.close();        }            public static void main(String[] args) throws Exception {                randomAccessFileWrite();            randomAccessFileRead();        }        }

14. 管道Demo

public class TestPipe {            public static void main(String[] args) throws IOException {            // 实现在不同线程中对同一对象进行读写操作            final PipedOutputStream pos = new PipedOutputStream();            final PipedInputStream pis = new PipedInputStream(pos);                // 在第一个线程中对管道进行写入操作            Thread t1 = new Thread(new Runnable() {                @Override                public void run() {                    try {                        pos.write("Hello world, pipe!".getBytes());                    } catch (IOException e) {                    }                }            });            // 在第二个线程中对管道数据进行读取操作            Thread t2 = new Thread(new Runnable() {                @Override                public void run() {                    try {                        int data = pis.read();                        while (data != -1) {                            System.out.print((char) data);                            data = pis.read();                        }                    } catch (IOException e) {                    } finally {                        try {                            pis.close();                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                }            });            t1.start();            t2.start();        }    }

转载于:https://www.cnblogs.com/esileme/p/7522427.html

你可能感兴趣的文章
MySQL学习笔记(四)
查看>>
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
两数和
查看>>
移动设备和SharePoint 2013 - 第3部分:推送通知
查看>>
SOPC Builder中SystemID
查看>>
MySQL数据库备份工具mysqldump的使用(转)
查看>>
NTP服务器配置
查看>>
【转】OO无双的blocking/non-blocking执行时刻
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>
RxJS & Angular
查看>>
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>