您的位置:首页 > 职场人生

黑马程序员——Java基础——IO(二)

2015-07-29 17:49 651 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、字节流

1.读取和输出字节





import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamDemo {

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub

output();
System.out.println("第一种读取方法————");
input_1();
System.out.println("第二种读取方法————");
input_2();
System.out.println("第三种读取方法————");
input_3();
}

public static void output() throws IOException
{
//创建字节输出流对象,并指定目的文件
FileOutputStream fos = new FileOutputStream("demo.txt");
//写数据到文件中
fos.write("output01".getBytes());
fos.close();
}
public static void input_1() throws IOException
{
//创建字节读取流对象,并与要读取的文件关联
FileInputStream fis = new FileInputStream("demo.txt");
//第一种读取方式,一次从输入流中读取一个字节数据
int num = 0 ;
while((num = fis.read()) != -1)
{
System.out.println((char)num);
}
fis.close();

}
public static void input_2() throws IOException
{
//创建字节读取流对象,并与要读取的文件关联
FileInputStream fis = new FileInputStream("demo.txt");
//第二种读取方式,创建一个字节数组,将读取到的字节存储到数组中
byte[] b = new byte[1024];
int len = 0 ;
while((len = fis.read(b)) != -1)
{
System.out.println(new String(b,0,len));
}
fis.close();

}
public static void input_3() throws IOException
{
//创建字节读取流对象,并与要读取的文件关联
FileInputStream fis = new FileInputStream("demo.txt");
//第三种读取方式,与第二种基本相同,只是不用自定义数组长度,使用available()方法
//返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
//如果要读取的文件太大,不建议使用此方法,因为会使内存溢出
byte[] b = new byte[fis.available()];
fis.read(b);
System.out.println(new String(b));
fis.close();

}
}






2.字节流缓冲区





通过字节流的缓冲区复制一个图像文件

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferStreamDemo {

public static void main(String[] args) {

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try
{
bis = new BufferedInputStream(new FileInputStream("1.gif"));
bos = new BufferedOutputStream(new FileOutputStream("2.gif"));
byte[] b = new byte[1024];
int num = 0 ;
while((num = bis.read(b)) != -1)
{
bos.write(b,0,num);
}

}
catch(IOException e)
{
e.printStackTrace();
}
finally
{
if(bis != null)
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
if(bos != null)
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

}




3.转换流

字节流中的数据都是字符时,转成字符流操作更高效;或者操作文本涉及到具体的指定编码表时,这就需要转换流。转换流是字符流与字节流之间的桥梁, 方便了字符流与字节流之间的操作。

InputStreamReader:字节到字符的桥梁,解码。



OutputStreamWriter:字符到字节的桥梁,编码。



import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public abstract class TransCodeDemo {

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
write();
read();
}

private static void write() throws IOException {

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("code.txt"),"GBK");
osw.write("转换流编码");
osw.close();
}

private static void read() throws IOException  {

InputStreamReader isr = new InputStreamReader(new FileInputStream("code.txt"),"utf-8");
char[] ch = new char[1024];
int len = 0 ;
while((len = isr.read(ch))!= -1)
{
System.out.println(new String(ch,0,len));
}
isr.close();
}

}






从上面这个例子可以看出,编码表是指定在转换流的构造函数中,而且编码和解码使用的码表不同会出现错误

4.流操作规律

1)明确源和目的

源:InputStream Reader

目的:OutputStream Writer

2)明确数据是否是纯文本数据

源:是纯文本:Reader 否:InputStream

目的:是纯文本:Writer 否:OutputStream 

到这里,就可以明确需求中具体要使用哪个体系。

3)明确具体的设备

源设备:

硬盘:File

键盘:System.in

内存:数组

网络:Socket流

目的设备:

硬盘:File

控制台:System.out

内存:数组

网络:Socket流

4)是否需要其他额外功能

是否需要高效(缓冲区):是,就加上buffer

通过一个示例运用这些规律完成需求

4000
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 将控制台输入的数据存入到一个txt文件中
* 1.明确源和目的
* 源:键盘
* 目的:文件
* 2.明确数据是否为纯文本文件
* 是,使用Reader和Writer
* 3.明确具体设备
* 源:键盘,System.in,使用转换流
* 目的:硬盘文件,File
* 4.是否需要其他额外功能
* 需要高效缓冲区:buffer
*
*/
public class TransStreamDemo {

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("demo.txt"));

String str = null ;
while((str = br.readLine())!= null)
{
if(str.equals("over"))
break;
bw.write(str);
bw.newLine();
bw.flush();
}

br.close();
bw.close();
}

}






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