java 中inputstream 和outputstream 怎么进行文件的读取写入的??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 中inputstream 和outputstream 怎么进行文件的读取写入的??相关的知识,希望对你有一定的参考价值。
你可以这样理解:FileInputStream in = new FileInputStream("E:\\a.zip");
FileInputStream 顾名思义,就是写入。这句话将a.zip做编码后放到in,要用a.zip的时候就使用in读出来。
FileOutputStream os = new FileOutputStream("e:\\b.zip");
FileOutputStream顾名思义,就是读出,读出的话就要指定读出的目的地,e:\\b.zip便是目的地。
while(in.read(bt) != -1)
os.write(bt);
这段代码就是从in中读出编码后的文件内容,然后通过os写入b.zip. 参考技术A 一个简单的文件复制的例子,从源文件中读取,写入目的文件
public static long forJava(File src,File dest) throws Exception
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(src); //建立读取流
FileOutputStream out=new FileOutputStream(dest); //建立写入流
byte[] buffer=new byte[length];
while(true)
int ins=in.read(buffer);
if(ins==-1)
in.close();
out.flush();
out.close();
return new Date().getTime()-time;
else
out.write(buffer,0,ins);
参考技术B try
FileInputStream in = new FileInputStream("E:\\a.zip");
FileOutputStream os = new FileOutputStream("e:\\b.zip");
byte[] bt = new byte[1024];
while(in.read(bt) != -1)
os.write(bt);
os.flush();
in.close();
os.close();
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
参考技术C int len=-1;
byte[] bt = new byte[2048]; //可以根据实际情况调整,建议使用1024,即每次读1KB
while(len=(in.read(bt)) != -1)
os.write(bt,0,len); //建议不要直接用os.write(bt)
os.flush();
in.close();
os.close();本回答被提问者和网友采纳
廖雪峰Java6 IO编程-2input和output-4Filter模式
1.JDK提供的InputStream分为两类:
- 直接提供数据的InputStream
* FileInputStream:从文件读取
* ServletInputStream:从HTTP请求读取数据
* Socket.getInputStream():从TCP连接读取数据 - 提供额外附加功能的FilterInputStream
* 如果要给FileInputStream添加缓冲功能:- BufferedFileInputStream extends FileInputStream
* 如果要给FileInputStream添加计算机签名的功能:
* DigestFileInputStream extends FileInputStream
* 如果要给FileInputStream添加加密/解密功能:
* CipherFileInputStream extends FileInputStream
- 组合功能而非继承的设计模式称为Filter模式(或者Decorator模式)
- 通过少量的类实现了各种功能的组合
//演示代码
InputStream input = new GZIPInputStream(//直接读取解压缩包的内容
new BufferedInputStream(//提供缓冲的功能
new FileInputStream("test.gz")));
廖雪峰示例中的CountInputStream有错误,当读取完毕后,返回-1,而count再读取完毕后,会减1,导致结果不一样。运行结果如下。只需要将count的初始值设置为1即可。
```#java
public class CountInputStream extends FilterInputStream {
int count=0;
public CountInputStream(InputStream in) {
super(in);
}
//重写read方法,使用count计数
public int read(byte[] b,int off,int len) throws IOException {
int n = super.read(b,off,len);
count += n;
System.out.println(count);
return n;//最后返回-1,count-1
}
}
```#java
public class Main {
static void printCount1(List<Integer> list) throws IOException{
try(InputStream input = new GZIPInputStream(
new BufferedInputStream(
new FileInputStream("./src/main/java/com/testList/test.gz")))){
byte[] buffer = new byte[1024];//创建竹筒
int count=0;
int n ;
while((n=input.read(buffer))!=-1){
count += n;
list.add(n);
}
System.out.println("直接读取的和:"+count);
System.out.println("直接读取得到的集合的和"+getSum(list));
}
}
static void printCount2(List<Integer> list) throws IOException{
try(CountInputStream input = new CountInputStream(
new GZIPInputStream(
new BufferedInputStream(
new FileInputStream("./src/main/java/com/testList/test.gz"))))){
byte[] buffer = new byte[1024];
int n;
while((n=input.read(buffer))!=-1){
list.add(n);
// System.out.println();
}
System.out.println("通过CountInputStream获取的和:"+input.count);
System.out.println("通过CountInputStream获取的集合的和:"+getSum(list));
}
}
static Integer getSum(List<Integer> list){
int sum = 0;
for(int i=0;i<list.size();i++){
sum += list.get(i);
}
return sum;
}
public static void main(String[] args) throws IOException {
List<Integer> list1 = new LinkedList<>();
List<Integer> list2 = new LinkedList<>();
printCount2(list2);
printCount1(list1);
//从结果
System.out.println(list1);
}
}
2.总结
- Java IO使用Filter模式为InputStream/OutputStream增加功能
- 可以把一个InputStream和任意FilterInputStream组合
- 可以把一个OutputStream和任意FilterOutputStream组合
- Filter模式可以在运行期动态增加功能(又成Decorator模式)
以上是关于java 中inputstream 和outputstream 怎么进行文件的读取写入的??的主要内容,如果未能解决你的问题,请参考以下文章
DataLine 和 (Output|Input)Stream 的区别?
IO流 InputStream 字节输入流和OutputStream 字节输出流 以及实例