-
字节流之文件输入流FileInputStream、输出流FileOutputStream简介 II 7)DataOutputStream/DataInputStream 对"流"功能的扩展,可以更加方面的读取int,long,字符等类型数据 DataOutputStream writeInt()/writeDouble()/.../writeUTF()【采用utf-8编码写出】/writeChars()【采用utf-16be编码写出】 DataInputStream readLong()/.../readUTF() 8)BufferedInputStream&BufferedOutputStream 这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入 或读取操作时,都会加上缓冲,这种流模式提高了IO的性能 从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中: FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去 DataOutputStream--->writeXxx()方法 或 FileOutputStream--->write()“包装(批量)”方法会方便一些,相当于一瓢一瓢把水“转移”过去 BufferedOutputStream--->write()方法更方便,相当于一瓢一瓢先放入桶(缓冲区)中,再从桶中倒入到另一个缸中,性能提高了 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
对于文件,单个转移/批量转移(Best)/批量临时包装再转移...比较效率 public static void main(String[] args) { // TODO Auto-generated method stub try { long start = System.currentTimeMillis(); /*IOUtil.copyFileByByte(new File("e:\\javaio\\1.mp3"), new File( "e:\\javaio\\2.mp3"));*/ //两万多毫秒【单个+转移】 /*IOUtil.copyFileByBuffer(new File("e:\\javaio\\1.mp3"), new File( "e:\\javaio\\3.mp3"));//一万多毫秒【批量+临时桶+转移】*/ IOUtil.copyFile(new File("e:\\javaio\\1.mp3"), new File( "e:\\javaio\\4.mp3"));//7毫秒【批量转移】 long end = System.currentTimeMillis(); System.out.println(end - start ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
BufferedInputStream/BufferedOutputStream操作 I /** * 进行文件的拷贝,利用带缓冲的字节流 * @param srcFile * @param destFile * @throws IOException */ public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } BufferedInputStream bis = new BufferedInputStream( new FileInputStream(srcFile)); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(destFile)); int c ; while((c = bis.read())!=-1){//非单个字节读取,一次性读一定的内容(填满缓冲区大小为止,默认8M大小) bos.write(c); bos.flush();//刷新缓冲区,一定要写,否则写入不进去;Ps:读取的时候无需flush,写入的时候最好要或有些地方一定要flush。 } bis.close(); bos.close(); } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
字节流之文件输入流FileOutputStream操作 III /** * 单字节,不带缓冲进行文件拷贝 * @param srcFile * @param destFile * @throws IOException */ public static void copyFileByByte(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); int c ; while((c = in.read())!=-1){ out.write(c); out.flush(); } in.close(); out.close(); } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
DataOutputStream/DataInputStream操作 I public static void main(String[] args) throws IOException { String file = "demo/dos.dat"; DataOutputStream dos = new DataOutputStream( new FileOutputStream(file)); dos.writeInt(10); dos.writeInt(-10); dos.writeLong(10l); dos.writeDouble(10.5); //采用utf-8编码写出 dos.writeUTF("中国"); //采用utf-16be编码写出 dos.writeChars("中国"); dos.close(); IOUtil.printHex(file); } public static void main(String[] args) throws IOException{ // TODO Auto-generated method stub String file = "demo/dos.dat"; IOUtil.printHex(file); DataInputStream dis = new DataInputStream( new FileInputStream(file)); int i = dis.readInt(); System.out.println(i); i = dis.readInt(); System.out.println(i); long l = dis.readLong(); System.out.println(l); double d = dis.readDouble(); System.out.println(d); String s = dis.readUTF(); System.out.println(s); dis.close(); }查看全部
-
DataOutputStream/DataInputStream操作 I public static void main(String[] args) throws IOException { String file = "demo/dos.dat"; DataOutputStream dos = new DataOutputStream( new FileOutputStream(file)); dos.writeInt(10); dos.writeInt(-10); dos.writeLong(10l); dos.writeDouble(10.5); //采用utf-8编码写出 dos.writeUTF("中国"); //采用utf-16be编码写出 dos.writeChars("中国"); dos.close(); IOUtil.printHex(file); } public static void main(String[] args) throws IOException{ // TODO Auto-generated method stub String file = "demo/dos.dat"; IOUtil.printHex(file); DataInputStream dis = new DataInputStream( new FileInputStream(file)); int i = dis.readInt(); System.out.println(i); i = dis.readInt(); System.out.println(i); long l = dis.readLong(); System.out.println(l); double d = dis.readDouble(); System.out.println(d); String s = dis.readUTF(); System.out.println(s); dis.close(); }查看全部
-
IO流:输入、输出查看全部
-
字节流之文件输入流FileOutputStream操作 II /** * 文件拷贝,字节批量读取 * @param srcFile//源文件 * @param destFile//因为目标文件不存在则会自动创建,所以无需if判断 * @throws IOException */ public static void copyFile(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); byte[] buf = new byte[8*1024]; int b ; while((b = in.read(buf,0,buf.length))!=-1){ out.write(buf,0,b); out.flush();//最好加上(也可以不写);刷新此输出流并强制写出所有缓冲的输出字节。 } in.close(); out.close(); } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
字节流之文件输入流FileOutputStream操作 I public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //如果该文件不存在,则直接创建,如果存在,删除后创建 FileOutputStream out = new FileOutputStream("demo/out.dat"); //如果该文件不存在,则直接创建,如果存在,在该文件后追加内容 //FileOutputStream out = new FileOutputStream("demo/out.dat",true); out.write('A');//写出了'A'的低八位 out.write('B');//写出了'B'的低八位 int a = 10;//write只能写八位,那么写一个int需要些4次每次8位 out.write(a >>> 24); out.write(a >>> 16); out.write(a >>> 8); out.write(a); byte[] gbk = "中国".getBytes("gbk");//如果平台本身就是gbk编码方式,则可以省略转换,最好还是写上,因为移植的时候就无需担心出现乱码情况。 out.write(gbk); out.close(); IOUtil.printHex("demo/out.dat"); } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
小技巧:如果要对操作进行效率对比,则可以用时间函数来进行做差比较。 代码如下: long start = System.currentTimeMillis(); ... long end = System.currentTimeMillis(); System.out.println(end - start);//单位:ms 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
字节流之文件输入流FileInputStream操作 II /** * 批量读取,对大文件而言效率高,也是我们最常用的读文件的方式【重点】 * @param fileName * @throws IOException */ public static void printHexByByteArray(String fileName)throws IOException{ FileInputStream in = new FileInputStream(fileName); byte[] buf = new byte[8 * 1024]; /*从in中批量读取字节,放入到buf这个字节数组中, * 从第0个位置开始放,最多放buf.length个 * 返回的是读到的字节的个数 */ /*int bytes = in.read(buf,0,buf.length);//一次性读完,说明字节数组足够大 int j = 1; for(int i = 0; i < bytes;i++){//注意这不用buf.length是因为可能数组内存不够大,所以定为有效长度。 System.out.print(Integer.toHexString(buf[i] & 0xff)+" "); if(j++%10==0){ System.out.println(); } }*/ Ps:当字节数组不够大,一次性读不完文件时怎么办? int bytes = 0; int j = 1; while((bytes = in.read(buf,0,buf.length))!=-1){ for(int i = 0 ; i < bytes;i++){ System.out.print(Integer.toHexString(buf[i] & 0xff)+" "); if(j++%10==0){ System.out.println(); } } } in.close(); } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
字节流之文件输入流FileInputStream操作 I /** * 读取指定文件内容,按照16进制输出到控制台 * 并且每输出10个byte换行 * @param fileName * 单字节读取不适合大文件,大文件效率很低【重点】 */ public static void printHex(String fileName)throws IOException{ //把文件作为字节流进行读操作 FileInputStream in = new FileInputStream(fileName); int b ; int i = 1; while((b = in.read())!=-1){ if(b <= 0xf){ //单位数前面补0 System.out.print("0"); } System.out.print(Integer.toHexString(b)+" "); if(i++%10==0){ System.out.println(); } } in.close(); } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
字节流之文件输入流FileInputStream、输出流FileOutputStream简介 I IO流(输入流、输出流) 字节流、字符流 1.字节流 1)InputStream、OutputStream InputStream抽象了应用程序读取数据的方式 OutputStream抽象了应用程序写出数据的方式 2)EOF = End 读到-1就读到结尾 3)输入流基本方法 int b = in.read()//读取一个字节无符号填充到int低八位.-1是 EOF in.read(byte[] buf)//读取数据填充到字节数组buf in.read(byte[] buf,int start,int size)//读取数据到字节数组buf,从buf的start位置开始存放size长度的数据 4)输出流基本方法 out.write(int b)//写出一个byte到流,b的低8位 out.write(byte[] buf)//将buf字节数组都写入到流 out.write(byte[] buf,int start,int size)//字节数组buf从start位置开始写size长度的字节到流 5)FileInputStream--->extends InputStream,具体实现了在文件上读取数据 6)FileOutputStream--->extends OutputStream,实现了向文件中写出byte数据的方法 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
RandomAccessFile基本读写操作 File demo=new File("demo"); File file=new File(demo,"raf.dat"); Ps:如果没写绝对路径,则表示相对路径(在当前项目下)。 RandomAccessFile raf = new RandomAccessFile(file, "rw"); //指针的位置 System.out.println(raf.getFilePointer());//0 raf.write('A');//只写了一个字节(起始地址,8bit),可能是半个'A',可能是整个'A',取决于当前平台的编码。 System.out.println(raf.getFilePointer());//1 raf.write('B');//指针已经跳到2 int i = 0x7fffffff;//2147483648 //用write方法每次只能写一个字节,如果要把i写进去就得写4次 raf.write(i >>> 24);//高8位 raf.write(i >>> 16); raf.write(i >>> 8); raf.write(i); System.out.println(raf.getFilePointer());//6 //可以直接写一个int raf.writeInt(i); String s = "中"; byte[] gbk = s.getBytes("gbk"); raf.write(gbk);//可以直接写一个字符数组,在这里一次性写了2个字节 System.out.println(raf.length());//12=2+4+4+1+1 //读文件,必须把指针移到头部 raf.seek(0); //一次性读取,把文件中的内容都读到字节数组中 byte[] buf = new byte[(int)raf.length()]; raf.read(buf); System.out.println(Arrays.toString(buf)); raf.close();//千万别忘了关闭,否则可能会抛出异常查看全部
-
RandomAccessFile简介 RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件。 RandomAccessFile支持随机访问文件,可以访问文件的任意位置。 (1)java文件模型 在硬盘上的文件是byte byte byte存储的,是数据的集合 (2)打开文件 有两种模式"rw"(读写) "r"(只读) RandomAccessFile raf = new RandomeAccessFile(file,"rw") 文件指针,打开文件时指针在开头 pointer = 0; (3)写方法 raf.write(int)--->只写一个字节(后8位),同时指针指向下一个位置,准备再次写入 (4)读方法 int b = raf.read()--->读一个字节 (5)文件读写完成以后一定要关闭(Oracle官方说明) 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
举报
0/150
提交
取消