PrintStream(字节打印流)方法写入:
String data="hello java";
PrintStream ps=new PrintStream("E:/1.txt"); //1.txt不管存不存在都会被创建/覆盖
start =System.currentTimeMillis();
ps.print(data);
ps.close(); //用完及时关闭流避免资源泄露
PrintStream写入方法方便,并且可以输出java中任何对象,但写入速度较慢。
常用的FileWriter:
String data="hello java";
FileWriter fw=new FileWriter(new File("E:/2.txt"));
fw.write(data);
fw.flush(); //FileWriter存在缓冲区,在最后要释放缓冲区的内容,避免还有数据停留在缓冲区里
fw.close();
//FileWriter还可以对原文件进行添加,只要在构造时多加个true为入参
FileWriter fw2=new FileWriter(new File("E:/2.txt"),true);
fw2.write(data); //这样就可以在原有的文件里添加内容了
fw2.flush();
fw2.close();
FileWriter带有缓冲区,能够减少流的使用,所有在多次写入数据的时候会有速度上的优势。
用BufferedWriter写入:
如果有非常多次的写入可以用BufferedWriter对FileWriter的缓冲区进行优化,BufferedWriter的缓冲区大小还可以进行自定义。
FileWriter fw=new FileWriter(new File("E:/3.txt")); //和之前一样新建FileWriter对象
BufferedWriter bw=new BufferedWriter(fw); //用BufferedWriter能比FileWriter更快的写入
bw.write(data);
bw.flush(); //同样最后要释放缓冲
bw.close();
//设置缓冲区大小
BufferedWriter bw2=new BufferedWriter(fw,1024); //在入参后多加个数字就是设置的大小啦
//缓冲区并不是越大越好,太大了写入速度不一定会变快,反而还占用了资源,一般用默认就够了。
Stream和File的区别
Stream流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。
常用API : 点击打开链接
1.FileReader : 字符流
BufferedReader : 也是字符流,但是在BufferedReader可以先把数据放到一个缓存区里,然后在进行处理,而且在BufferedReader 里有一个readLine()方法。
所谓缓冲区,就是能够一次性读取一块缓冲区大小的数据,再从缓冲区中去读取数据,而不用一点一点地直接从硬盘中抽取数据。
由java api 文档可知:
protected Reader() //创建一个新的字符流 reader,其重要部分将同步其自身的 reader。
protected Reader(Object lock) //创建一个新的字符流 reader,其重要部分将同步给定的对象。
也就是创建的 BufferedReader
(new Reader() ) 其中的 new Reader()
可以是 Reader
的任何子类都可以。比如 FileReader
> BufferedReader br=new BufferedReader(new FileReader(filepath));
2.BufferedWriter、FileWriter
/**
* 写入文件并换行
* @param file
* @param list
* @return
* @throws IOException
*/
public boolean writeToFile2(File file,List list) throws IOException{
BufferedWriter bw= new BufferedWriter(new FileWriter(file));
try{
for(int i=0;i<list.size();i++){
String s=list.get(i).toString();
bw.write(s);
bw.newLine();
System.out.println(s);
//bw.flush();
//bw.close();
}
bw.flush();
}catch(Exception e){
return false;
}
finally{
if(bw!=null){
bw.close();
}
}
return true;
}
@Test
public void test10(){
List list=new ArrayList();
String s="1,3,2,4,6";
String s1="1,3,100,4,6";
String s2="1,3,101,4,6";
String File="C:\\Users\\P1311529\\Desktop\\MOM04_GDC3_20171015_01.csv";
list.add(s);
list.add(s1);
list.add(s2);
System.out.println(list);
try {
System.out.println(writeToFile2(new File(File),list));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
FileOutputStream fos=new FileOutputStream(file,true);
PrintStream ps=new PrintStream(fos);
public boolean writeToFile(File file,List list) throws IOException{
for(int i=0;i<list.size();i++){
String s=list.get(i)+"\r\n";
FileOutputStream fos=new FileOutputStream(file,true);
PrintStream ps=new PrintStream(fos);
System.out.println(s);
ps.print(s);
ps.close();
}
return true;
}
3.字节流与字符流的区别:
字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?
- 字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
-
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
4.那开发中究竟用字节流好还是用字符流好呢?
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。
5.Java.io.File(File用于管理文件或目录; 所属套件:java.io)
- 构造函数:
File(java.lang.string 路径, java.lang.string 文件名)
说明:建立代表文件或目录的File对象。 -
canRead
方法:(boolean canRead())判断是否可读取 -
canWrite
方法:(boolean canWrite)判断是否可以写入 -
createNewFile
方法:(boolean createNewFile())说明:创建文件,成功返回TRUE,否则返回false -
delete
方法:(boolean delete())说明:删除文件或目录,成功返回TRUE,否则返回FALSE。 -
exist
方法:(boolean exist()) 说明:检查文件或目录是否存在。 -
getName
方法:(java.lang.string getName()) 说明:取得文件或目录的名称(只有文件的name)。 -
getPath
方法:(java.lang.string getPath()) 说明:取得文件或目录的名称(包括文件的name)。 -
lastModified
方法:(long lastModified()) 取出最后一次修改的时间。 -
length
方法:(int length())说明:取得文件的长度 -
listfiles
方法:(File[] listFiles()) 说明:取出该目录下的所有文件。 -
isDirectory
方法:(boolean isDirectory())说明:判断是否为文件。 -
isFile
方法:(boolean isFile) 说明:判断是否为文件。 -
isHidden
方法:( Boolean isHidden()) 说明:判断是否为隐藏文件。 -
mkdir
方法:(boolean mkdir)说明:创建目录,成功返回TRUE,否则返回FALSE
6. java.io.FileReader(FileReader 用于从文件中读取字符 ;所属套件:java.io)
-
构造函数(
FileReader (Java.lang.string 文件路径和名称)
说明:为要读取的文件建立一个FileReader
对 象) -
read
方法:
(1)int read()
说明:从文件读取一个字符,返回值为一整数,为读取得字符串的字符码,若返回值为-1,则代表已经读到文件的结尾。
(2)int read(char[] chararray,int startpos,int length)
说明:将从startpos开始,读取length字符,保存到chararray数组中,返回值是读取到的字数,如果返回-1,则代表已经读到文件的结尾。 -
skip
方法:(long skip(int 要略过的字符数)
说明:直接将文件读取指针向后移动数个字符,从而略过字符不读取);
引用:java File,FileReader,BufferedReader,BufferedWriter,FileWriter