IO流:是用来操作文件内容的的技术,输入输出都是针对程序而言的
I(in)输入:向程序中输入数据,一般是从文件中读取数据到程序中 O(out)输出:程序向外部输送数据,一般是将数据输出到文件中 下图为IO继承体系图 IO流可以分为两类,分别是字节流和字符流 字节流可以分为字节输出流,字节输入流和字节缓冲流 字符流可以分为字符输出流,字符输入流和字符缓冲流 主要使用到的类为表所示:
分类输出流输入流缓冲输入流缓冲输出流字节流FileInputStreamFileOutputStreamBufferedInputStreamBufferedOutputStream字符流InputStreamReaderOutputStreamWriterBufferedReaderBufferedWriter使用FileOutputStream需要指定文件路径名的,也可以使用File类进行传递 FileOutputStream(File file) FileOutputStream(String name)
//字节输出流 FileOutputStream fos = new FileOutputStream("E:\\test.txt");如果我们想往文件中写入数据,可以使用以下几种方式:
方法名作用void write(int b)将指定的字节写入文件,一次一个字节void write(byte[] b)将b.length字节写入指定文件,一次写一个字节数组的数据void write(byte[] b,int off,int len)将指定的字节数据,以一定的偏移量写入文件下面用上述的方法吧数据写入到文件中:
//字节输出流 FileOutputStream fos = new FileOutputStream("E:\\test.txt"); //吧数据写入到文件中 byte[] b = {97,98,99}; fos.write(b); //关闭输出流 fos.close();下图为执行结果: 如果想吧自定义的字符串写进去,可以通过String中的getBytes()方法吧字符串转为字节数组
//字节输出流 FileOutputStream fos = new FileOutputStream("E:\\test.txt"); //吧数据写入到文件中 String s = "你好,世界!"; fos.write(s.getBytes()); //关闭字节输出流 fos.close();下图为运行结果: 注意:IO流使用完了以后一定要释放资源
输出流每次写数据的时候都会先吧文件清空再写进数据,如果向往文件中追加数据,可以使用下面的构造方法: FileOutputStream(String name, boolean append) FileOutputStream(File file, boolean append) 第二个表示的是是否需要追加内容,true表示追加,false表示不追加
//字节输出流 FileOutputStream fos = new FileOutputStream("E:\\test.txt",true); //吧数据写入到文件中 String s = "你好,世界!"; fos.write(s.getBytes()); //关闭字节输出流 fos.close();运行结果如下: 如果想实现换行,可以在写完数据后写入换行符 对于不同的系统换行符不同 Windows:\r\n Linux:\n
使用FileInputStream的时候依然是需要传递文件路径 FileInputStream(File file) FileInputStream(String name)
//字节输入流 FileInputStream fis = new FileInputStream("E:\\test.txt");读取文件中的数据可以使用下面的方法:
方法名作用int read()一次读取一个字节的数据,返回字节码int read(byte[] b)一次读取一个字节数据的数据,返回读取数据的长度主要是使用第二种方式居多:
//字节输入流 FileInputStream fis = new FileInputStream("E:\\test.txt"); //通过字节数据进行读取 byte[] b = new byte[1024]; int len = 0; //读取数据 while((len = fis.read(b)) != -1) { String s = new String(b,0,len); System.out.println(s);//打印结果:你好,世界!你好,世界! } //关闭流 fis.close();使用字节数组读取数据时,建议大小使用1024及其倍数 因为不知道数据有多少,所以可以使用循环进行读取,如果读取到文件的末尾,就会返回-1,所以可以作为循环结束的条件 读取的数据会放入到字节数组中,并返回读取到的长度,所以可以使用字符串的构造方法将数据读取出来,这里建议使用偏移量进行字节数组转字符串
使用缓冲流,可以提高我们读取和写入数据的效率,所以缓冲流推荐使用
字符缓冲输入流和字节缓冲输出流的操作和一般的字节流操作相同,但是使用时传递的参数不同 BufferedInputStream(InputStream in) BufferedOutputStream(OutputStream out)
//创建缓冲输入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\test.txt")); //创建缓冲输出流 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\test.txt"));为什么构造方法需要的是字节流,而不是具体的文件或者路径呢? 字节缓冲流仅仅提供缓冲区,而真正的读写数据还是要依靠基本的字节流对象进行操作
这里可以做个拷贝文件的案例:
//创建缓冲输入流,指定需要拷贝的文件 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\test.txt")); //创建缓冲输出流,,指定拷贝文件到哪里 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\test01.txt")); //创建存储的字节数组 byte[] b = new byte[1024]; int len = 0; //循环读写数据 while((len = bis.read(b)) != -1) { //讲字节写入 bos.write(b, 0, len); } //释放流 bos.close(); bis.close();运行结果如下:
由于字节流操作中文不是很方便,所以Java提供了字符流 字符流 = 字节流 + 编码
使用字符流的时候是可以指定字符集的,但还是需要通过字节流来指定文件 OutputStreamWriter(OutputStream out) OutputStreamWriter(OutputStream out,String charsetName)
//创建字符输出流,指定字符集 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\test.txt"),"utf8");如果要写入数据,可以使用下面的方法:
方法名作用void write(int c)一次写一个字符void write(char[] c)一次写一个字符数组void write(char[] c,int off,int len)写字符数组的一部分void write(String str)写一个字符串void write(String str,int off,int len)写字符串的一部分通过上述方法进行写入中文数据:
//创建字符输出流,指定字符集 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\test.txt"),"utf8"); //通过字符数据写入 char[] c = {'你','好'}; //写入 osw.write(c); //关闭流 osw.close();运行结果如下: 如果没有写进去数据,可能是没有刷新流或者关闭流 刷新流可以使用flush()方法
字符输入流依然可以指定字符集 InputStreamReader(InputStream in) InputStreamReader(InputStream in,String charsetName) 如果想读入数据可以使用下面的方法:
方法名作用int read()一次读一个字符数据int read(char[] c)一次读取一个字符数组的数据通过上面的方法读入数据:
//创建字符输入流 InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\test.txt"),"utf8"); //通过字符数组放数据 char[] c = new char[6]; int len = 0; //循环读取数据 while((len = isr.read(c)) != -1) { String s = new String(c,0,len); System.out.println(s);//打印结果:你好 } //关闭流 isr.close();字符串的构造方法也可以吧字符数组转为字符串
构造方法: BufferedReader(Reader in) BufferedWriter(Writer out) 构造方法要求我们给的是字符流的对象
//创建字符缓冲输入流 BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream("E:\\test.txt"))); //创建字符缓冲输出流 BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream("E:\\test.txt")));字符缓冲流中特有的功能: BufferedReader:String readLine():读取一行,并把结果以字符串的形式返回 BufferedWriter:void newLine():进行换行操作
//创建字符缓冲输入流 BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream("E:\\test.txt"))); //创建字符缓冲输出流 BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream("E:\\test.txt"))); //写入数据并换行 bw.write("你好呀!"); //换行 bw.newLine(); bw.write("世界!"); //刷新流 bw.flush(); //读取数据 String s = br.readLine(); System.out.println(s);//打印结果:你好呀! //释放资源 bw.close(); br.close();文件运行结果如下:
具有自动刷新的缓冲字符输出流,特点是可以按行写出字符串,并且可以自动换行刷新。 java.io.BufferedWriter是缓冲字符输出流,内部有缓冲区可以进行块写操作提高效率, 而PrintWriter就是通过连接它实现的缓冲功能
构造方法我们可以传递一个字节流 PrintWriter(OutputStream out)
//创建缓冲输出流 PrintWriter pw = new PrintWriter(new FileOutputStream("E:\\test.txt"));如果要写入数据就可以使用熟悉的打印了
//创建缓冲输出流 PrintWriter pw = new PrintWriter(new FileOutputStream("E:\\test.txt")); //写入数据(换行) pw.println("你好呀"); //写入数据(不换行) pw.print("java"); //吸入数据(不换行) pw.print("世界"); //关闭流 pw.close();文件运行结果如下:
今天的分享就到这里了,如果有错误的地方,欢迎大家来指点!
