java文件复制用什么流?java 输入输出流的复制文件的问题
大家好,java文件复制用什么流相信很多的网友都不是很明白,包括java 输入输出流的复制文件的问题也是一样,不过没有关系,接下来就来为大家分享关于java文件复制用什么流和java 输入输出流的复制文件的问题的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
java我用流来复制文件可是老是拒绝访问怎么回事
兄弟,首先window环境下文件目录是不能用Java流来读取的,目录是使用mkdir或者mkdirs方法创建的。
第二你复制的时候BufferedInputStream的read()()每次是读取一个字节,你用int来接收,这样会隐式转型成4个字节,复制的文件会不对。
第三文件读取的截至调试是返回的-1,不是 1,也不是0
第四当然能正确关闭流这是对的,但是缓存流关闭流的时候,并没有关闭FileInputStream和FileOutputStream,所以建议在关闭缓存流之前先关闭掉FileInputStream和FileOutputStream。
文件复制我是这么写的:
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MyFile extends File{
private List<MyFile> childFiles;
public MyFile(String pathname){
super(pathname);
}
public MyFile(File file){
super(file.getAbsolutePath());
}
public List<MyFile> getChildFiles(){
return childFiles;
}
public void setChildFiles(List<MyFile> childFiles){
this.childFiles= childFiles;
}
}
------------------------------------------------------------------------------
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
public class TestFile{
@Test
public void fileTest(){
MyFile myFile= new MyFile("D:\\迅雷下载");
getAllChildFiles(myFile);
printFile(myFile);
}
@Test
public void copyFileTest(){
MyFile srcFile= new MyFile("D:\\迅雷下载\\activiti-6.0.0");
MyFile targetFile= new MyFile("D:\\迅雷下载\\activiti-6.0.1");
try{
getAllChildFiles(srcFile);
copyFile(srcFile,targetFile);
} catch(Exception e){
e.printStackTrace();
}
}
public void getAllChildFiles(MyFile myFile){
myFile.setWritable(true,true);
File[] files= myFile.listFiles();
List<MyFile> childFiles= new ArrayList<MyFile>();
for(File file: files){
MyFile mf= new MyFile(file);
childFiles.add(mf);
if(mf.isDirectory()){
getAllChildFiles(mf);
}
}
myFile.setChildFiles(childFiles);
}
public void printFile(MyFile myFile){
System.out.println(myFile.getAbsolutePath());
System.out.println("====>"+myFile.getName());
List<MyFile> childFiles= myFile.getChildFiles();
if(childFiles!= null&& childFiles.size()> 0){
for(MyFile mf: childFiles){
printFile(mf);
}
}
}
public void copyFile(MyFile srcFile,MyFile targetFile) throws Exception{
if(srcFile.isDirectory()){
targetFile.mkdirs();
}else{
FileInputStream fis= new FileInputStream(srcFile);
FileOutputStream fos= new FileOutputStream(targetFile);
byte[] buffer= new byte[1024];
int len= 0;
while((len= fis.read(buffer))!=-1){
fos.write(buffer,0,len);
}
fis.close();
fos.close();
}
List<MyFile> srcChildFiles= srcFile.getChildFiles();
List<MyFile> targetChidFiles= new ArrayList<MyFile>();
if(srcChildFiles!= null&& srcChildFiles.size()> 0){
for(MyFile srcf: srcChildFiles){
StringBuilder targFilePath= new StringBuilder(targetFile.getAbsolutePath());
targFilePath.append(MyFile.separator).append(srcf.getName());
System.out.println(targFilePath.toString());
MyFile targf= new MyFile(targFilePath.toString());
targetChidFiles.add(targf);
copyFile(srcf,targf);
}
}
targetFile.setChildFiles(targetChidFiles);
}
}
希望能帮助到你,谢谢!!
java 输入输出流的复制文件的问题
可以通过“BufferedReader”读取文件内容,之后通过OutputStreamWriter写入新文件,举例:
OutputStreamWriter pw= null;//定义一个流
pw= new OutputStreamWriter(new FileOutputStream(“D:/testCopy.txt”),"GBK");//确认流的输出文件和编码格式,此过程创建了“test.txt”
bre= new BufferedReader(new FileReader("D:/test.txt"));//此时获取到的bre就是整个文件的缓存流
while((str= bre.readLine())!= null)//判断最后一行不存在,为空结束循环
{
pw.write(str);//将要写入文件的内容,可以多次write
};
bre.close();//关闭流
pw.close();//关闭流
备注:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
java的几种IO流读取文件方式
一、超类:
字节流: InputStream(读入流) OutputStream(写出流)
字符流: Reader(字符读入流) Writer(字符写出流)
二、文件操作流
字节流: FileInputStream,FileOutputStream
字符流: FileReader, FileWriter(用法与字节流基本相同,不写)
//1.指定要读的文件目录及名称
File file=new File("文件路径");
//2.创建文件读入流对象
FileInputStream fis=new FileInputStream(file);
//3.定义结束标志,可用字节数组读取
int i=0;
while((i= fis.read())!=-1){
//i就是从文件中读取的字节,读完后返回-1
}
//4.关闭流
fis.close();
//5.处理异常
//1.指定要写到的文件目录及名称
File file=new File("文件路径");
//2.创建文件读入流对象
FileOutputStream fos=new FileOutputStream(file);
//3.定义结束标志
fos.write(要写出的字节或者字节数组);
//4.刷新和关闭流
fos.flush();
fos.close();
//5.处理异常
三、缓冲流:
字节缓冲流: BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader,BufferedWriter
缓冲流是对流的操作的功能的加强,提高了数据的读写效率。既然缓冲流是对流的功能和读写效率的加强和提高,所以在创建缓冲流的对象时应该要传入要加强的流对象。
//1.指定要读的文件目录及名称
File file=new File("文件路径");
//2.创建文件读入流对象
FileInputStream fis=new FileInputStream(file);
//3.创建缓冲流对象加强fis功能
BufferedInputStream bis=new BufferedInputStream(fis);
//4.定义结束标志,可用字节数组读取
int i=0;
while((i= bis.read())!=-1){
//i就是从文件中读取的字节,读完后返回-1
}
//5.关闭流
bis.close();
//6.处理异常
//1.指定要写到的文件目录及名称
File file=new File("文件路径");
//2.创建文件读入流对象
FileOutputStream fos=new FileOutputStream(file);
//3.创建缓冲流对象加强fos功能
BufferedOutputStream bos=new BufferedOutputStream(fos);
//4.向流中写入数据
bos.write(要写出的字节或者字节数组);
//5.刷新和关闭流
bos.flush();
bos.close();
//6.处理异常
四、对象流
ObjectInputStream,ObjectOutputStream
不同于以上两种类型的流这里只能用字节对对象进行操作原因可以看上篇的编码表比照原理
ObjectOutputStream对象的序列化:
将java程序中的对象写到本地磁盘里用ObjectOutputStream
eg:将Person类的对象序列化到磁盘
创建Person类
注1:此类要实现Serializable接口,此接口为标志性接口
注2:此类要有无参的构造函数
注3:一旦序列化此类不能再修改
class Person implements Serializable{
public Person(){}
}
2.创建对象流对象
注:要增强功能可以将传入文件缓冲流
ObjectOutputStream oos=new ObjectOutputStream(
new FileOutputStream(new File("文件路径")));
3.写入对象,一般会将对象用集合存储起来然后直接将集合写入文件
List<Person> list=new ArrayList<>();
list.add(new Person());
...(可以添加多个)
oos.writeObject(list);
4.关闭流,处理异常
oos.flush();
oos.close();
五、转换流:
这类流是用于将字符转换为字节输入输出,用于操作字符文件,属于字符流的子类,所以后缀为reader,writer;前缀inputstream,outputstream;
注:要传入字节流作为参赛
InputStreamReader:字符转换输出流
OutputStreamWriter:字符转换输入流
//1.获取键盘输入的字节流对象
inInputStream in=Stream.in;
/*2.用转换流将字节流对象转换为字符流对象,方便调用字符缓冲流的readeLine()方法*/
InputStreamReader isr=new InputStreamReader(in);
/*5.创建字符转换输出流对象osw,方便把输入的字符流转换为字节输出到本地文件。*/
OutputStreamWriter osw=new OutputStreamWriter(new
FileOutputStream(new File("文件名")));
/*3.现在isr是字符流,可以作为参数传入字符缓冲流中*/
BufferedReader br=new BufferedReader(isr);
/*4.可以调用字符缓冲流br的readLine()方法度一行输入文本*/
String line=null;
while((line=br.readLine()){
osw.write(line);//osw是字符流对象,可以直接操作字符串
}
注:InputStreamReader isr=new InputStreamReader(new"各种类型的字节输入流都行即是:后缀为InputStream就行");
OutputStreamWriter osw=new OutputStreamWriter(new
"后缀为OutputStream就行");
六、区别记忆
1.对象流是可以读写几乎所有类型的只要是对象就行,而字节字符流,只能读写单个字节字符或者字节字符数组,以上没有读写字节字符数组的;注意对象流只有字节流!
2.字符和字节循环读入的结束条件int i=0;(i=fis.read())!=-1
用字符数组复制文件(fr读入流,fw写出流),字节流也是相同的用法
int i= 0; char[] c= new char[1024];
while((i= fr.reade())!=-1)){
fw.write(c,0,i);
}
123456
3.对象流里面套缓冲流的情景:
new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File(“文件路径”))));
4.记忆流及其功能的方法:
前缀表示功能,后缀表示流的类型;
比如说FileInputStream前缀:File,表示操作的磁盘,后缀:intputstream,表示是字节输入流。
同理 FileReader:表示操作文件的字符流
ObjectInputStream:操作对象的字节输入流
5.拓展:获取键盘输入的字符的缓冲流的写法:
new BufferedReader(new InputStreamReader(System.in)));
将字节以字符形式输出到控制台的字符缓冲流的写法:
new BufferedWriter( new OutputStreamWriter(System.out))
OK,关于java文件复制用什么流和java 输入输出流的复制文件的问题的内容到此结束了,希望对大家有所帮助。