IO读写

InputStream、OutputStream 基于字节操作的 IO

InputStream基本使用:

InputStream inputStream = new FileInputStream("D:\\log.txt");
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
String str = new String(bytes, "utf-8");
System.out.println(str);
inputStream.close();

OutputStream基本使用:

OutputStream outputStream = new FileOutputStream("D:\\log.txt",true); // 参数二,表示是否追加,true=追加
outputStream.write("你好,老王".getBytes("utf-8"));
outputStream.close();

Writer、Reader 基于字符操作的 IO

Reader使用:

Reader reader = new FileReader(filePath);
BufferedReader bufferedReader = new BufferedReader(reader);
StringBuffer bf = new StringBuffer();
String str;
while ((str = bufferedReader.readLine()) != null) {
    bf.append(str + "\n");
}
bufferedReader.close();
reader.close();
System.out.println(bf.toString());

Writer使用:

Writer writer = new FileWriter("D:\\log.txt",true); // 参数二,是否追加文件,true=追加
writer.append("老王,你好");
writer.close();

File 基于磁盘操作的 IO

字节流的文件包括图片,音乐,文本等

        File fin = new File(inPath);    
        File out = new File(outPath);        
        FileInputStream is = new FileOutputStream(out);
        FileOutputStream os= new FileInputStream(fin);
        byte[] bytes = new byte[512];
        int n = 0;
        while ((n = is.read(bytes)) != -1) {
            os.write(bytes);
        }
        is.close();
        os.close();

字符流文件主要是文本文件

        File fin = new File(inPath);    
        File out = new File(outPath);        
        FileReader is = new FileReader(fin);
        FileWriter os= new FileWriter(out);
        char []a = new char[1024];
        int n = 0;
        while ((n = is.read(a)) != -1) {
            os.write(a,0,n);
        }
        is.close();
        os.close();

Socket 基于网络操作的 IO

参考:

http://www.apigo.cn/2018/11/09/javacore5/

关于readLine()阻塞的问题:

误以为readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null;因为readLine()阻塞后,System.out.println(message)这句根本就不会执行到,所以在接收端就不会有东西输出。要想执行到System.out.println(message),一个办法是发送完数据后就关掉流,这样readLine()结束阻塞状态,而能够得到正确的结果,但显然不能传一行就关一次数据流;另外一个办法是把System.out.println(message)放到while循环体内就可以。
readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。
如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。

 

posted @ 2018-04-29 22:04  LeeJuly  阅读(152)  评论(0)    收藏  举报