首页 > 代码库 > Java IO学习总结(二)

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("我是追加的内容!\r\n".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();
        }
    }
}

Java IO学习总结(二)