Java I/O 输入/输出
流:
根据方向流分为:输入流和输出流
方向的定论是基于我们的程序。
流向我们程序的流叫做:输入流
从程序向外流的叫做:输出流
我们可以把流想象为管道。管道里流动的是水,而java中的流,流动的是字节。
输入流是用于获取数据的。输出流是用于向外输出数据的。
输入流是用于读取的,输出流是用于写出的。
java中
InputStream:该接口定义了输入流的特征
OutputStream:该接口定义了输出流的特征
流根据源头:
分为:基本流(低级流,节点流):有来源。
处理流(高级流,过滤流):没有数据来源。不能独立存在。它的存在是用于处理基本流的。
流根据处理的数据单位不同划分为:
字节流:Stream
字符流:Reader/Writer
用于读写文件的字节流FIS/FOS
FileInputStream:文件输入流
FileOutPutStream:文件输出流
FileOutputStream用于向文件中写入数据。
构造其实例可以使用
FileOutputStream(File file):
向file文件中写入数据。若该文件不存在,则会创建该文件。
package day02; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; /** * 文件字节输入流 * FileInputStream:用于读取内容的流 * @author Administrator * */ public class DemoFileInputStream { public static void main(String[] args) throws IOException { File file = new File("data.dat"); /** * 根据文件创建用于读取其数据的文件输入流 */ FileInputStream fis = new FileInputStream(file); // int b = fis.read(); int b = 0; while((b = fis.read())!=-1){ //输出这个字节的16进制形式 System.out.print(Integer.toHexString(b)+" "); } fis.close();//切记,流用完了要关闭! } }
package day02; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * IO工具类 * @author Administrator * */ public class IOUtils { /** * 读取给定的文件,并将数据已字节数组的形式返回 * @param src * @return * @throws IOException */ public static byte[] loadBytes(File src) throws IOException{ if(src==null){ throw new IllegalArgumentException("文件为空!"); } if(!src.exists()){ throw new IllegalArgumentException(src+"不存在!"); } FileInputStream fis = null;//创建文件输入流 try{ fis = new FileInputStream(src); // byte[] data = new byte[(int)src.length()]; /** * FileInputStream的available()方法: * 返回当前字节输入流可读取的总字节数 */ byte[] data = new byte[fis.available()]; fis.read(data); return data; }catch(IOException e){ throw e;//读取出现错误将异常抛给调用者解决 }finally{ if(fis!=null){ fis.close(); } } } }
package day02; import java.io.File; import java.io.IOException; import java.util.Arrays; /** * 测试IOUtils工具类 * @author Administrator * */ public class TestIOUtils { public static void main(String[] args) { File file = new File("data.dat"); try{ //将文件数据读取出来 byte[] data = IOUtils.loadBytes(file); //输出文件内容 System.out.println(Arrays.toString(data)); }catch(IOException e){ e.printStackTrace(); } } }
package day02; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * 测试文件输出流 * FileOutputStream * write(int d):写int值得低8位 * write(byte[] d):将d数组中所有字节写出 * write(byte[] d,int offset,int length); * 将d数组中offset位置开始写length个字节 * @author Administrator * */ public class DemoFileOutputStream { public static void main(String[] args) throws IOException { File file = new File("out.txt"); if(!file.exists()){ file.createNewFile(); } // FileOutputStream fos = new FileOutputStream(file); /** * FileOutputStream(File file,boolean append) * FileOutputStream(String filePath,boolean append) * append为true:会在当前文件末尾进行写操作 */ FileOutputStream fos = new FileOutputStream(file,true); String info = "你好!输出流!"; byte[] data = info.getBytes("UTF-8"); fos.write(data);//将字符串转换的字节写出 fos.close(); } }
BufferedInputStream:缓冲字节输入流
BufferedOutputStream:缓冲字节输出流
内部维护着一个缓冲区,可以提高读写效率,缓冲字节输入输出流是高级流。
辨别高级流的简单方法:
看构造方法,若构造方法要求传入另一个流,那么这个流就是个高级流。
package day02; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * IO工具类 * * @author Administrator * */ public class IOUtils { /** * 数据源 DataSource 将给定数组写入给定文件中 * * @param src * @param data * @throws IOException */ public static void saveBytes(File src, byte[] data) throws IOException { if (src == null) { throw new IllegalArgumentException("文件为空!"); } // 创建文件输出流 FileOutputStream fos = null; try { fos = new FileOutputStream(src); fos.write(data); } catch (IOException e) { throw e; } finally { if (fos != null) { fos.close(); } } } /** * 将src文件复制保存到des文件 * * @param src * @param des * @throws IOException */ public static void copyFile(File src, File des) throws IOException { if (src == null) { throw new IllegalArgumentException("源文件为空!"); } if (!src.exists()) { throw new IllegalArgumentException("源文件不存在!"); } FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(src); fos = new FileOutputStream(des); int data = -1; while ((data = fis.read()) != -1) { fos.write(data); } } catch (IOException e) { throw e; } finally { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } } /** * 使用缓冲流进行文件拷贝 * * @param src * @param des * @throws IOException */ public static void copyFile2(File src, File des) throws IOException { if (src == null) { throw new IllegalArgumentException("源文件为空"); } if (!src.exists()) { throw new IllegalArgumentException("源文件不存在"); } /** * 创建缓冲流 自动导包快捷键:ctrl+shift+o */ BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream(src)); bos = new BufferedOutputStream(new FileOutputStream(des)); int data = -1; while ((data = bis.read()) != -1) { bos.write(data); } /** * flush的作用是将缓冲区中未写出的数据一次性写出 */ bos.flush();//数据都写完后应该flush } catch (IOException e) { throw e; } finally { if (bis != null) { /** * 通常情况下,我们只需要关闭最外层的流 */ bis.close(); } if (bos != null) { bos.close(); } } } /** * 读取给定的文件,并将数据已字节数组的形式返回 * * @param src * @return * @throws IOException */ public static byte[] loadBytes(File src) throws IOException { if (src == null) { throw new IllegalArgumentException("文件为空!"); } if (!src.exists()) { throw new IllegalArgumentException(src + "不存在!"); } FileInputStream fis = null;// 创建文件输入流 try { fis = new FileInputStream(src); // byte[] data = new byte[(int)src.length()]; /** * FileInputStream的available()方法: 返回当前字节输入流可读取的总字节数 */ byte[] data = new byte[fis.available()]; fis.read(data); return data; } catch (IOException e) { throw e;// 读取出现错误将异常抛给调用者解决 } finally { if (fis != null) { fis.close(); } } } }
package day02; import java.io.File; import java.io.IOException; import java.util.Arrays; /** * 测试IOUtils工具类 * @author Administrator * */ public class TestIOUtils { public static void main(String[] args) { File file = new File("data.dat"); try{ // //将文件数据读取出来 // byte[] data = IOUtils.loadBytes(file); // // //输出文件内容 // System.out.println(Arrays.toString(data)); // File des = new File("abc.dat");//该文件在磁盘上不存在 // IOUtils.saveBytes(des,data); File src = new File("1.zip"); File des = new File("11.zip"); IOUtils.copyFile2(src,des); }catch(IOException e){ e.printStackTrace(); } } }
DataInputStream:可以直接读取基本类型数据的流。
DataOutputStream:可以直接写基本数据的流,简化了对基本类型数据的读写操作。
DIS:int readInt():连续读取4个字节,返回该int值。
doutble readDouble():连续读取8个字节,返回double值。
String readUTF():
DOS:
writeInt(int i):
writeLong(long i):
writeUTF(String s):