您的位置:首页 > 编程语言 > Java开发

韩顺平 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 文件流 io