java我用流来复制文件可是老是拒绝访问怎么回事

Python012

java我用流来复制文件可是老是拒绝访问怎么回事,第1张

兄弟,首先window环境下文件目录是不能用Java流来读取的,目录是使用mkdir或者mkdirs方法创建的。第二你复制的时候BufferedInputStream的read()() 每次是读取一个字节,你用int来接收,这样会隐式转型成4个字节,复制的文件会不对。第三文件读取的截至调试是返回的 -1 , 不是 1,也不是0第四当然能正确关闭流这是对的,但是缓存流关闭流的时候,并没有关闭FileInputStream和FileOutputStream,所以建议在关闭缓存流之前先关闭掉FileInputStream和FileOutputStream。文件复制我是这么写的:import java.io.Fileimport java.util.ArrayListimport java.util.Listpublic class MyFile extends File {private List<MyFile>childFilespublic 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.BufferedInputStreamimport java.io.Fileimport java.io.FileInputStreamimport java.io.FileNotFoundExceptionimport java.io.FileOutputStreamimport java.util.ArrayListimport java.util.Arraysimport java.util.Listimport org.junit.Testpublic class TestFile {@Testpublic void fileTest() {MyFile myFile = new MyFile("D:\\迅雷下载")getAllChildFiles(myFile)printFile(myFile)}@Testpublic 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 = 0while((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)}}希望能帮助到你,谢谢!!

File file=new File("E:\\1.txt")//创建文件对象,

FileInputStream fread //FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。

BufferedInputStream reader=null

BufferedOutputStream write=null //该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

try

{

fread = new FileInputStream(file)//将文件对象添加到文件的输入流,也就是你要从你的数据源开始读取数据

reader=new BufferedInputStream(fread)//将字节流对象添加到缓存区中,这样效率要高一点

String str=null//初始化字符串这样保存的是读取的一行的数据

write=new BufferedOutputStream(new FileOutputStream(new File("E:\\2.txt")))//创建的是输出流缓存 请要输出的目的地添加到缓存区中,

byte b[]=new byte[1024]//定义每次读取的字节的范围,也是存储数据的容器

int i=0

while((i=reader.read(b))!=-1) //下一个数据字节,如果到达流末尾,则返回 -1。

{

write.write(b)//开始写入数据

}

}

catch (FileNotFoundException e) //如果没有文件打印该异常

{

e.printStackTrace()

}

catch (IOException e) //如果出现io异常 也就处理异常

{

e.printStackTrace()

}

finally//最后不管读取还是没读取成功都释放资源

{

try

{

write.close()//关闭缓存区,关闭缓存区会自动关闭相应的io流

reader.close()

}

catch (IOException e)

{

e.printStackTrace()

}

}

可以通过“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方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。