Java 字节流/字符流学习体验

1、Java字节流分为InputStream和OutputStream。InputStream建立从源端(文件,网络服务器等)到内存(程序运行的地方)的字节流。OutputStream建立从内存到源端的字节流。InputStream生成一个实例后,将源端的信息编码成有序字节流,可通过read()等方法访问这个字节流。OutputStream生成一个实例后,会通过write()方法等将想要输入的信息传送给源端。

2、FileInputStream和FileOutputStream建立文件(各种类型的文件,txt,json,mp3,jpg等)与内存之间的字节流,在内存中以字节流的形式显示,如果将一个文件的完整字节流通过字节输出流输送到一个空的同类型的文件,可以得到一个功能正常的和原文件相同的文件。

3、建立TCP连接时,书上例子服务端使用的输入流是BufferedReader(new InputStreamReader(socket.getInputStream()));客户端输出流使用的是PrintWriter(socket.getOutputStream(),true);但客户端输出流也可以使用BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),但使用这种输出流时需注意2点:其一是要在输出字段后面加上"\n",否则当输入流读取客户端输出的字段时,由于没有"\n"作为标记,导致输入流使用readLine()方法读不出数据。其他方法不能一次性完成字节流转换成字符流,较麻烦;其二,每使用一次write()方法后,都要使用flush()方法释放缓存,使其发送出去,否则需要等到输出流缓存存满后才一次性释放,缓存一般较大,不能满足即时发送较小流的要求(暂不知在TCP连接中如何设置缓存大小)。但是,使用PrintWriter(socket.getOutputStream(),true)读取输入流时,没有上述两项问题,原因暂不明(也许是PrintWriter类的readLine()方法内部处理的差异)。

4、在TCP程序中,发送端使用OutputStream,接收端使用BufferedReader同样可以完成连接,当然OutputStream需要在每次传输的最后加上"\n",并且使用flush()方法释放缓存。

5、TCP程序的收发端同样可以使用原始的OutputStream和InputStream,此时需要先将要发送的信息转换成byte数组的形式,通过OutputStream发送。由于不能设定缓冲区大小,同样需要使用flush即时刷新缓冲区,但由于socket.getInputStream生成的InputStream没有ReadLine()方法,所以不必在后面加上"\n",InputStream同样不能使用ReadAllBytes()方法,需要逐个字节或者逐个byte数组读取信息。

6、由socket.getInputStream生成的InputStream使用read()(或其他类似方法)方法时,若返回值为-1,则进程会一直这个方法停留,否则,read()(或其他类似方法)会读取设定的缓存大小的信息,并执行read()后面的进程。

7、BufferedReader的read()方法每次读取一个字符,返回的是字节的ASCII码值,可以通过(char)码值强制转换将码值转换为对应字符。

8、Java的TCP连接通俗过程:首先服务器建立一个ServerSocket(服务器套接字),指定与此服务器连接的端口,再用accept方法等待客户端的连接(如果没有客户端连接程序会阻塞在这里);另一方面,客户端建立一个Scoket,指定要访问的服务器地址和端口,一旦运行这个套接字,程序会在网络上找到指定地址和端口的服务器,此时服务器的accept收到连接请求,会生成一个与客户端Socket连接的Socket,用这两个Socket生成InputStream和OutputStream,就可以发送信息给对方了。

9、关于AWT包里面的JScrollPane,是否显示滚动条是查看它内部Component(JScrollPane只能容纳一个Component)的preferredSize数据,有的组件即时添加很多组件,其PreferredSize也是零,需要手动设置,才能让滚动条显示出来。典型的比如在JScrollPane中添加一个JPanel,在JPanel中添加JLabel,无论添加多少JLabel都无法使JPanel的PreferredSize改变,此时需要手动设置JPanel的PreferredSize才能显示滚动面板。

10、java序列化与反序列化。在java中如何在两个程序之间传递类实例呢?可以用序列化方法将类实例生成二进制序列,再使用ObjectOutputStream(OutputStream)发送,通过ObjectInputStream(InputStream)接受成Object,再向下转型成为相应的类即可。

11、java的JFrame刷新方法:JFrame生成以后,如果面板有改动,JFrame默认是不会改变的,这时使用invalidate()方法,使面板无效化,再用setvisiable(true),即可使面板刷新到最新状态,且此方法同样改变frame的子面板的状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值