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

java中的IO整理(3)----数据操作流---合并流--压缩流--输入输出重定向 - 老秋的日志 - 网易博客

2012-02-27 21:06 519 查看
java中的IO整理(3)----数据操作流---合并流--压缩流--输入输出重定向 - 老秋的日志 - 网易博客

java中的IO整理(3)----数据操作流---合并流--压缩流--输入输出重定向 - 老秋的日志 - 网易博客

输入输出重定向

01 import java.io.File;

02 import java.io.FileNotFoundException;

03 import java.io.FileOutputStream;

04 import java.io.PrintStream;

05

06 /**

07 * 为System.out.println()重定向输出

08 * */

09 public class systemDemo{

10 public static void main(String[] args){

11 // 此刻直接输出到屏幕

12 System.out.println("hello");

13 File file = new File("d:" + File.separator + "hello.txt");

14 try{

15 System.setOut(new PrintStream(new FileOutputStream(file)));

16 }catch(FileNotFoundException e){

17 e.printStackTrace();

18 }

19 System.out.println("这些内容在文件中才能看到哦!");

20 }

21 }

【运行结果】:

eclipse的控制台输出的是hello。然后当我们查看d盘下面的hello.txt文件的时候,会在里面看到:这些内容在文件中才能看到哦!

01 import java.io.File;

02 import java.io.FileNotFoundException;

03 import java.io.FileOutputStream;

04 import java.io.PrintStream;

05

06 /**

07 * System.err重定向 这个例子也提示我们可以使用这种方法保存错误信息

08 * */

09 public class systemErr{

10 public static void main(String[] args){

11 File file = new File("d:" + File.separator + "hello.txt");

12 System.err.println("这些在控制台输出");

13 try{

14 System.setErr(new PrintStream(new FileOutputStream(file)));

15 }catch(FileNotFoundException e){

16 e.printStackTrace();

17 }

18 System.err.println("这些在文件中才能看到哦!");

19 }

20 }

【运行结果】:

你会在eclipse的控制台看到红色的输出:“这些在控制台输出”,然后在d盘下面的hello.txt中会看到:这些在文件中才能看到哦!

01 import java.io.File;

02 import java.io.FileInputStream;

03 import java.io.FileNotFoundException;

04 import java.io.IOException;

05

06 /**

07 * System.in重定向

08 * */

09 public class systemIn{

10 public static void main(String[] args){

11 File file = new File("d:" + File.separator + "hello.txt");

12 if(!file.exists()){

13 return;

14 }else{

15 try{

16 System.setIn(new FileInputStream(file));

17 }catch(FileNotFoundException e){

18 e.printStackTrace();

19 }

20 byte[] bytes = new byte[1024];

21 int len = ;

22 try{

23 len = System.in.read(bytes);

24 }catch(IOException e){

25 e.printStackTrace();

26 }

27 System.out.println("读入的内容为:" + new String(bytes, , len));

28 }

29 }

30 }

【运行结果】:

前提是我的d盘下面的hello.txt中的内容是:“这些文件中的内容哦!”,然后运行程序,输出的结果为:读入的内容为:这些文件中的内容哦!

BufferedReader的小例子

注意: BufferedReader只能接受字符流的缓冲区,因为每一个中文需要占据两个字节,所以需要将System.in这个字节输入流变为字符输入流,采用:

BufferedReader buf = new BufferedReader(

new InputStreamReader(System.in));

下面给一个实例:

01 import java.io.BufferedReader;

02 import java.io.IOException;

03 import java.io.InputStreamReader;

04

05 /**

06 * 使用缓冲区从键盘上读入内容

07 * */

08 public class BufferedReaderDemo{

09 public static void main(String[] args){

10 BufferedReader buf = new BufferedReader(

11 new InputStreamReader(System.in));

12 String str = null;

13 System.out.println("请输入内容");

14 try{

15 str = buf.readLine();

16 }catch(IOException e){

17 e.printStackTrace();

18 }

19 System.out.println("你输入的内容是:" + str);

20 }

21 }

运行结果:

请输入内容

dasdas

你输入的内容是:dasdas

Scanner类

其实我们比较常用的是采用Scanner类来进行数据输入,下面来给一个Scanner的例子吧

01 import java.util.Scanner;

02

03 /**

04 * Scanner的小例子,从键盘读数据

05 * */

06 public class ScannerDemo{

07 public static void main(String[] args){

08 Scanner sca = new Scanner(System.in);

09 // 读一个整数

10 int temp = sca.nextInt();

11 System.out.println(temp);

12 //读取浮点数

13 float flo=sca.nextFloat();

14 System.out.println(flo);

15 //读取字符

16 //...等等的,都是一些太基础的,就不师范了。

17 }

18 }

其实Scanner可以接受任何的输入流

下面给一个使用Scanner类从文件中读出内容

01 import java.io.File;

02 import java.io.FileNotFoundException;

03 import java.util.Scanner;

04

05 /**

06 * Scanner的小例子,从文件中读内容

07 * */

08 public class ScannerDemo{

09 public static void main(String[] args){

10

11 File file = new File("d:" + File.separator + "hello.txt");

12 Scanner sca = null;

13 try{

14 sca = new Scanner(file);

15 }catch(FileNotFoundException e){

16 e.printStackTrace();

17 }

18 String str = sca.next();

19 System.out.println("从文件中读取的内容是:" + str);

20 }

21 }

【运行结果】:

从文件中读取的内容是:这些文件中的内容哦!

数据操作流DataOutputStream、DataInputStream类

01 import java.io.DataOutputStream;

02 import java.io.File;

03 import java.io.FileOutputStream;

04 import java.io.IOException;

05

06 public class DataOutputStreamDemo{

07 public static void main(String[] args) throws IOException{

08 File file = new File("d:" + File.separator + "hello.txt");

09 char[] ch = { 'A', 'B', 'C' };

10 DataOutputStream out = null;

11 out = new DataOutputStream(new FileOutputStream(file));

12 for(char temp : ch){

13 out.writeChar(temp);

14 }

15 out.close();

16 }

17 }

A B C

现在我们在上面例子的基础上,使用DataInputStream读出内容

01 import java.io.DataInputStream;

02 import java.io.File;

03 import java.io.FileInputStream;

04 import java.io.IOException;

05

06 public class DataOutputStreamDemo{

07 public static void main(String[] args) throws IOException{

08 File file = new File("d:" + File.separator + "hello.txt");

09 DataInputStream input = new DataInputStream(new FileInputStream(file));

10 char[] ch = new char[10];

11 int count = ;

12 char temp;

13 while((temp = input.readChar()) != 'C'){

14 ch[count++] = temp;

15 }

16 System.out.println(ch);

17 }

18 }

【运行结果】:

AB

合并流 SequenceInputStream

SequenceInputStream主要用来将2个流合并在一起,比如将两个txt中的内容合并为另外一个txt。下面给出一个实例:

01 import java.io.File;

02 import java.io.FileInputStream;

03 import java.io.FileOutputStream;

04 import java.io.IOException;

05 import java.io.InputStream;

06 import java.io.OutputStream;

07 import java.io.SequenceInputStream;

08

09 /**

10 * 将两个文本文件合并为另外一个文本文件

11 * */

12 public class SequenceInputStreamDemo{

13 public static void main(String[] args) throws IOException{

14 File file1 = new File("d:" + File.separator + "hello1.txt");

15 File file2 = new File("d:" + File.separator + "hello2.txt");

16 File file3 = new File("d:" + File.separator + "hello.txt");

17 InputStream input1 = new FileInputStream(file1);

18 InputStream input2 = new FileInputStream(file2);

19 OutputStream output = new FileOutputStream(file3);

20 // 合并流

21 SequenceInputStream sis = new SequenceInputStream(input1, input2);

22 int temp = ;

23 while((temp = sis.read()) != -1){

24 output.write(temp);

25 }

26 input1.close();

27 input2.close();

28 output.close();

29 sis.close();

30 }

31 }

【运行结果】

结果会在hello.txt文件中包含hello1.txt和hello2.txt文件中的内容。

文件压缩 ZipOutputStream类

先举一个压缩单个文件的例子吧:

01 import java.io.File;

02 import java.io.FileInputStream;

03 import java.io.FileOutputStream;

04 import java.io.IOException;

05 import java.io.InputStream;

06 import java.util.zip.ZipEntry;

07 import java.util.zip.ZipOutputStream;

08

09 public class ZipOutputStreamDemo1{

10 public static void main(String[] args) throws IOException{

11 File file = new File("d:" + File.separator + "hello.txt");

12 File zipFile = new File("d:" + File.separator + "hello.zip");

13 InputStream input = new FileInputStream(file);

14 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(

15 zipFile));

16 zipOut.putNextEntry(new ZipEntry(file.getName()));

17 // 设置注释

18 zipOut.setComment("hello");

19 int temp = ;

20 while((temp = input.read()) != -1){

21 zipOut.write(temp);

22 }

23 input.close();

24 zipOut.close();

25 }

26 }

【运行结果】

运行结果之前,我创建了一个hello.txt的文件,原本大小56个字节,但是压缩之后产生hello.zip之后,居然变成了175个字节,有点搞不懂。

不过结果肯定是正确的,我只是提出我的一个疑问而已。

上面的这个例子测试的是压缩单个文件,下面的们来看看如何压缩多个文件。

01 import java.io.File;

02 import java.io.FileInputStream;

03 import java.io.FileOutputStream;

04 import java.io.IOException;

05 import java.io.InputStream;

06 import java.util.zip.ZipEntry;

07 import java.util.zip.ZipOutputStream;

08

09 /**

10 * 一次性压缩多个文件

11 * */

12 public class ZipOutputStreamDemo2{

13 public static void main(String[] args) throws IOException{

14 // 要被压缩的文件夹

15 File file = new File("d:" + File.separator + "temp");

16 File zipFile = new File("d:" + File.separator + "zipFile.zip");

17 InputStream input = null;

18 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(

19 zipFile));

20 zipOut.setComment("hello");

21 if(file.isDirectory()){

22 File[] files = file.listFiles();

23 for(int i = ; i < files.length; ++i){

24 input = new FileInputStream(files[i]);

25 zipOut.putNextEntry(new ZipEntry(file.getName()

26 + File.separator + files[i].getName()));

27 int temp = ;

28 while((temp = input.read()) != -1){

29 zipOut.write(temp);

30 }

31 input.close();

32 }

33 }

34 zipOut.close();

35 }

36 }

【运行结果】

先看看要被压缩的文件吧:

接下来看看压缩之后的:

大家自然想到,既然能压缩,自然能解压缩,在谈解压缩之前,我们会用到一个ZipFile类,先给一个这个例子吧。java中的每一个压缩文件都是可以使用ZipFile来进行表示的

01 import java.io.File;

02 import java.io.IOException;

03 import java.util.zip.ZipFile;

04

05 /**

06 * ZipFile演示

07 * */

08 public class ZipFileDemo{

09 public static void main(String[] args) throws IOException{

10 File file = new File("d:" + File.separator + "hello.zip");

11 ZipFile zipFile = new ZipFile(file);

12 System.out.println("压缩文件的名称为:" + zipFile.getName());

13 }

14 }

【运行结果】:

压缩文件的名称为:d:\hello.zip

现在我们呢是时候来看看如何加压缩文件了,和之前一样,先让我们来解压单个压缩文件(也就是压缩文件中只有一个文件的情况),我们采用前面的例子产生的压缩文件hello.zip

01 import java.io.File;

02 import java.io.FileOutputStream;

03 import java.io.IOException;

04 import java.io.InputStream;

05 import java.io.OutputStream;

06 import java.util.zip.ZipEntry;

07 import java.util.zip.ZipFile;

08

09 /**

10 * 解压缩文件(压缩文件中只有一个文件的情况)

11 * */

12 public class ZipFileDemo2{

13 public static void main(String[] args) throws IOException{

14 File file = new File("d:" + File.separator + "hello.zip");

15 File outFile = new File("d:" + File.separator + "unZipFile.txt");

16 ZipFile zipFile = new ZipFile(file);

17 ZipEntry entry = zipFile.getEntry("hello.txt");

18 InputStream input = zipFile.getInputStream(entry);

19 OutputStream output = new FileOutputStream(outFile);

20 int temp = ;

21 while((temp = input.read()) != -1){

22 output.write(temp);

23 }

24 input.close();

25 output.close();

26 }

27 }

【运行结果】:

解压缩之前:

这个压缩文件还是175字节

解压之后产生:

又回到了56字节,表示郁闷。

现在让我们来解压一个压缩文件中包含多个文件的情况吧

ZipInputStream类

当我们需要解压缩多个文件的时候,ZipEntry就无法使用了,如果想操作更加复杂的压缩文件,我们就必须使用ZipInputStream类

01 import java.io.File;

02 import java.io.FileInputStream;

03 import java.io.FileOutputStream;

04 import java.io.IOException;

05 import java.io.InputStream;

06 import java.io.OutputStream;

07 import java.util.zip.ZipEntry;

08 import java.util.zip.ZipFile;

09 import java.util.zip.ZipInputStream;

10

11 /**

12 * 解压缩一个压缩文件中包含多个文件的情况

13 * */

14 public class ZipFileDemo3{

15 public static void main(String[] args) throws IOException{

16 File file = new File("d:" + File.separator + "zipFile.zip");

17 File outFile = null;

18 ZipFile zipFile = new ZipFile(file);

19 ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file));

20 ZipEntry entry = null;

21 InputStream input = null;

22 OutputStream output = null;

23 while((entry = zipInput.getNextEntry()) != null){

24 System.out.println("解压缩" + entry.getName() + "文件");

25 outFile = new File("d:" + File.separator + entry.getName());

26 if(!outFile.getParentFile().exists()){

27 outFile.getParentFile().mkdir();

28 }

29 if(!outFile.exists()){

30 outFile.createNewFile();

31 }

32 input = zipFile.getInputStream(entry);

33 output = new FileOutputStream(outFile);

34 int temp = ;

35 while((temp = input.read()) != -1){

36 output.write(temp);

37 }

38 input.close();

39 output.close();

40 }

41 }

42 }

【运行结果】:

被解压的文件:

解压之后再D盘下会出现一个temp文件夹,里面内容:

PushBackInputStream回退流

01 import java.io.ByteArrayInputStream;

02 import java.io.IOException;

03 import java.io.PushbackInputStream;

04

05 /**

06 * 回退流操作

07 * */

08 public class PushBackInputStreamDemo{

09 public static void main(String[] args) throws IOException{

10 String str = "hello,rollenholt";

11 PushbackInputStream push = null;

12 ByteArrayInputStream bat = null;

13 bat = new ByteArrayInputStream(str.getBytes());

14 push = new PushbackInputStream(bat);

15 int temp = ;

16 while((temp = push.read()) != -1){

17 if(temp == ','){

18 push.unread(temp);

19 temp = push.read();

20 System.out.print("(回退" + (char) temp + ") ");

21 }else{

22 System.out.print((char) temp);

23 }

24 }

25 }

26 }

【运行结果】:

hello(回退,) rollenholt

1 /**

2 * 取得本地的默认编码

3 * */

4 public class CharSetDemo{

5 public static void main(String[] args){

6 System.out.println("系统默认编码为:" + System.getProperty("file.encoding"));

7 }

8 }

【运行结果】:

系统默认编码为:GBK

乱码的产生:

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

/**

* 乱码的产生

* */

public class CharSetDemo2{

public static void main(String[] args) throws IOException{

File file = new File("d:" + File.separator + "hello.txt");

OutputStream out = new FileOutputStream(file);

byte[] bytes = "你好".getBytes("ISO8859-1");

out.write(bytes);

out.close();

}

}

【运行结果】:

??

一般情况下产生乱码,都是由于编码不一致的问题。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: