zoukankan      html  css  js  c++  java
  • Java IO学习总结(二)

    一、输入输出流体系

    1)常用流分类

    分类 字节输入流 字节输出流 字符输入流 字符输出流
    抽象基类 InputStream OutputStream Reader Writer
    访问文件 FileInputStream FileOutputStream FileReader FileWriter
    缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
    转换流     InputStreamReader OutputStreamWriter
    对象流 ObjectInputStream ObjectOutputStream    
    访问管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
    访问字符串     StringReader StriingWriter
    访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
    抽象基类 FilterInputStream FilterOutputStream FilterReader FilterWriter
    打印流   PrintStream   WriterStream
    推回输入流 PushbackInputStream   PushbackReader  
    特殊流 DataInputStream DataOutputStream    

    表中黑色加粗的类代表节点流,必须与指定的物理节点关联,斜体字标出的类代表抽象基类,无法直接创建实例。

    如果进行输入输出的是文本内容,则考虑使用字符流,如果输入输出的是二进制内容,则应考虑使用字节流。

    2)转换流

    Java中只有字节转换成字符的转换流,没有字符流转换为字节流

    转换流示例

    public class InputStreamReaderTest {
        public static void main(String[] args) {
            try {
                // 将System.in转换成字符流Reader
                InputStreamReader isr = new InputStreamReader(System.in);
                
                // 把普通的Reader流包装成BufferedReader流方便操作
                BufferedReader br = new BufferedReader(isr);
                
                String line = null;
                while((line = br.readLine()) != null ){
                    if (line.equals("exit")){
                        System.exit(1);
                    }
                    System.out.println("输入的内容:" + line);
                }
                
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
    }

    3)Java虚拟机读取其他进程的数据

    代码示例

    public class ReaderProcessTest {
        public static void main(String[] args) {
            try {
                // 创建进程
                Process pro = Runtime.getRuntime().exec("java");
                
                // 从子线程中输出信息到本程序,对本程序则是输入信息
                BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
                
                String reader = null;
                while((reader = br.readLine()) != null){
                    System.out.println(reader);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    4)RandomAccessFile类

    RandomAccessFile可以自由访问文件任意位置,如果只需要访问文件部分内容,则考虑使用此类。

    RandomAccessFile创建时,构造器中指定mode参数,该参数指定RandomAccessFile的访问模式,该参数有4个值:

    “r”以只读方式打开指定文件,

    “rw”以读写方式打开指定文件,

    “rws”类似于rw,要求将文件内容和元数据得每个更新都同步写入底层的存储设备

    “rwd”类似于rw,要求将文件内容得每个更新同步写入底层的存储设备

    代码示例:

    public class RandomTest {
        public static void main(String[] args) {
            try {
                RandomAccessFile raf = new RandomAccessFile("d:\test.txt", "rw");
                System.out.println("获取文件指针当前位置:" + raf.getFilePointer());
                
                // 从10的位置开始读取
                raf.seek(10);
                byte[] buff = new byte[64];
                int hasRead = 0;
                while((hasRead = raf.read(buff)) != -1){
                    System.out.println("读取的内容:" + new String(buff,0,hasRead));
                }
                
                // 指针移到指定文件最后追加,每运行一次追加一次
                raf.seek(raf.length());
                raf.write("我是追加的内容!
    ".getBytes());
                
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    向指定文件的指定位置插入内容

    public class RandomAccessFileTest {
        public static void main(String[] args) {
            RandomAccessFileTest.insertFile("d:\test.txt", "我是插入的内容", 10);
        }
        
        /**
         * 指定文件指定位置插入内容
         * 1、创建临时文件,把插入点后面的内容保存在临时文件中
         * 2、在插入点后面追加内容
         * 3、将临时文件中的内容追加在文件最后
         * @param fileName 文件名称
         * @param content 插入内容
         * @param pos 指定位置
         */
        public static void insertFile(String fileName,String content,long pos){
            
            try {
                // 创建临时文件
                File temp = File.createTempFile("temp", null);
                // jvm退出时删除临时文件
                temp.deleteOnExit();
                
                // 创建文件输入输出流
                FileInputStream fis = new FileInputStream(temp);
                FileOutputStream fos = new FileOutputStream(temp);
                // 创建可读写数据的流
                RandomAccessFile raf = new RandomAccessFile("d:\test.txt","rw");
                // 指针移到插入的位置
                raf.seek(pos);
                // 将指针后得内容输出到临时文件中
                byte[] buff = new byte[64];
                int hasRead = 0;
                while((hasRead = raf.read(buff)) != -1){
                    fos.write(buff, 0, hasRead);
                }
                
                // 再次将指针移动到插入位置
                raf.seek(pos);
                // 在此后面追加内容
                raf.write(content.getBytes());
                //将临时文件中的内容追加到文件中
                while((hasRead = fis.read(buff)) != -1){
                    raf.write(buff, 0, hasRead);
                }
                
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    《ECMAScript6入门》___阮一峰 笔记
    JS的常用正则表达式 验证密码(转载自用)
    微信小程序 写一个获取验证码 及setInterval 使用基本方法
    python中将图片从客户端(client)推到(POST)到服务器端(server)的方法
    用python将MSCOCO和Caltech行人检测数据集转化成VOC格式
    Tensorflow物体检测(Object Detection)API的使用
    opencv获取IP摄像头(IP-camera)实时视频流
    利用flask将opencv实时视频流输出到浏览器
    Tensorflow同时加载使用多个模型
    opencv在同一窗口打印多张图片
  • 原文地址:https://www.cnblogs.com/quina520/p/7258004.html
Copyright © 2011-2022 走看看