韩顺平 java io编程
2015-10-14 17:38
1441 查看
文件流
文件在程序中是以流的形式来操作的。- 内存 –输出流–> 文件
- 内存 <–输入流– 文件
流:数据在数据源(文件)和程序(内存)之间经历的路径。
注意:以内存为参照物
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
文件流分类
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){ //把字节转成String String 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 block e.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转换成byte fos.write(s.getBytes()); fos.write(s1.getBytes()); } catch (Exception e) { }finally{ try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.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(); } } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统