黑马程序员——Java基础——IO(二)
2015-07-29 17:49
651 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、字节流
1.读取和输出字节
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:字符到字节的桥梁,编码。
从上面这个例子可以看出,编码表是指定在转换流的构造函数中,而且编码和解码使用的码表不同会出现错误
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();
}
}
一、字节流
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();
}
}
相关文章推荐
- Android面试题
- 面试题:谈谈如何优化MYSQL数据库查询
- 【剑指Offer面试题】 九度OJ1514:数值的整数次方
- 程序员如何爱护自己的眼睛
- 黑马程序员——高新技术---Java基础-反射
- 黑马程序员——java基础语法总汇关键字、常量、变量、语句、函数、数组
- 剑指offer面试题14——调整数组顺序使奇数位于偶数前面
- 软件测试面试题-简答题
- 职场中规则
- (剑指Offer)面试题43:n个骰子的点数
- 常见面试题
- 8种影响职场生涯的负面情绪
- OO六大设计原则总结(上层码农必会)
- 剑指offer面试题13——在O(1)时间删除链表结点
- 为什么程序员在办公室工作会趋向死亡?
- 面试题31——连续子数组的最大和
- 黑马程序员——Java基础——异常体系
- 面试题30——最小的k个数
- 黑马程序员--反射Reflect
- 关于java子类重写的一道面试题