Java IO学习总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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学习总结的主要内容,如果未能解决你的问题,请参考以下文章
java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段