为了账号安全,请及时绑定邮箱和手机立即绑定

文件传输基础——Java IO流

难度入门
时长 2小时 0分
学习人数
综合评分9.67
669人评价 查看评价
9.9 内容实用
9.6 简洁易懂
9.5 逻辑清晰
  • public static void main(String[] args)throws IOException { FileInputStream in = new FileInputStream("e:\\javaio\\imoocutf8.txt"); InputStreamReader isr = new InputStreamReader(in,"utf-8");//默认项目的编码,操作的时候,要写文件本身的编码格式 FileOutputStream out = new FileOutputStream("e:\\javaio\\imoocutf81.txt"); OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8"); /*int c ; while((c = isr.read())!=-1){ System.out.print((char)c); }*/ char[] buffer = new char[8*1024]; int c; /*批量读取,放入buffer这个字符数组,从第0个位置开始放置,最多放buffer.length个 返回的是读到的字符的个数 */ while(( c = isr.read(buffer,0,buffer.length))!=-1){ String s = new String(buffer,0,c); System.out.print(s); osw.write(buffer,0,c); osw.flush(); } isr.close(); osw.close(); }
    查看全部
  • IO流(输入流、输出流) 1、字节流 1)InputStream抽象了应用程序读取数据的方式; OutputStream抽象了应用程序写出数据的方式; 2)EOF=End 读到-1就读到结尾; 3)输入流基本方法: int b=in.read();//读取一个字节无符号填充到int低八位,-1是EOF in.read(byte[] buf); in.read(byte[] buf,int start,int size) 4)输出流基本方法 out.write(int b); //写出一个byte到流,b的低八位 out.write(byte[] buf);//将buf字节数组都写入到流 out.write(byte[] buf,int start,int size)
    查看全部
  • transient 关键字:被transient修饰的元素,该元素不会进行jvm默认的序列化,但可以自己完成这个元素的序列化 注意:(1)在以后的网络编程中,如果有某些元素不需要传输,那就可以用transient修饰,来节省流量;对有效元素序列化,提高性能。 (2)可以使用writeObject自己完成这个元素的序列化。ArrayList就是用了此方法进行了优化操作。ArrayList最核心的容器Object[] elementData使用了transient修饰,但是在writeObject自己实现对elementData数组的序列化。只对数组中有效元素进行序列化。readObject与之类似。
    查看全部
  • 4)输出流基本方法 out.write(int b) 写出一个byte到流,b的低8位 out.write(byte[] buf)将buf字节数组都写入到流 out.write(byte[] buf,int start,int size)
    查看全部
  • IO流(输入流、输出流) 字节流、字符流 1.字节流 1)InputStream、OutputStream InputStream抽象了应用程序读取数据的方式 OutputStream抽象了应用程序写出数据的方式 2)EOF = End 读到-1就读到结尾 3)输入流基本方法 int b = in.read();读取一个字节无符号填充到int低八位.-1是 EOF in.read(byte[] buf) in.read(byte[] buf,int start,int size)
    查看全部
  • public static void main(String[] args) throws IOException { File demo = new File("demo"); if (!demo.exists()) demo.mkdir(); File file = new File(demo, "raf.dat"); if (!file.exists()) file.createNewFile(); RandomAccessFile raf = new RandomAccessFile(file, "rw"); // 指针的位置 System.out.println(raf.getFilePointer()); raf.write('A');// 只写了一个字节,並非整個char字符 System.out.println(raf.getFilePointer()); raf.write('B'); int i = 0x7fffffff; // 用write方法每次只能写一个字节,如果要把i写进去就得写4次 raf.write(i >>> 24);// 高8位 raf.write(i >>> 16); raf.write(i >>> 8); raf.write(i); System.out.println(raf.getFilePointer()); // 可以直接写一个int raf.writeInt(i); String s = "中"; byte[] gbk = s.getBytes("gbk"); raf.write(gbk); System.out.println(raf.length()); // 读文件,必须把指针移到头部 raf.seek(0); // 一次性读取,把文件中的内容都读到字节数组中 byte[] buf = new byte[(int) raf.length()];// raf.length()返回一個long型 raf.read(buf); System.out.println(Arrays.toString(buf)); for (byte b : buf) { System.out.println(Integer.toHexString(b & 0xff) + " "); } raf.close(); }
    查看全部
  • transient 关键字<br> private transient int stuage;<br> 关键字之后jvm就不会再去默认的序列化 stuage 属性,但并不是说就不能序列化了,这时可以手动的序列化<br> //手动实现序列化<br> private void writeObject(java.io.ObjectOutputStream s)<br> throws java.io.IOException<br> {<br> s.defaultWriteObject(); //能默认序列化 的 就先默认序列化<br> s.writeInt(stuage); //序列化一个用transient修饰的属性<br> }<br> //手动实现反序列化<br> private void readObject(java.io.ObjectInputStream s)<br> throws java.io.IOException, ClassNotFoundException<br> {<br> s.defaultReadObject(); //把虚拟机能默认的放序列化元素反序列化<br> this.stuage = s.readInt(); //手动完成 stuage (被transient修饰的属性)<br> <br> }<br> 上面的方签名是记不住,可以随便写一个实现了上面方法的类,比如ArrayList,选中之,F3即可查看源码,ctrl F 即可查找到,复制出来就能直接使用 是不是努着没事找事,明明可以默认序列化,为什么还要手动序列化,倒弄一圈这不是自找麻烦吗,使用Student这个例子是看不出来的,最好还是打开ArrayList的源码来看看。 ArrayList中疯转了对数组的操作,其内部就是有一个数组,数组里面是可以有很多的元素的,一个数组,即便是没有存满元素,但是每一个数组元素也会有一个默认的值。如果使用jvm的默认序列化的话,这样将会把数组中那些带有默认值的元素也一块序列化,这样不是就浪费了。如果可以自己手动序列化的话,我就可以有选择的型的序列化,只把数组中存储的元素序列化,别的空数组元素则不需要序列化。
    查看全部
  • * 下面是一个写入中文字符 或者说是中文字符串的常规 * 1、生命字符串 ,并准备好 字符串的内容 * 2、以制定编码方式 获取字符串的 字节码 存储到字节数组中 * 3、写入字节码 */ String s = "我是中国人"; byte[] gbk = s.getBytes("gbk"); for (byte b : gbk) { raf.write(b); } System.out.println("当前文件指针位置: "+raf.getFilePointer()); System.out.println("文件长度: "+ raf.length());
    查看全部
  • System.out.println(Integer.toHexString(b & 0xff)); 把byte型的 b 转换成 int型 兵役十六进制的字符串显示出来。byte原始8bit,转换成int型之后,高位补充24个0, 显示起来不好看,就着去第八位有用的 & 0ff 再以十六进制显示. 转换成字节编码 用的是 项目的默认编码 查看 默认的编码 窗口/首选项/常规/工作空间/文件编码.eclipse默认选择操作系统的编码发誓,windows一般是gbk编码,要想然软件金达限度的支持中文,可以选择utf-8编码,英文单字节 byte[] byte2 = s.getBytes("gbk");指定获取字符串的gbk编码 通过实验可以看出 gbk编码中汉字占用 两个字节, 英文单字节 指定获取 utf-8编码中汉字占用3个字节,英文字母单字节 java 中的编码采用 utf-16be编码 实验可以看到,utf-16be中中英文都是占用两个字节 注意当字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要使用这种编码方式,否则出现乱码 byte [] byte4 = s.getBytes("utf-16be"); .... String str1 = new String(byte4, "utf-18be");这样输出str1时,就能直接输出相应的字符串 /** * 小总结 * 文本文件里卖年就是字节序列,而且可以是任意编码的字节文件 * 如果在中机器上穿件文件,那么机器只认识ansi编码 */ 在eclipe中我们穿件一个项目是,可以右键属性,更改项目的编码方式,一旦指定了一种编码方式,那么这个项目就只认识指定编码格式的 文件,将一个编码方式项目下的文档考到另一个编码方式为项目下,这是会看到出现乱码,但是无论那种编码方式项目下的文件拷贝到,windows资源管理的任意位置,都能正常显示,这是windows。因为他能识别任何编码方式的文件。另一种情况是,把一种字节编码方式的文件总的,文件内容直接拷贝,粘贴到另一种编码方式的字节文件中,能够正常显示,这个过程可以进行自动的编码转换。 为什么要清楚不同编码方式的中英文字符所占的字节数。因为后期,比如读写一个utf-8的文件,你就知道必须读三个字节才能读出一个中文字符
    查看全部
    1 采集 收起 来源:文件的编码

    2018-03-22

  • 字符流1
    查看全部
  • transient 关键字:被transient修饰的元素,该元素不会进行jvm默认的序列化,但可以自己完成这个元素的序列化 注意:(1)在以后的网络编程中,如果有某些元素不需要传输,那就可以用transient修饰,来节省流量;对有效元素序列化,提高性能。 (2)可以使用writeObject自己完成这个元素的序列化。ArrayList就是用了此方法进行了优化操作。ArrayList最核心的容器Object[] elementData使用了transient修饰,但是在writeObject自己实现对elementData数组的序列化。只对数组中有效元素进行序列化。readObject与之类似。
    查看全部
  • FileReader,FileWrite是继承于InputStreamReader,OutputStreamWrite的. FileReader/FileWriter可以直接写文件名的路径。与InputStreamReader相比坏处:无法指定读取和写出的编码,容易出现乱码。只能读取与项目编码方式相同的文件 FileReader,FileWrite的构造函数是一个file类就可以 FileReader a=new FileReader(new File("E\\java\\text.txt")); FileWriter a=new FileWriter(new File("E\\java\\text.txt"),true); //如果为true则追加 InputStreamReader的构造函数则是inputStream的,所以参数用FileInputStream的对象 InputStreamReader a=new InputStreamReader(new FileInputStream("E\\java\\text.txt")); FileWrite中每write()一次就要用flush()方法来刷新该流缓冲.
    查看全部
  • 1.对象的序列化,就是将Object对象转换成byte序列 反之,叫对象的反序列化 2.序列化流ObjectOutputStream是过滤流---writeObject 反序列化流ObjectInputStream-----readObject 3.序列化接口,Serializable,对象必须实现序列化接口才能实现序列化,这个接口没有任何方法,只是一个标准
    查看全部
  • String s="慕课ABC"; byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是项目默认的编码 for(byte b: bytes1) System.out.println(Integer.toHexString(b & 0xff)+" ");// & 0xff是为了把前面的24个0去掉只留下后八位 //toHexString这个函数是把字节(转换成了Int)以16进制的方式显示
    查看全部
    1 采集 收起 来源:文件的编码

    2018-03-22

  • 序列化过程中子父类构造函数调用问题 一个类实现了序列化接口,那么其子类都可以进行序列化 一、父类实现了serializable接口,子类继承就可序列化。 1、子类在反序列化时,父类实现了序列化接口,则不会递归调用其构造函数。 二、父类未实现serializable接口,子类自行实现可序列化 2、子类在反序列化时,父类没有实现序列化接口,则会递归调用其构造函数。 【反序列化时】,向上递归调用构造函数会从【可序列化的一级父类结束】。即谁实现了可序列化(包括继承实现的),谁的构造函数就不会调用。 父类实现了serializable接口,子类继承就可序列化。 1、子类在反序列化时,其父类实现了序列化接口,则不会递归调用他们的构造函数。 2、若父类没有实现serializable接口,其子类自行实现反序列化,递归调用其构造函数 结论:反序列化时,谁实现了可序列化(包括继承实现的),谁的构造函数就不会调用。
    查看全部

举报

0/150
提交
取消
课程须知
亲,为了更好的学习本门课程,需要您对二进制的知识有所了解,还要熟悉Java的基本语法和面向对象的知识。
老师告诉你能学到什么?
1、了解文件编码。 2、能够对文件和目录进行管理操作。 3、能够应用字节流和字符流对文件进行读写操作。 4、能够对对象进行序列化和反序列化。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!