IO流
IO流
- 概念
- 字节流 //主要使用于音频,视频,图片
- 字符流 //主要使用于文本,在内部转为字节流保存,字节流的子类
- 名称 //后缀名是父类名,前缀名时该流对象的功能
- throws IOException //抛出的异常
- 复制文件
1:创建一个文件,用于储存被复制文件的数据
2:定义读取流与被复制文件关联
3:通过不断读写完成数据储存
4:关闭资源
直接复制例子
1 FileWirter Fw = null; 2 FileReader Fr = null; 3 try{ 4 fw = new FileWirter("demo_copy.txt"); //创建文件 5 fr = new FileReader("demo.txt"); //关联文件 6 int len = 0; 7 char[] ch = new char[1024]; 8 while((len=fr.read(ch)) != -1){ //判断文件是否到达末尾 9 fw.write(ch, 0, len); //写入文件有效数据 10 fw.flush()} //刷新文件缓冲区 11 }catch( IOException e ){ //若错误,抛出异常 12 throw new RuntimeException("读写失败"); 13 }finally{ //肯定执行的文件,用于关闭文件流 14 try{ //每个没见流都需要一个try{}来关闭 15 if(fw != null) 16 fw.close(); 17 }catch( IOException e ){ 18 throw new RuntimeException("写入关闭失败"); 19 }try{ 20 if(fr != null) 21 fr.close(); 22 }catch( IOException e ){ 23 throw new RuntimeException("读取关闭失败"); 24 } 25 }
缓冲复制例子
1 BufferedWriter bufferedFw = null; 2 ButteredReader butteredFr = null; 3 try{ 4 bufferedFw = new BufferedWirter(new FileWriter("demo_capy.txt") ); 5 butteredFr = new ButteredReader(new FileReader("demo.txt")); 6 String line =null; 7 while((line=bufferedFr.readLine()) != null){ //判断行是否为空 8 bufferedFw.write(line); //写入行 9 bufferedFw.newLine(); //换行 10 butteredFw.flush(); //刷新缓冲区 11 } 12 }catch(IOException e){ 13 throw new RuntimeException("读写失败"); 14 }finally{ 15 try{ 16 if(bufferedFw != null) 17 bufferedFw.close() 18 }catch(IOException e){ 19 throw new RuntimeException("写入关闭失败"); 20 }try{ 21 if(bufferedFr != null) 22 bufferedFr.close() 23 }catch(IOException e){ 24 throw new RuntimeException("读取关闭失败"); 25 } 26 }
换行
windows,记事本下 "\r\n" 是一个换行符
Linux,"\n"就是一个换行符
- 字符流
Reader //读取
FileReader //文件读取
FileReader fr = new FileReader("demo.txt"); //使用方式,
若文件不存在抛出异常 FileNotFoundException
固定了使用的编码表,GBK
方法
int read() //读取单个字符。
FileReader fr = new FileReader("demo.txt");
fr.read(); //使用方式,读取一个字符,将指针往后移一位
int read(char[] cbuf) //读取数组字符,返回读取个数
long skip(long n) //跳过字符
void close() //关闭该流并释放与之关联的所有资源。
BufferedReader //缓冲读取,体改效率
FileReader fr = new FileReader("demo.txt");
BufferedReader bufferedFr = new BufferedReader(fr); //使用方式,传入需要体改效率的对象
bufferedFw.close(); //关闭缓冲区就等于关闭文件流对象
BufferedReader(Reader in, int sz) //第二个参数为指定缓冲区的大小
特有方法
String readLine() //读取一个文本行。到结束时返回null
LineNumberReader //跟踪行号的缓冲字符输入流。
FileReader fr = new FileReader("demo.txt");
LineNumberReader lnr = new LineNumberReader(fr); //使用方式
int getLineNumber() // 获得当前行号。
void setLineNumber(int lineNumber) //设置当前行号。
1 LineNumberReader例子: 2 FileReader fr = new FileReader("demo.txt"); 3 LineNumberReader lnr = new LineNumberReader(fr); 4 String line = null; 5 lnr.setLineNumber(100); //第一行为101,第二行为102; 6 while((line=lnr.readLine) != -1){ 7 System.out.println(lnr.getLineNumber()+" : "+line)}
1 BufferedReader例子 2 public static void main(String[] args) throws Exception { 3 BufferedReader bufr = new BufferedReader(new FileReader("E:\\Computer\\Java\\小记2\\类的唯一性.txt")); 4 String line = null; 5 while((line=bufr.readLine())!=null){ 6 System.out.println(line); 7 } 8 }
InputStreamReader //转换流,将字节流转为字符流
BufferedReader bufr = new BufferedReader(
new InputStreamReader(System.in)); //输入
1 //将输入的字符串显示在控制台 2 BufferedReader br = new BufferedReader( 3 new InputStreamReader 4 (System.in)); //输入,这是源,根据需求可以改为new FileInputStream("demo.txt") 5 BufferedWirter br = new BufferedWirter( 6 new OutputStreamWirter 7 (System.out)); //这是目的,根据需求可以改为new FileOutputStream("demo.txt") 8 String line = null; 9 while((line=bufr.readLine()) != null){ 10 if(line.equals("over")) 11 break; 12 bufw.write(line); //输出输入的一行 13 bufw.newLine(); //新的一行 14 bufw.fuush(); //刷新缓冲区 15 }
- Wirter //写入
FileWirter //文件写入
方法
void write(String str) //写入字符串。
void flush() //刷新该流的缓冲。
void close() //关闭该流,关闭前刷新该流
BufferedWriter //写入缓冲区,提高效率
特有方法
void newLine() //写入一个行分隔符。
OutputStreamWriter //OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。
1 //将输入的字符串显示在控制台 2 BufferedReader br = new BufferedReader( 3 new InputStreamReader 4 (System.in)); //输入,这是源,根据需求可以改为new FileInputStream("demo.txt") 5 BufferedWirter br = new BufferedWirter( 6 new OutputStreamWirter 7 (System.out)); //这是目的,根据需求可以改为new FileOutputStream("demo.txt") 8 String line = null; 9 while((line=bufr.readLine()) != null){ 10 if(line.equals("over")) 11 break; 12 bufw.write(line); //输出输入的一行 13 bufw.newLine(); //新的一行 14 bufw.fuush(); //刷新缓冲区 15 }
- 字节流
InputStream //输入流(读取)
FileInputStream //文件输入流
方法
int available() //返回文件的字节数,
void close() //关闭输入流,释放资源
int read() //读取下一字节
返回值是 int 类型是为了避免-1的发生 -1在字节(8位)中显示 11111111 转为 int 类型也是-1 11111111 11111111 11111111 11111111 如何让byte类型转化为int时前面+0而不是+1, 用& 11111111 11111111 11111111 11111111 &00000000 00000000 00000000 11111111 -------------------------------------------------------- 00000000 00000000 00000000 11111111 所以在源代码中 return byte&0xFF //0xFF为16进制的255,(11111111为二进制的255)
long skip(long n) //跳过和丢弃此输入流中数据的 n 个字节。
SequenceInputStream //合并文件流
OutputStream //输出流(写入)
FileOutputStream //文件输出流
方法
void write(byte[] b) //将 b.length 个字节从指定的 byte 数组写入此输出流。
void flush() //刷新此输出流并强制写出所有缓冲的输出字节。
void close() //关闭此输出流并释放与此流有关的所有系统资源。
- 异常的处理方式
1 FileWirter fw = null; 2 try{ 3 fw = new FileWirter("demo.txt"); 4 fw.write("abcd"); 5 }cath ( IOException e ){ 6 thow new RuntimeException("读写失败"); 7 }finally{ 8 try{ 9 if( fw!=null ) //若前面抛出异常,则不执行close 10 fw.close();} 11 cath( IOException e ){} 12 }
- 流的操作规律:
想要知道开发时用到哪些对象。只要通过四个明确即可。
1 1,明确源和目的(汇) 2 源:InputStream Reader 3 目的:OutputStream Writer 4 5 2,明确数据是否是纯文本数据。 6 源:是纯文本:Reader 7 否:InputStream 8 目的:是纯文本 Writer 9 否:OutputStream 10 11 到这里,就可以明确需求中具体要使用哪个体系。 12 13 3,明确具体的设备。 14 源设备: 15 硬盘:File 16 键盘:System.in 17 内存:ArrayStream 18 网络:Socket流 19 20 目的设备: 21 硬盘:File 22 控制台:System.out 23 内存:ArrayStream 24 网络:Socket流 25 26 4,是否需要其他额外功能。 27 1,是否需要高效(缓冲区); 28 是,就加上buffer. 29 2,转换。 30 31 需求1:复制一个文本文件。 32 1,明确源和目的。 33 源:InputStream Reader 34 目的:OutputStream Writer 35 2,是否是纯文本? 36 是! 37 源:Reader 38 目的:Writer 39 40 3,明确具体设备。 41 源: 42 硬盘:File 43 目的: 44 硬盘:File 45 46 FileReader fr = new FileReader("a.txt"); 47 FileWriter fw = new FileWriter("b.txt"); 48 49 4,需要额外功能吗? 50 需要,需要高效。 51 BufferedReader bufr = new BufferedReader(new FileReader("a.txt")); 52 BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt")); 53 54 需求2:读取键盘录入信息,并写入到一个文件中。 55 56 1,明确源和目的。 57 源:InputStream Reader 58 目的:OutputStream Writer 59 2,是否是纯文本呢? 60 是, 61 源:Reader 62 目的:Writer 63 3,明确设备 64 源: 65 键盘。System.in 66 目的: 67 硬盘。File 68 69 InputStream in = System.in; 70 FileWriter fw = new FileWriter("b.txt"); 71 这样做可以完成,但是麻烦。将读取的字节数据转成字符串。再由字符流操作。 72 4,需要额外功能吗? 73 需要。转换。 将字节流转成字符流。因为名确的源是Reader,这样操作文本数据做便捷。 74 所以要将已有的字节流转成字符流。使用字节-->字符 。InputStreamReader 75 InputStreamReader isr = new InputStreamReader(System.in); 76 FileWriter fw = new FileWriter("b.txt"); 77 78 还需要功能吗? 79 需要:想高效。 80 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 81 BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt")); 82 83 84 85 需求3:将一个文本文件数据显示在控制台上。 86 1,明确源和目的。 87 源:InputStream Reader 88 目的:OutputStream Writer 89 2,是否是纯文本呢? 90 是, 91 源:Reader 92 目的:Writer 93 3,明确具体设备 94 源: 95 硬盘:File 96 目的: 97 控制台:System.out 98 99 FileReader fr = new FileReader("a.txt"); 100 OutputStream out = System.out;//PrintStream 101 4,需要额外功能吗? 102 需要,转换。 103 FileReader fr= new FileReader("a.txt"); 104 OutputStreamWriter osw = new OutputStreamWriter(System.out); 105 需要,高效。 106 BufferedReader bufr = new BufferedReader(new FileReader("a.txt")); 107 BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out)); 108 109 110 需求4:读取键盘录入数据,显示在控制台上。 111 1,明确源和目的。 112 源:InputStream Reader 113 目的:OutputStream Writer 114 2,是否是纯文本呢? 115 是, 116 源:Reader 117 目的:Writer 118 3,明确设备。 119 源: 120 键盘:System.in 121 目的: 122 控制台:System.out 123 124 InputStream in = System.in; 125 OutputStream out = System.out; 126 127 4,明确额外功能? 128 需要转换,因为都是字节流,但是操作的却是文本数据。 129 所以使用字符流操作起来更为便捷。 130 InputStreamReader isr = new InputStreamReader(System.in); 131 OutputStreamWriter osw = new OutputStreamWriter(System.out); 132 133 为了将其高效。 134 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 135 BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
将堆中的对象保存为本地文件
java.io.ObjectInputStream //对文件进行读取
java.io.ObjectOutputStream //写入对象
操作基本数据类型对象
随机访问文件的读取和写入。
java.io.RandomAccessFile
方法
增
void write(int b)
向此文件写入指定的字节。
void writeBytes(String s)
按字节序列将该字符串写入该文件。
删
void close()
关闭此随机访问文件流并释放与该流关联的所有系统资源。
改
void seek(long pos)
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
void setLength(long newLength)
设置此文件的长度。
int skipBytes(int n)
尝试跳过输入的 n 个字节以丢弃跳过的字节。 (修改指针位置)
查
String readUTF()
从此文件读取一个字符串。
int readUnsignedByte()
从此文件读取一个无符号的八位数。
long getFilePointer() //返回当前指针位置
long length() //返回文件大小
int read()
从此文件中读取一个数据字节。
int readInt()
从此文件读取一个有符号的 32 位整数。
void readFully(byte[] b)
将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。
void readFully(byte[] b, int off, int len)
将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。