黑马程序员_JAVA_IO(一)
来源:互联网 发布:vb中的对象 编辑:程序博客网 时间:2024/05/01 08:22
一、IO流概述
特点:
1、IO流用来处理设备间的数据传输。
2、Java对数据的操作是通过流的方式。
3、Java用于操作流的对象都在IO包中。
4、流按操作数据分为两种:字节流和字符流。
5、流按流向分为:输入流和输出流。
常用基类:
1、字节流的抽象基流:InputStream和OutputStream
2、字符流的抽象基流:Reader和Writer
字符流与字节流:
1、字符流中的对象融合了编码表。使用的是默认的编码,即当前系统的编码。
2、字符流只用于处理文字数据,而字节流可以处理媒体数据。
注意:此四个类派生出来的子类名称都是以父类名作为子类名的后缀,以前缀为其功能;如:FileInputStream,FileOutputStream和FileReader,FileWriter;流只能操作数据,而不能操作文件。
二、字符流操作
FileWriter类:
1、创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件。且该目录下如果已有同名文件,则同名文件将被覆盖。其实该步就是在明确数据要存放的目的地。
2、调用write(String s)方法,将字符串写入到流中。
3、调用flush()方法,刷新该流的缓冲,将数据刷新到目的地中。
4、调用close()方法,关闭流资源。但是关闭前会刷新一次内部的缓冲数据,并将数据刷新到目的地中。
注意:
1、其实java自身不能写入数据,而是调用系统内部方式完成数据的书写,使用系统资源后,一定要关闭资源。
2、文件的数据的续写是通过构造函数 FileWriter(Strings,boolean append),在创建对象时,传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。(windows系统中的文件内换行用\r\n两个转义字符表示,在linux系统中只用\n表示换行)
3、由于在创建对象时,需要指定创建文件位置,如果指定的位置不存在,就会发生IOException异常。
import java.io.FileWriter;import java.io.IOException;class FileWriterDemo {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("demo.txt");fw.write("abcde");// fw.flush();fw.close();}}
FileReader类:
1、创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件已经存在,若不存在,将会发生异常
2、调用读取流对象的read()方法。
3、读取后要调用close方法将流资源关闭。
import java.io.FileReader;import java.io.IOException;class FileReaderDemo {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("demo.java");// 创建FileReader流对象char[] buf = new char[1024]; // 创建一个缓冲区int num = 0;while ((num = fr.read(buf)) != -1) { // 循环读取文件,读到文件末尾则返回-1System.out.print(new String(buf, 0, num)); // 打印读取的内容}fr.close(); // 关闭资源}}
1、缓冲区的出现:提高了流的读写效率,所以在缓冲区创建前,要先创建流对象。即先将流对象初始化到构造函数中。
2、缓冲技术原理:此对象中封装了数组,将数据存入,再一次性取出。
字符流的缓冲区类: BufferedWrite, BufferedReader
缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强。
BufferedWrite提供了一个跨平台的换行方法,newLine();
BufferedReader提供了一个读一行的方法,readLine()不包含行终止符。当返回null是,表示已经读到了文件的末尾。
因为在BufferedReader和BufferedWrite中调用了相应的流对象,所以只需要关闭BufferedReader和BufferedWrite,释放资源。
//使用缓冲技术copy一个文本文件import java.io.*;class BufferedCopyDemo {public static void main(String[] args) {BufferedWriter bfw = null;BufferedReader bfr = null;try {// 创建写缓冲对象bfw = new BufferedWriter(new FileWriter("a.txt"));// 创建读缓冲对象bfr = new BufferedReader(new FileReader("b.java"));// 利用BufferedReader提供的readLine方法获取整行的有效字符。for (String line = null; (line = bfr.readLine()) != null;) {bfw.write(line);bfw.newLine();bfw.flush();// 将缓冲区数据刷到指定文件中}} catch (IOException e) {throw new RuntimeException("文件copy失败");} finally {if (bfw != null)try {bfw.close();// 关闭写入流} catch (IOException e) {throw new RuntimeException("写入流关闭失败");}if (bfr != null)try {bfr.close();// 关闭读取流} catch (IOException e) {throw new RuntimeException("读取流关闭失败");}}}}
import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;// 自定义BufferedReader类class MyBufferedReader {private FileReader fr;public MyBufferedReader(FileReader fr) {this.fr = fr;}public String readLine() throws IOException {StringBuilder sb = new StringBuilder();int ch = 0;while ((ch = fr.read()) != -1) {char c = (char) ch;if (c == '\r')continue;if (c == '\n')return sb.toString();elsesb.append((char) ch);}if (sb.length() != 0) {return sb.toString();}return null;}public void close() throws IOException {if (fr != null)fr.close();}}
LineNumberReader类:
void setLineNumber();//设置初始行号
int getLineNumber();//获取行号
import java.io.FileReader;import java.io.IOException;import java.io.LineNumberReader;class LineNumberReaderDemo {public static void main(String[] args) {LineNumberReader lnr = null;try {// 将读取流对象传入lnr = new LineNumberReader(new FileReader("a.java"));lnr.setLineNumber(100);// 设置开始行号for (String line = null; (line = lnr.readLine()) != null;) {System.out.println(lnr.getLineNumber() + ":" + line);// 打印每行行号和字符}} catch (IOException e) {throw new RuntimeException("读取数据失败");} finally {try {if (lnr != null)lnr.close();} catch (IOException e) {throw new RuntimeException("读取流关闭失败");}}}}
1、字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。
2、 因为字节流操作的是字节,即数据的最小单位,不需要像字符流一样要进行转换为字节。所以可直接将字节数据写入到指定文件中。
3、InputStream特有方法: int available();//返回文件中的字节个数
使用字节流复制图片实例:import java.io.*;class CopyPic {public static void main(String[] args) {byteArrayCopy();}// 使用读数组方式进行复制public static void byteArrayCopy() {FileInputStream fis = null;FileOutputStream fos = null;try {// 关联要复制的文件fis = new FileInputStream("1.jpg");// 指定复制的路径fos = new FileOutputStream("2.jpg");// 利用数组的读取方式byte[] b = new byte[1024];int len = 0;while ((len = fis.read(b)) != -1)// 复制文件的全部数据{fos.write(b, 0, len);// 粘贴到指定路径}} catch (IOException e) {throw new RuntimeException("图片复制失败");} finally {try {if (fis != null)fis.close();// 关闭输入字节流} catch (IOException e) {throw new RuntimeException("读取字节流关闭失败");}try {if (fos != null)fos.close();// 关闭输出字节流} catch (IOException e) {throw new RuntimeException("写入字节流关闭失败");}}}}
BufferedInputStream、BufferedOutputStream
其原理与BufferedReader、BufferedWriter基本相同
自定义BufferedInputStream:import java.io.IOException;import java.io.InputStream;public class MyBufferedInputStreamDemo {private InputStream in;private byte[] buf = new byte[1024];private int count = 0, pos = 0;public MyBufferedInputStreamDemo(InputStream in) {this.in = in;}/* * 注意:为什么不返回byte类型而返回int类型 * 因为byte类型出现11111111时的值为-1,不利于判断, * 而转换为int类型时则又会出现32个1的情况. * 所以结果的最后byte要和255相与 */public int myRead() throws IOException {if (count == 0) {count = in.read(buf);if(count < 0){return -1;}byte b = buf[pos];count--;pos++;return b & 255;} else if (count > 0) {byte b = buf[pos];count--;pos++;return b & 0xff;}else{return -1;}}}
六、键盘录入和转换流的应用
1、标准输入输出流
System.in:对应的标准输入设备,键盘。类型是InputStream。
Ssytem.out:对应的是标准的输出设备,控制台。是PrintStream,FilterOutputStream的子类。
转换流
转换流的由来:
a、字符流与字节流之间的桥梁
b、方便了字符流与字节流之间的操作
转换流的应用:
字节流中的数据都是字符时,转成字符流操作更高效。在使用转换流时可以指定字符编码
1、 InputStreamReader将字节流通向字符流
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
2、OutputStreamWriter字符流通向字节流
BufferedWriterout= new BufferedWriter(new OutputStreamWriter(System.out));
import java.io.*;class TransStreamDemo {public static void main(String[] args) throws IOException {// 键盘录入最常见写法BufferedReader in = new BufferedReader(new InputStreamReader(System.in));// 字符流通向字节流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));String s = null;while ((s = in.readLine()) != null) {if ("over".equals(s))break;bw.write(s.toUpperCase());// 写入数据bw.newLine();// 换行bw.flush();// 刷新}bw.close();// 关闭流资源in.close();}}
改变标准输入输出设备
System.setIn(InputStream in);// 改变标准输入设备
System.setOut(PrintStream p);// 改变标准输出设备
import java.io.*;import java.text.*;import java.util.*;// 异常的日志信息class ExceptionInfo {public static void main(String[] args) {try {int[] arr = new int[2];System.out.println(arr[3]);} catch (Exception e) {try {Date d = new Date();// 创建时间对象// 时间模块格式对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String s = sdf.format(d);PrintStream ps = new PrintStream("info.log");// 打印流对象System.setOut(ps);// 修改输出流设备ps.println(s);// 输出时间} catch (IOException ex) {throw new RuntimeException("文件创建失败");}e.printStackTrace(System.out);// 将异常信息输出指定输出流}}}
import java.util.*;import java.io.*;//将系统属性信息保存到指定文本中class SystemInfo {public static void main(String[] args) {PrintStream ps = null;try {// 获取系统信息:Properties pop = System.getProperties();// 创建输出流对象,将输出流中数据存入指定文件中ps = new PrintStream("systeminfo.txt");// 将属性列表输出到指定的输出流pop.list(ps);} catch (Exception e) {throw new RuntimeException("获取系统信息失败。");}}}
- 黑马程序员_JAVA_IO(一)
- 黑马程序员_Java_IO流(一)
- 黑马程序员_Java_IO流(一)
- 黑马程序员_Java_IO流(一)
- 黑马程序员_JAVA_IO(二)
- 黑马程序员_JAVA_IO(三)
- 黑马程序员_java_IO流总结(上)
- 黑马程序员_Java_IO
- 黑马程序员_java_IO流
- 黑马程序员_java_io(上)
- 黑马程序员_java_io(中)
- 黑马程序员_java_io(下)
- 黑马程序员_java_IO
- 黑马程序员_java_IO流
- 黑马程序员_java_IO流
- 黑马程序员_Java_IO流(二)
- 黑马程序员_JAVA_IO流1
- 黑马程序员_JAVA_IO流2
- qt plugin
- ios中对于tabBar选中图片设置的问题
- 第13周项目4数组的排序
- 用C语言编写一个随机点名系统
- KeychainItemWrapper的使用
- 黑马程序员_JAVA_IO(一)
- 超长整数的基础运算 算法实现之进制转换篇
- 1
- hdu 5009 Paint Pearls
- MySQL存储引擎比较
- POJ 3122 二分法 用于数值计算
- 协同过滤算法简析
- HDOJ-1827-Summer Holiday 解题报告
- hybris介绍