韩顺平 java io编程
文件流
文件在程序中是以流的形式来操作的。
- 内存 –输出流–> 文件
- 内存 <–输入流– 文件
流:数据在数据源(文件)和程序(内存)之间经历的路径。
注意:以内存为参照物
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
文件流分类
java流分为两种流
1. 字节流:可以用于读写二进制文件及任何类型文件(以byte单位读取)
2. 字符流:可以用于读写文本文件(记事本可以打开的,不能操作二进制文件)
输入:字节流(InputStream)、字符流(Reader)
输出:字节流(OutputStream)、(Writer)
java IO
File f = new File("/Users/chenwen/Desktop/aa.txt");
System.out.println("文件路径:"+ f.getAbsolutePath());
System.out.println("文件大小:" + f.length());
输出:
文件路径:/Users/chenwen/Desktop/aa.txt
文件大小:31
虽然文件大小是31字节,但是点击文件属性却发现,文件占了4kb。
why?
这个和计算机有关,计算机最小的块为4kb。
用不完也会占4kb。也就是说某个文件占得大小是4kb的倍数。
创建文件和文件夹
String filename = "aa.txt";String folder = "/Users/chenwen/Desktop/test/";//创建一个文件对象(文件夹也是文件的一种)File f = new File(folder);if(f.isDirectory()){System.out.println("文件夹已经存在了~");System.out.println("文件夹下的东西有:" );File lists[] = f.listFiles();for(int i =0; i < lists.length;++i){System.out.println(lists[i].getName());}}else{f.mkdir();System.out.println("文件夹已经创建好了");}//创建文件对象f = new File(folder + filename);if(f.exists()){System.out.println("文件存在啦~");}else{try {f.createNewFile();} catch (IOException e) {e.printStackTrace();}System.out.println("文件已经创建好了");}
读取文件内容到内存
//读取文件内容到内存//f指向文件f = new File(folder + filename);FileInputStream fis = null;try {//因为File没有读写的能力,所以需要FileInputStream转一下fis = new FileInputStream(f);//定义一个字节数组,相当于缓存,防止文件太大了,内存会不够用byte []bytes = new byte[1024];int n =0;//得到实际读取的字节数//循环读取while((n = fis.read(bytes)) != -1){//把字节转成StringString s = new String(bytes,0,n);System.out.println(s);}} catch (Exception e) {e.printStackTrace();}finally{try {fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
为什么要定义bytes数组呢?
这样就把大的文件,分批次读取了。防止内存不够用啊
从内存中写内容到文件
String filename = "aa.txt";String folder = "/Users/chenwen/Desktop/test/";File f = new File(folder + filename);FileOutputStream fos = null;try {fos = new FileOutputStream(f);String s = "啦啦啦啦啦啊7787878\r\n";//注意换行String s1 = "jkjk7787878";//把String转换成bytefos.write(s.getBytes());fos.write(s1.getBytes());} catch (Exception e) {}finally{try {fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
图片copy
package copyPics;
import java.io.*;public class CopyPictures {public static void main(String[] args) {//先把图片读入到内存。再写入到某文件//因为是二进制文件,因此只能用字节流完成//输入流、输出流(之前的写法也可以改成这样写)FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream("/Users/chenwen/Desktop/a.gif");fos = new FileOutputStream("/Users/chenwen/Desktop/test/b.gif");byte []b = new byte[1024];int n = 0;while((n =fis.read(b)) != -1){fos.write(b);}} catch (Exception e) {}finally{try {fos.close();fis.close();} catch (IOException e) {e.printStackTrace();}}}
}
文件字符流
虽然效率比字节字符流快一点,但是,很局限,只能读取字符类的文件。
package 字符流;
import java.io.*;
public class CharStream {public static void main(String[] args) {//字节流FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("/Users/chenwen/Desktop/test/aa.txt");fw = new FileWriter("/Users/chenwen/Desktop/test/bb.txt");char c[] = new char[1024];int n = 0;while((n = fr.read(c))!=-1){String s = new String(c, 0, n);fw.write(s);}} catch (Exception e) {}finally{try {fr.close();fw.close();} catch (IOException e) {e.printStackTrace();}}}
}
缓冲字符流
这个效率高,而且可以一行一行读取
package 字符流;
import java.io.*;
public class CharStream {public static void main(String[] args) {//字节流BufferedReader br = null;BufferedWriter bw = null;try {FileReader fr = new FileReader("/Users/chenwen/Desktop/test/aa.txt");FileWriter fw = new FileWriter("/Users/chenwen/Desktop/test/cc.txt");br = new BufferedReader(fr);bw = new BufferedWriter(fw);String s = "";while((s = br.readLine()) != null){ bw.write(s+"\r\n");}} catch (Exception e) {}finally{try {br.close();bw.close();} catch (IOException e) {e.printStackTrace();}}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
